From 632f45448b85ca81dd9bf641e9aa9460cb823ff5 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 17 Dec 2017 00:36:53 +0800 Subject: [PATCH] http: add basic auth in client mode --- README.md | 4 ++-- dialer.go | 2 +- http.go | 13 ++++++++++++- mixed.go | 2 +- server.go | 2 +- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 693a1b1..e16be36 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ DNS Forwarding Server(udp2tcp): - Add resolved IPs to proxy rules - Add resolved IPs to ipset -Ipset Management: +IPSet Management: - Add ip/cidrs from rule files on startup - Add resolved ips for domains from rule files by dns forwarding server @@ -47,7 +47,7 @@ General: - Rule proxy based on destinations: [Config Examples](config/examples) TODO: -- [x] UDP over TCP Tunnel (client <-udp-> uottun <-tcp-> ss <-udp-> target) +- [x] UDP over TCP Tunnel (client <--udp--> glider/uottun <--tcp--> ss <--udp--> target) - [ ] Transparent UDP proxy (linux tproxy) - [ ] TUN/TAP device support - [ ] Code refactoring: support proxy registering so it can be pluggable diff --git a/dialer.go b/dialer.go index e6f091b..d792700 100644 --- a/dialer.go +++ b/dialer.go @@ -40,7 +40,7 @@ func DialerFromURL(s string, cDialer Dialer) (Dialer, error) { switch u.Scheme { case "http": - return NewHTTP(addr, cDialer, nil) + return NewHTTP(addr, user, pass, cDialer, nil) case "socks5": return NewSOCKS5(addr, user, pass, cDialer, nil) case "ss": diff --git a/http.go b/http.go index f8d4f8c..780939e 100644 --- a/http.go +++ b/http.go @@ -6,6 +6,7 @@ package main import ( "bufio" "bytes" + "encoding/base64" "errors" "fmt" "io" @@ -20,13 +21,18 @@ import ( type HTTP struct { *Forwarder // as client sDialer Dialer // dialer for server + + user string + password string } // NewHTTP returns a http proxy. -func NewHTTP(addr string, cDialer Dialer, sDialer Dialer) (*HTTP, error) { +func NewHTTP(addr, user, pass string, cDialer Dialer, sDialer Dialer) (*HTTP, error) { s := &HTTP{ Forwarder: NewForwarder(addr, cDialer), sDialer: sDialer, + user: user, + password: pass, } return s, nil @@ -186,6 +192,11 @@ func (s *HTTP) Dial(network, addr string) (net.Conn, error) { rc.Write([]byte("CONNECT " + addr + " HTTP/1.0\r\n")) // c.Write([]byte("Proxy-Connection: Keep-Alive\r\n")) + if s.user != "" && s.password != "" { + auth := s.user + ":" + s.password + rc.Write([]byte("Authorization: Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) + "\r\n")) + } + var b [1024]byte n, err := rc.Read(b[:]) if bytes.Contains(b[:n], []byte("200")) { diff --git a/mixed.go b/mixed.go index 4c44a7b..e952722 100644 --- a/mixed.go +++ b/mixed.go @@ -33,7 +33,7 @@ func NewMixedProxy(addr, user, pass string, sDialer Dialer) (*MixedProxy, error) addr: addr, } - p.http, _ = NewHTTP(addr, nil, sDialer) + p.http, _ = NewHTTP(addr, user, pass, nil, sDialer) p.socks5, _ = NewSOCKS5(addr, user, pass, nil, sDialer) return p, nil diff --git a/server.go b/server.go index a2c8581..e0a3907 100644 --- a/server.go +++ b/server.go @@ -40,7 +40,7 @@ func ServerFromURL(s string, sDialer Dialer) (Server, error) { case "mixed": return NewMixedProxy(addr, user, pass, sDialer) case "http": - return NewHTTP(addr, nil, sDialer) + return NewHTTP(addr, user, pass, nil, sDialer) case "socks5": return NewSOCKS5(addr, user, pass, nil, sDialer) case "ss":