fix proxy connection on http mode

This commit is contained in:
rui.zheng 2015-06-04 15:14:35 +08:00
parent 7dffd77cb8
commit 907f39a43d
4 changed files with 55 additions and 22 deletions

View File

@ -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

38
http.go
View File

@ -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
}
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
}

View File

@ -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

14
util.go
View File

@ -52,11 +52,7 @@ func ToSocksAddr(addr net.Addr) *gosocks5.Addr {
}
}
func Connect(addr, proxy string) (net.Conn, error) {
if !strings.Contains(addr, ":") {
addr += ":80"
}
if len(proxy) == 0 {
func Connect(addr string) (net.Conn, error) {
taddr, err := net.ResolveTCPAddr("tcp", addr)
if err != nil {
log.Println(err)
@ -65,6 +61,14 @@ func Connect(addr, proxy string) (net.Conn, error) {
return net.DialTCP("tcp", nil, taddr)
}
func ConnectProxy(addr, proxy string) (net.Conn, error) {
if !strings.Contains(addr, ":") {
addr += ":80"
}
if len(proxy) == 0 {
return Connect(addr)
}
paddr, err := net.ResolveTCPAddr("tcp", proxy)
if err != nil {
return nil, err