diff --git a/client.go b/client.go index 5f98150..c3dd082 100644 --- a/client.go +++ b/client.go @@ -103,8 +103,19 @@ func cliHandle(conn net.Conn) { }() */ - //log.Println("connect:", Saddr) - c, err := Connect(Saddr, Proxy) + //log.Println("connect:", Saddr, Proxy) + var c net.Conn + var err error + + if !UseHttp { + c, err = ConnectProxy(Saddr, Proxy) + } else { + addr := Saddr + if len(Proxy) > 0 { + addr = Proxy + } + c, err = Connect(addr) + } if err != nil { log.Println(err) return diff --git a/http.go b/http.go index ca74ed1..65cbe09 100644 --- a/http.go +++ b/http.go @@ -31,18 +31,23 @@ func NewHttpClientConn(conn net.Conn) *HttpClientConn { } } -func (conn *HttpClientConn) Handshake() error { +func (conn *HttpClientConn) Handshake() (err error) { log.Println("remote", conn.c.RemoteAddr().String()) req := &http.Request{ Method: "Get", - Host: conn.c.RemoteAddr().String(), + Host: Saddr, URL: &url.URL{ Host: "ignored", Scheme: "http", Path: s2cUri, }, } - if err := req.Write(conn.c); err != nil { + if len(Proxy) == 0 { + err = req.Write(conn.c) + } else { + err = req.WriteProxy(conn.c) + } + if err != nil { return err } @@ -55,26 +60,35 @@ func (conn *HttpClientConn) Handshake() error { if _, err = io.ReadFull(resp.Body, b); err != nil { return err } - log.Println("token", string(b)) + q := url.Values{} q.Set("token", string(b)) conn.url = &url.URL{ Scheme: "http", - Host: conn.c.RemoteAddr().String(), + Host: Saddr, Path: c2sUri, RawQuery: q.Encode(), } conn.r = resp.Body + log.Println(conn.url.String()) + return nil } func (conn *HttpClientConn) Read(b []byte) (n int, err error) { - return conn.r.Read(b) + n, err = conn.r.Read(b) + log.Println("http r:", n) + return } func (conn *HttpClientConn) Write(b []byte) (n int, err error) { - c, err := Connect(Saddr, Proxy) + var c net.Conn + if len(Proxy) == 0 { + c, err = Connect(Saddr) + } else { + c, err = Connect(Proxy) + } if err != nil { log.Println(err) return @@ -85,13 +99,16 @@ func (conn *HttpClientConn) Write(b []byte) (n int, err error) { log.Println(err) return } - - err = request.Write(c) + if len(Proxy) == 0 { + err = request.Write(c) + } else { + err = request.WriteProxy(c) + } if err != nil { log.Println(err) return } - + log.Println("http w:", len(b)) return len(b), nil } @@ -142,7 +159,7 @@ func (conn *HttpServerConn) Read(b []byte) (n int, err error) { n = copy(b, conn.rb) conn.rb = conn.rb[n:] - //log.Println("ws r:", n) + log.Println("http r:", n) return } @@ -152,6 +169,7 @@ func (conn *HttpServerConn) Write(b []byte) (n int, err error) { if f, ok := conn.w.(http.Flusher); ok { f.Flush() } + log.Println("http w:", n) return } diff --git a/socks5.go b/socks5.go index ffc1296..7259df2 100644 --- a/socks5.go +++ b/socks5.go @@ -175,8 +175,8 @@ func socks5Handle(conn net.Conn) { switch req.Cmd { case gosocks5.CmdConnect: - //log.Println("connect", req.Addr.String()) - tconn, err := Connect(req.Addr.String(), Proxy) + log.Println("connect", req.Addr.String()) + tconn, err := ConnectProxy(req.Addr.String(), Proxy) if err != nil { gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn) return diff --git a/util.go b/util.go index 075d129..c541a0c 100644 --- a/util.go +++ b/util.go @@ -52,17 +52,21 @@ func ToSocksAddr(addr net.Addr) *gosocks5.Addr { } } -func Connect(addr, proxy string) (net.Conn, error) { +func Connect(addr string) (net.Conn, error) { + taddr, err := net.ResolveTCPAddr("tcp", addr) + if err != nil { + log.Println(err) + return nil, err + } + return net.DialTCP("tcp", nil, taddr) +} + +func ConnectProxy(addr, proxy string) (net.Conn, error) { if !strings.Contains(addr, ":") { addr += ":80" } if len(proxy) == 0 { - taddr, err := net.ResolveTCPAddr("tcp", addr) - if err != nil { - log.Println(err) - return nil, err - } - return net.DialTCP("tcp", nil, taddr) + return Connect(addr) } paddr, err := net.ResolveTCPAddr("tcp", proxy)