mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +08:00 
			
		
		
		
	http: add param to send 'X-Forwarded-For' header. #18
This commit is contained in:
		
							parent
							
								
									4670c9931e
								
							
						
					
					
						commit
						950ed2b426
					
				@ -43,7 +43,7 @@ func DialerFromURL(s string, cDialer Dialer) (Dialer, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	switch u.Scheme {
 | 
						switch u.Scheme {
 | 
				
			||||||
	case "http":
 | 
						case "http":
 | 
				
			||||||
		return NewHTTP(addr, user, pass, cDialer, nil)
 | 
							return NewHTTP(addr, user, pass, "", cDialer, nil)
 | 
				
			||||||
	case "socks5":
 | 
						case "socks5":
 | 
				
			||||||
		return NewSOCKS5(addr, user, pass, cDialer, nil)
 | 
							return NewSOCKS5(addr, user, pass, cDialer, nil)
 | 
				
			||||||
	case "ss":
 | 
						case "ss":
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								http.go
									
									
									
									
									
								
							@ -24,15 +24,27 @@ type HTTP struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	user     string
 | 
						user     string
 | 
				
			||||||
	password string
 | 
						password string
 | 
				
			||||||
 | 
						xff      bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						selfip string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewHTTP returns a http proxy.
 | 
					// NewHTTP returns a http proxy.
 | 
				
			||||||
func NewHTTP(addr, user, pass string, cDialer Dialer, sDialer Dialer) (*HTTP, error) {
 | 
					func NewHTTP(addr, user, pass, rawQuery string, cDialer Dialer, sDialer Dialer) (*HTTP, error) {
 | 
				
			||||||
	s := &HTTP{
 | 
						s := &HTTP{
 | 
				
			||||||
		Forwarder: NewForwarder(addr, cDialer),
 | 
							Forwarder: NewForwarder(addr, cDialer),
 | 
				
			||||||
		sDialer:   sDialer,
 | 
							sDialer:   sDialer,
 | 
				
			||||||
		user:      user,
 | 
							user:      user,
 | 
				
			||||||
		password:  pass,
 | 
							password:  pass,
 | 
				
			||||||
 | 
							xff:       false,
 | 
				
			||||||
 | 
							selfip:    OutboundIP().String(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p, _ := url.ParseQuery(rawQuery)
 | 
				
			||||||
 | 
						if v, ok := p["xff"]; ok {
 | 
				
			||||||
 | 
							if v[0] == "true" {
 | 
				
			||||||
 | 
								s.xff = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return s, nil
 | 
						return s, nil
 | 
				
			||||||
@ -89,6 +101,16 @@ func (s *HTTP) Serve(c net.Conn) {
 | 
				
			|||||||
	// tell the remote server not to keep alive
 | 
						// tell the remote server not to keep alive
 | 
				
			||||||
	reqHeader.Set("Connection", "close")
 | 
						reqHeader.Set("Connection", "close")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// X-Forwarded-For
 | 
				
			||||||
 | 
						if s.xff {
 | 
				
			||||||
 | 
							if reqHeader.Get("") != "" {
 | 
				
			||||||
 | 
								reqHeader.Add("X-Forwarded-For", ",")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							reqHeader.Add("X-Forwarded-For", c.RemoteAddr().(*net.TCPAddr).IP.String())
 | 
				
			||||||
 | 
							reqHeader.Add("X-Forwarded-For", ",")
 | 
				
			||||||
 | 
							reqHeader.Add("X-Forwarded-For", s.selfip)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	url, err := url.ParseRequestURI(requestURI)
 | 
						url, err := url.ParseRequestURI(requestURI)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		logf("parse request url error: %s", err)
 | 
							logf("parse request url error: %s", err)
 | 
				
			||||||
@ -211,12 +233,12 @@ func (s *HTTP) Dial(network, addr string) (net.Conn, error) {
 | 
				
			|||||||
		logf("proxy-http 'CONNECT' method not allowed by proxy %s", s.addr)
 | 
							logf("proxy-http 'CONNECT' method not allowed by proxy %s", s.addr)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil, errors.New("cound not connect remote address: " + addr + ". error code: " + code)
 | 
						return nil, errors.New("proxy-http cound not connect remote address: " + addr + ". error code: " + code)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DialUDP .
 | 
					// DialUDP .
 | 
				
			||||||
func (s *HTTP) DialUDP(network, addr string) (net.PacketConn, error) {
 | 
					func (s *HTTP) DialUDP(network, addr string) (net.PacketConn, error) {
 | 
				
			||||||
	return nil, errors.New("udp not supported by http proxy now")
 | 
						return nil, errors.New("proxy-http udp not supported by http proxy now")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// parseFirstLine parses "GET /foo HTTP/1.1" OR "HTTP/1.1 200 OK" into its three parts.
 | 
					// parseFirstLine parses "GET /foo HTTP/1.1" OR "HTTP/1.1 200 OK" into its three parts.
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								mixed.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mixed.go
									
									
									
									
									
								
							@ -27,13 +27,13 @@ type MixedProxy struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewMixedProxy returns a mixed proxy.
 | 
					// NewMixedProxy returns a mixed proxy.
 | 
				
			||||||
func NewMixedProxy(addr, user, pass string, sDialer Dialer) (*MixedProxy, error) {
 | 
					func NewMixedProxy(addr, user, pass, rawQuery string, sDialer Dialer) (*MixedProxy, error) {
 | 
				
			||||||
	p := &MixedProxy{
 | 
						p := &MixedProxy{
 | 
				
			||||||
		sDialer: sDialer,
 | 
							sDialer: sDialer,
 | 
				
			||||||
		addr:    addr,
 | 
							addr:    addr,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p.http, _ = NewHTTP(addr, user, pass, nil, sDialer)
 | 
						p.http, _ = NewHTTP(addr, user, pass, rawQuery, nil, sDialer)
 | 
				
			||||||
	p.socks5, _ = NewSOCKS5(addr, user, pass, nil, sDialer)
 | 
						p.socks5, _ = NewSOCKS5(addr, user, pass, nil, sDialer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return p, nil
 | 
						return p, nil
 | 
				
			||||||
 | 
				
			|||||||
@ -38,9 +38,9 @@ func ServerFromURL(s string, sDialer Dialer) (Server, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	switch u.Scheme {
 | 
						switch u.Scheme {
 | 
				
			||||||
	case "mixed":
 | 
						case "mixed":
 | 
				
			||||||
		return NewMixedProxy(addr, user, pass, sDialer)
 | 
							return NewMixedProxy(addr, user, pass, u.RawQuery, sDialer)
 | 
				
			||||||
	case "http":
 | 
						case "http":
 | 
				
			||||||
		return NewHTTP(addr, user, pass, nil, sDialer)
 | 
							return NewHTTP(addr, user, pass, u.RawQuery, nil, sDialer)
 | 
				
			||||||
	case "socks5":
 | 
						case "socks5":
 | 
				
			||||||
		return NewSOCKS5(addr, user, pass, nil, sDialer)
 | 
							return NewSOCKS5(addr, user, pass, nil, sDialer)
 | 
				
			||||||
	case "ss":
 | 
						case "ss":
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ func (s *UDPTun) ListenAndServe() {
 | 
				
			|||||||
			// TODO: check here, get the correct sDialer's addr
 | 
								// TODO: check here, get the correct sDialer's addr
 | 
				
			||||||
			sUDPAddr, err := net.ResolveUDPAddr("udp", s.sDialer.Addr())
 | 
								sUDPAddr, err := net.ResolveUDPAddr("udp", s.sDialer.Addr())
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				logf("proxy-udptun failed to ResolveUDPAddr %", s.sDialer.Addr())
 | 
									logf("proxy-udptun failed to ResolveUDPAddr %s", s.sDialer.Addr())
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user