better support for SOCKS4
This commit is contained in:
parent
ab87ca05fa
commit
69399ee74f
60
cmd/gost/vendor/github.com/ginuerzh/gost/server.go
generated
vendored
60
cmd/gost/vendor/github.com/ginuerzh/gost/server.go
generated
vendored
@ -184,27 +184,28 @@ func (s *ProxyServer) handleConn(conn net.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
// http or socks5
|
||||
b := make([]byte, MediumBufferSize)
|
||||
|
||||
n, err := io.ReadAtLeast(conn, b, 2)
|
||||
br := bufio.NewReader(conn)
|
||||
b, err := br.Peek(1)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln(err)
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: use bufio.Reader
|
||||
if b[0] == gosocks5.Ver5 {
|
||||
mn := int(b[1]) // methods count
|
||||
length := 2 + mn
|
||||
if n < length {
|
||||
if _, err := io.ReadFull(conn, b[n:length]); err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5]", err)
|
||||
return
|
||||
}
|
||||
switch b[0] {
|
||||
case gosocks4.Ver4:
|
||||
req, err := gosocks4.ReadRequest(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks4]", err)
|
||||
return
|
||||
}
|
||||
NewSocks4Server(conn, s).HandleRequest(req)
|
||||
|
||||
case gosocks5.Ver5:
|
||||
methods, err := gosocks5.ReadMethods(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5]", err)
|
||||
return
|
||||
}
|
||||
// TODO: use gosocks5.ServerConn
|
||||
methods := b[2 : 2+mn]
|
||||
method := s.selector.Select(methods...)
|
||||
if _, err := conn.Write([]byte{gosocks5.Ver5, method}); err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5] select:", err)
|
||||
@ -223,15 +224,15 @@ func (s *ProxyServer) handleConn(conn net.Conn) {
|
||||
return
|
||||
}
|
||||
NewSocks5Server(conn, s).HandleRequest(req)
|
||||
return
|
||||
}
|
||||
|
||||
req, err := http.ReadRequest(bufio.NewReader(&reqReader{b: b[:n], r: conn}))
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[http]", err)
|
||||
return
|
||||
default: // http
|
||||
req, err := http.ReadRequest(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[http]", err)
|
||||
return
|
||||
}
|
||||
NewHttpServer(conn, s).HandleRequest(req)
|
||||
}
|
||||
NewHttpServer(conn, s).HandleRequest(req)
|
||||
}
|
||||
|
||||
func (_ *ProxyServer) transport(conn1, conn2 net.Conn) (err error) {
|
||||
@ -254,18 +255,3 @@ func (_ *ProxyServer) transport(conn1, conn2 net.Conn) (err error) {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
type reqReader struct {
|
||||
b []byte
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
func (r *reqReader) Read(p []byte) (n int, err error) {
|
||||
if len(r.b) == 0 {
|
||||
return r.r.Read(p)
|
||||
}
|
||||
n = copy(p, r.b)
|
||||
r.b = r.b[n:]
|
||||
|
||||
return
|
||||
}
|
||||
|
6
cmd/gost/vendor/vendor.json
vendored
6
cmd/gost/vendor/vendor.json
vendored
@ -27,10 +27,10 @@
|
||||
"revisionTime": "2017-01-19T05:34:58Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "1iyn4OEHEJknBi+IiZuUaJi6Ifw=",
|
||||
"checksumSHA1": "/unEypznQ0qT7TWxnA4KLOgOXwo=",
|
||||
"path": "github.com/ginuerzh/gost",
|
||||
"revision": "333291e9bc766a76d6df5243a7022c5f028be17c",
|
||||
"revisionTime": "2017-02-05T06:35:38Z"
|
||||
"revision": "ab87ca05fa5553dab59aa1623624ddefa66b408b",
|
||||
"revisionTime": "2017-02-11T10:34:35Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "+XIOnTW0rv8Kr/amkXgMraNeUr4=",
|
||||
|
60
server.go
60
server.go
@ -184,27 +184,28 @@ func (s *ProxyServer) handleConn(conn net.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
// http or socks5
|
||||
b := make([]byte, MediumBufferSize)
|
||||
|
||||
n, err := io.ReadAtLeast(conn, b, 2)
|
||||
br := bufio.NewReader(conn)
|
||||
b, err := br.Peek(1)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln(err)
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: use bufio.Reader
|
||||
if b[0] == gosocks5.Ver5 {
|
||||
mn := int(b[1]) // methods count
|
||||
length := 2 + mn
|
||||
if n < length {
|
||||
if _, err := io.ReadFull(conn, b[n:length]); err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5]", err)
|
||||
return
|
||||
}
|
||||
switch b[0] {
|
||||
case gosocks4.Ver4:
|
||||
req, err := gosocks4.ReadRequest(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks4]", err)
|
||||
return
|
||||
}
|
||||
NewSocks4Server(conn, s).HandleRequest(req)
|
||||
|
||||
case gosocks5.Ver5:
|
||||
methods, err := gosocks5.ReadMethods(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5]", err)
|
||||
return
|
||||
}
|
||||
// TODO: use gosocks5.ServerConn
|
||||
methods := b[2 : 2+mn]
|
||||
method := s.selector.Select(methods...)
|
||||
if _, err := conn.Write([]byte{gosocks5.Ver5, method}); err != nil {
|
||||
glog.V(LWARNING).Infoln("[socks5] select:", err)
|
||||
@ -223,15 +224,15 @@ func (s *ProxyServer) handleConn(conn net.Conn) {
|
||||
return
|
||||
}
|
||||
NewSocks5Server(conn, s).HandleRequest(req)
|
||||
return
|
||||
}
|
||||
|
||||
req, err := http.ReadRequest(bufio.NewReader(&reqReader{b: b[:n], r: conn}))
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[http]", err)
|
||||
return
|
||||
default: // http
|
||||
req, err := http.ReadRequest(br)
|
||||
if err != nil {
|
||||
glog.V(LWARNING).Infoln("[http]", err)
|
||||
return
|
||||
}
|
||||
NewHttpServer(conn, s).HandleRequest(req)
|
||||
}
|
||||
NewHttpServer(conn, s).HandleRequest(req)
|
||||
}
|
||||
|
||||
func (_ *ProxyServer) transport(conn1, conn2 net.Conn) (err error) {
|
||||
@ -254,18 +255,3 @@ func (_ *ProxyServer) transport(conn1, conn2 net.Conn) (err error) {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
type reqReader struct {
|
||||
b []byte
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
func (r *reqReader) Read(p []byte) (n int, err error) {
|
||||
if len(r.b) == 0 {
|
||||
return r.r.Read(p)
|
||||
}
|
||||
n = copy(p, r.b)
|
||||
r.b = r.b[n:]
|
||||
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user