1
1
package socks
2
2
3
3
import (
4
+ std_bufio "bufio"
4
5
"context"
5
6
"io"
6
7
"net"
@@ -13,7 +14,7 @@ import (
13
14
E "github.com/sagernet/sing/common/exceptions"
14
15
M "github.com/sagernet/sing/common/metadata"
15
16
N "github.com/sagernet/sing/common/network"
16
- "github.com/sagernet/sing/common/rw "
17
+ "github.com/sagernet/sing/common/varbin "
17
18
"github.com/sagernet/sing/protocol/socks/socks4"
18
19
"github.com/sagernet/sing/protocol/socks/socks5"
19
20
)
@@ -32,7 +33,7 @@ func ClientHandshake4(conn io.ReadWriter, command byte, destination M.Socksaddr,
32
33
if err != nil {
33
34
return socks4.Response {}, err
34
35
}
35
- response , err := socks4 .ReadResponse (conn )
36
+ response , err := socks4 .ReadResponse (varbin . StubReader ( conn ) )
36
37
if err != nil {
37
38
return socks4.Response {}, err
38
39
}
@@ -43,6 +44,7 @@ func ClientHandshake4(conn io.ReadWriter, command byte, destination M.Socksaddr,
43
44
}
44
45
45
46
func ClientHandshake5 (conn io.ReadWriter , command byte , destination M.Socksaddr , username string , password string ) (socks5.Response , error ) {
47
+ reader := varbin .StubReader (conn )
46
48
var method byte
47
49
if username == "" {
48
50
method = socks5 .AuthTypeNotRequired
@@ -55,7 +57,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
55
57
if err != nil {
56
58
return socks5.Response {}, err
57
59
}
58
- authResponse , err := socks5 .ReadAuthResponse (conn )
60
+ authResponse , err := socks5 .ReadAuthResponse (reader )
59
61
if err != nil {
60
62
return socks5.Response {}, err
61
63
}
@@ -67,7 +69,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
67
69
if err != nil {
68
70
return socks5.Response {}, err
69
71
}
70
- usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (conn )
72
+ usernamePasswordResponse , err := socks5 .ReadUsernamePasswordAuthResponse (reader )
71
73
if err != nil {
72
74
return socks5.Response {}, err
73
75
}
@@ -84,7 +86,7 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
84
86
if err != nil {
85
87
return socks5.Response {}, err
86
88
}
87
- response , err := socks5 .ReadResponse (conn )
89
+ response , err := socks5 .ReadResponse (reader )
88
90
if err != nil {
89
91
return socks5.Response {}, err
90
92
}
@@ -95,17 +97,17 @@ func ClientHandshake5(conn io.ReadWriter, command byte, destination M.Socksaddr,
95
97
}
96
98
97
99
func 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 ()
99
105
if err != nil {
100
106
return err
101
107
}
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 {
106
108
switch version {
107
109
case socks4 .Version :
108
- request , err := socks4 .ReadRequest0 (conn )
110
+ request , err := socks4 .ReadRequest0 (reader )
109
111
if err != nil {
110
112
return err
111
113
}
@@ -142,7 +144,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
142
144
return E .New ("socks4: unsupported command " , request .Command )
143
145
}
144
146
case socks5 .Version :
145
- authRequest , err := socks5 .ReadAuthRequest0 (conn )
147
+ authRequest , err := socks5 .ReadAuthRequest0 (reader )
146
148
if err != nil {
147
149
return err
148
150
}
@@ -167,7 +169,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
167
169
return err
168
170
}
169
171
if authMethod == socks5 .AuthTypeUsernamePassword {
170
- usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (conn )
172
+ usernamePasswordAuthRequest , err := socks5 .ReadUsernamePasswordAuthRequest (reader )
171
173
if err != nil {
172
174
return err
173
175
}
@@ -186,7 +188,7 @@ func HandleConnection0(ctx context.Context, conn net.Conn, version byte, authent
186
188
return E .New ("socks5: authentication failed, username=" , usernamePasswordAuthRequest .Username , ", password=" , usernamePasswordAuthRequest .Password )
187
189
}
188
190
}
189
- request , err := socks5 .ReadRequest (conn )
191
+ request , err := socks5 .ReadRequest (reader )
190
192
if err != nil {
191
193
return err
192
194
}
0 commit comments