fix proxy connection on http mode
This commit is contained in:
parent
7dffd77cb8
commit
907f39a43d
15
client.go
15
client.go
@ -103,8 +103,19 @@ func cliHandle(conn net.Conn) {
|
|||||||
}()
|
}()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//log.Println("connect:", Saddr)
|
//log.Println("connect:", Saddr, Proxy)
|
||||||
c, err := 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 {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
|
38
http.go
38
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())
|
log.Println("remote", conn.c.RemoteAddr().String())
|
||||||
req := &http.Request{
|
req := &http.Request{
|
||||||
Method: "Get",
|
Method: "Get",
|
||||||
Host: conn.c.RemoteAddr().String(),
|
Host: Saddr,
|
||||||
URL: &url.URL{
|
URL: &url.URL{
|
||||||
Host: "ignored",
|
Host: "ignored",
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Path: s2cUri,
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,26 +60,35 @@ func (conn *HttpClientConn) Handshake() error {
|
|||||||
if _, err = io.ReadFull(resp.Body, b); err != nil {
|
if _, err = io.ReadFull(resp.Body, b); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Println("token", string(b))
|
|
||||||
q := url.Values{}
|
q := url.Values{}
|
||||||
q.Set("token", string(b))
|
q.Set("token", string(b))
|
||||||
conn.url = &url.URL{
|
conn.url = &url.URL{
|
||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: conn.c.RemoteAddr().String(),
|
Host: Saddr,
|
||||||
Path: c2sUri,
|
Path: c2sUri,
|
||||||
RawQuery: q.Encode(),
|
RawQuery: q.Encode(),
|
||||||
}
|
}
|
||||||
conn.r = resp.Body
|
conn.r = resp.Body
|
||||||
|
|
||||||
|
log.Println(conn.url.String())
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (conn *HttpClientConn) Read(b []byte) (n int, err error) {
|
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) {
|
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 {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
@ -85,13 +99,16 @@ func (conn *HttpClientConn) Write(b []byte) (n int, err error) {
|
|||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if len(Proxy) == 0 {
|
||||||
err = request.Write(c)
|
err = request.Write(c)
|
||||||
|
} else {
|
||||||
|
err = request.WriteProxy(c)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Println("http w:", len(b))
|
||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +159,7 @@ func (conn *HttpServerConn) Read(b []byte) (n int, err error) {
|
|||||||
n = copy(b, conn.rb)
|
n = copy(b, conn.rb)
|
||||||
conn.rb = conn.rb[n:]
|
conn.rb = conn.rb[n:]
|
||||||
|
|
||||||
//log.Println("ws r:", n)
|
log.Println("http r:", n)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -152,6 +169,7 @@ func (conn *HttpServerConn) Write(b []byte) (n int, err error) {
|
|||||||
if f, ok := conn.w.(http.Flusher); ok {
|
if f, ok := conn.w.(http.Flusher); ok {
|
||||||
f.Flush()
|
f.Flush()
|
||||||
}
|
}
|
||||||
|
log.Println("http w:", n)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,8 +175,8 @@ func socks5Handle(conn net.Conn) {
|
|||||||
|
|
||||||
switch req.Cmd {
|
switch req.Cmd {
|
||||||
case gosocks5.CmdConnect:
|
case gosocks5.CmdConnect:
|
||||||
//log.Println("connect", req.Addr.String())
|
log.Println("connect", req.Addr.String())
|
||||||
tconn, err := Connect(req.Addr.String(), Proxy)
|
tconn, err := ConnectProxy(req.Addr.String(), Proxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn)
|
gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn)
|
||||||
return
|
return
|
||||||
|
14
util.go
14
util.go
@ -52,11 +52,7 @@ func ToSocksAddr(addr net.Addr) *gosocks5.Addr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Connect(addr, proxy string) (net.Conn, error) {
|
func Connect(addr string) (net.Conn, error) {
|
||||||
if !strings.Contains(addr, ":") {
|
|
||||||
addr += ":80"
|
|
||||||
}
|
|
||||||
if len(proxy) == 0 {
|
|
||||||
taddr, err := net.ResolveTCPAddr("tcp", addr)
|
taddr, err := net.ResolveTCPAddr("tcp", addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
@ -65,6 +61,14 @@ func Connect(addr, proxy string) (net.Conn, error) {
|
|||||||
return net.DialTCP("tcp", nil, taddr)
|
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)
|
paddr, err := net.ResolveTCPAddr("tcp", proxy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
Reference in New Issue
Block a user