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)
@@ -23,16 +24,16 @@ type Handler interface {
2324 N.UDPConnectionHandler
2425}
2526
26- func ClientHandshake4 (conn io.ReadWriter , command byte , destination M.Socksaddr , username string ) (socks4.Response , error ) {
27- err := socks4 .WriteRequest (conn , socks4.Request {
27+ func ClientHandshake4 (reader varbin. Reader , writer io.Writer , command byte , destination M.Socksaddr , username string ) (socks4.Response , error ) {
28+ err := socks4 .WriteRequest (writer , socks4.Request {
2829 Command : command ,
2930 Destination : destination ,
3031 Username : username ,
3132 })
3233 if err != nil {
3334 return socks4.Response {}, err
3435 }
35- response , err := socks4 .ReadResponse (conn )
36+ response , err := socks4 .ReadResponse (reader )
3637 if err != nil {
3738 return socks4.Response {}, err
3839 }
@@ -42,32 +43,32 @@ func ClientHandshake4(conn io.ReadWriter, command byte, destination M.Socksaddr,
4243 return response , err
4344}
4445
45- func ClientHandshake5 (conn io.ReadWriter , command byte , destination M.Socksaddr , username string , password string ) (socks5.Response , error ) {
46+ func ClientHandshake5 (reader varbin. Reader , writer io.Writer , command byte , destination M.Socksaddr , username string , password string ) (socks5.Response , error ) {
4647 var method byte
4748 if username == "" {
4849 method = socks5 .AuthTypeNotRequired
4950 } else {
5051 method = socks5 .AuthTypeUsernamePassword
5152 }
52- err := socks5 .WriteAuthRequest (conn , socks5.AuthRequest {
53+ err := socks5 .WriteAuthRequest (writer , socks5.AuthRequest {
5354 Methods : []byte {method },
5455 })
5556 if err != nil {
5657 return socks5.Response {}, err
5758 }
58- authResponse , err := socks5 .ReadAuthResponse (conn )
59+ authResponse , err := socks5 .ReadAuthResponse (reader )
5960 if err != nil {
6061 return socks5.Response {}, err
6162 }
6263 if authResponse .Method == socks5 .AuthTypeUsernamePassword {
63- err = socks5 .WriteUsernamePasswordAuthRequest (conn , socks5.UsernamePasswordAuthRequest {
64+ err = socks5 .WriteUsernamePasswordAuthRequest (writer , socks5.UsernamePasswordAuthRequest {
6465 Username : username ,
6566 Password : password ,
6667 })
6768 if err != nil {
6869 return socks5.Response {}, err
6970 }
70- usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (conn )
71+ usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (reader )
7172 if err != nil {
7273 return socks5.Response {}, err
7374 }
@@ -77,14 +78,14 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
7778 } else if authResponse .Method != socks5 .AuthTypeNotRequired {
7879 return socks5.Response {}, E .New ("socks5: unsupported auth method: " , authResponse .Method )
7980 }
80- err = socks5 .WriteRequest (conn , socks5.Request {
81+ err = socks5 .WriteRequest (writer , socks5.Request {
8182 Command : command ,
8283 Destination : destination ,
8384 })
8485 if err != nil {
8586 return socks5.Response {}, err
8687 }
87- response , err := socks5 .ReadResponse (conn )
88+ response , err := socks5 .ReadResponse (reader )
8889 if err != nil {
8990 return socks5.Response {}, err
9091 }
@@ -94,18 +95,14 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
9495 return response , err
9596}
9697
97- func HandleConnection (ctx context.Context , conn net.Conn , authenticator * auth.Authenticator , handler Handler , metadata M.Metadata ) error {
98- version , err := rw .ReadByte (conn )
98+ func HandleConnection (ctx context.Context , conn net.Conn , reader * std_bufio. Reader , authenticator * auth.Authenticator , handler Handler , metadata M.Metadata ) error {
99+ version , err := reader .ReadByte ()
99100 if err != nil {
100101 return err
101102 }
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 {
106103 switch version {
107104 case socks4 .Version :
108- request , err := socks4 .ReadRequest0 (conn )
105+ request , err := socks4 .ReadRequest0 (reader )
109106 if err != nil {
110107 return err
111108 }
@@ -142,7 +139,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
142139 return E .New ("socks4: unsupported command " , request .Command )
143140 }
144141 case socks5 .Version :
145- authRequest , err := socks5 .ReadAuthRequest0 (conn )
142+ authRequest , err := socks5 .ReadAuthRequest0 (reader )
146143 if err != nil {
147144 return err
148145 }
@@ -167,7 +164,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
167164 return err
168165 }
169166 if authMethod == socks5 .AuthTypeUsernamePassword {
170- usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (conn )
167+ usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (reader )
171168 if err != nil {
172169 return err
173170 }
@@ -186,7 +183,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
186183 return E .New ("socks5: authentication failed, username=" , usernamePasswordAuthRequest .Username , ", password=" , usernamePasswordAuthRequest .Password )
187184 }
188185 }
189- request , err := socks5 .ReadRequest (conn )
186+ request , err := socks5 .ReadRequest (reader )
190187 if err != nil {
191188 return err
192189 }
0 commit comments