mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +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