11package socks
22
33import (
4+ std_bufio "bufio"
45 "context"
56 "io"
67 "net"
@@ -13,7 +14,7 @@ import (
1314 E "github.com/sagernet/sing/common/exceptions"
1415 M "github.com/sagernet/sing/common/metadata"
1516 N "github.com/sagernet/sing/common/network"
16- "github.com/sagernet/sing/common/rw "
17+ "github.com/sagernet/sing/common/varbin "
1718 "github.com/sagernet/sing/protocol/socks/socks4"
1819 "github.com/sagernet/sing/protocol/socks/socks5"
1920)
@@ -32,7 +33,7 @@ func ClientHandshake4(conn io.ReadWriter, command byte, destination M.Socksaddr,
3233 if err != nil {
3334 return socks4.Response {}, err
3435 }
35- response , err := socks4 .ReadResponse (conn )
36+ response , err := socks4 .ReadResponse (varbin . StubReader ( conn ) )
3637 if err != nil {
3738 return socks4.Response {}, err
3839 }
@@ -43,6 +44,7 @@ func ClientHandshake4(conn io.ReadWriter, command byte, destination M.Socksaddr,
4344}
4445
4546func ClientHandshake5 (conn io.ReadWriter , command byte , destination M.Socksaddr , username string , password string ) (socks5.Response , error ) {
47+ reader := varbin .StubReader (conn )
4648 var method byte
4749 if username == "" {
4850 method = socks5 .AuthTypeNotRequired
@@ -55,7 +57,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
5557 if err != nil {
5658 return socks5.Response {}, err
5759 }
58- authResponse , err := socks5 .ReadAuthResponse (conn )
60+ authResponse , err := socks5 .ReadAuthResponse (reader )
5961 if err != nil {
6062 return socks5.Response {}, err
6163 }
@@ -67,7 +69,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
6769 if err != nil {
6870 return socks5.Response {}, err
6971 }
70- usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (conn )
72+ usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (reader )
7173 if err != nil {
7274 return socks5.Response {}, err
7375 }
@@ -84,7 +86,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
8486 if err != nil {
8587 return socks5.Response {}, err
8688 }
87- response , err := socks5 .ReadResponse (conn )
89+ response , err := socks5 .ReadResponse (reader )
8890 if err != nil {
8991 return socks5.Response {}, err
9092 }
@@ -95,17 +97,17 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
9597}
9698
9799func HandleConnection (ctx context.Context , conn net.Conn , authenticator * auth.Authenticator , handler Handler , metadata M.Metadata ) error {
98- version , err := rw .ReadByte (conn )
100+ return HandleConnection0 (ctx , conn , std_bufio .NewReader (conn ), authenticator , handler , metadata )
101+ }
102+
103+ func HandleConnection0 (ctx context.Context , conn net.Conn , reader * std_bufio.Reader , authenticator * auth.Authenticator , handler Handler , metadata M.Metadata ) error {
104+ version , err := reader .ReadByte ()
99105 if err != nil {
100106 return err
101107 }
102- return HandleConnection0 (ctx , conn , version , authenticator , handler , metadata )
103- }
104-
105- func HandleConnection0 (ctx context.Context , conn net.Conn , version byte , authenticator * auth.Authenticator , handler Handler , metadata M.Metadata ) error {
106108 switch version {
107109 case socks4 .Version :
108- request , err := socks4 .ReadRequest0 (conn )
110+ request , err := socks4 .ReadRequest0 (reader )
109111 if err != nil {
110112 return err
111113 }
@@ -142,7 +144,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
142144 return E .New ("socks4: unsupported command " , request .Command )
143145 }
144146 case socks5 .Version :
145- authRequest , err := socks5 .ReadAuthRequest0 (conn )
147+ authRequest , err := socks5 .ReadAuthRequest0 (reader )
146148 if err != nil {
147149 return err
148150 }
@@ -167,7 +169,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
167169 return err
168170 }
169171 if authMethod == socks5 .AuthTypeUsernamePassword {
170- usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (conn )
172+ usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (reader )
171173 if err != nil {
172174 return err
173175 }
@@ -186,7 +188,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
186188 return E .New ("socks5: authentication failed, username=" , usernamePasswordAuthRequest .Username , ", password=" , usernamePasswordAuthRequest .Password )
187189 }
188190 }
189- request , err := socks5 .ReadRequest (conn )
191+ request , err := socks5 .ReadRequest (reader )
190192 if err != nil {
191193 return err
192194 }
0 commit comments