@@ -95,21 +95,17 @@ public static void PerformSocks5Handshake(Stream stream, EndPoint endPoint, Sock
95
95
{
96
96
var useAuth = authenticationSettings is Socks5AuthenticationSettings . UsernamePasswordAuthenticationSettings ;
97
97
98
- CreateGreetingRequest ( buffer , useAuth ) ;
99
-
100
- stream . Write ( buffer , 0 , useAuth ? 4 : 3 ) ;
101
- stream . Flush ( ) ;
98
+ var greetingRequestLength = CreateGreetingRequest ( buffer , useAuth ) ;
99
+ stream . Write ( buffer , 0 , greetingRequestLength ) ;
102
100
103
101
ReadGreetingResponse ( stream , buffer , useAuth , authenticationSettings , cancellationToken ) ;
104
102
105
103
var addressLength = CreateConnectRequest ( buffer , targetHost , targetPort ) ;
106
104
stream . Write ( buffer , 0 , addressLength + 6 ) ;
107
- stream . Flush ( ) ;
108
105
109
106
stream . ReadBytes ( buffer , 0 , 5 , cancellationToken ) ;
110
- var skip = ReadConnectResponse ( buffer , cancellationToken ) ;
107
+ var skip = ReadConnectResponse ( buffer ) ;
111
108
stream . ReadBytes ( buffer , 0 , skip , cancellationToken ) ;
112
-
113
109
}
114
110
finally
115
111
{
@@ -125,18 +121,16 @@ public static async Task PerformSocks5HandshakeAsync(Stream stream, EndPoint end
125
121
{
126
122
var useAuth = authenticationSettings is Socks5AuthenticationSettings . UsernamePasswordAuthenticationSettings ;
127
123
128
- CreateGreetingRequest ( buffer , useAuth ) ;
129
- await stream . WriteAsync ( buffer , 0 , useAuth ? 4 : 3 , cancellationToken ) . ConfigureAwait ( false ) ;
130
- await stream . FlushAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
124
+ var greetingRequestLength = CreateGreetingRequest ( buffer , useAuth ) ;
125
+ await stream . WriteAsync ( buffer , 0 , greetingRequestLength , cancellationToken ) . ConfigureAwait ( false ) ;
131
126
132
127
await ReadGreetingResponseAsync ( stream , buffer , useAuth , authenticationSettings , cancellationToken ) . ConfigureAwait ( false ) ;
133
128
134
129
var addressLength = CreateConnectRequest ( buffer , targetHost , targetPort ) ;
135
130
await stream . WriteAsync ( buffer , 0 , addressLength + 6 , cancellationToken ) . ConfigureAwait ( false ) ;
136
- await stream . FlushAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
137
131
138
132
await stream . ReadBytesAsync ( buffer , 0 , 5 , cancellationToken ) . ConfigureAwait ( false ) ;
139
- var skip = ReadConnectResponse ( buffer , cancellationToken ) ;
133
+ var skip = ReadConnectResponse ( buffer ) ;
140
134
await stream . ReadBytesAsync ( buffer , 0 , skip , cancellationToken ) . ConfigureAwait ( true ) ;
141
135
}
142
136
finally
@@ -145,21 +139,21 @@ public static async Task PerformSocks5HandshakeAsync(Stream stream, EndPoint end
145
139
}
146
140
}
147
141
148
- private static void CreateGreetingRequest ( byte [ ] buffer , bool useAuth )
142
+ private static int CreateGreetingRequest ( byte [ ] buffer , bool useAuth )
149
143
{
150
144
buffer [ 0 ] = ProtocolVersion5 ;
151
145
152
146
if ( ! useAuth )
153
147
{
154
148
buffer [ 1 ] = 1 ;
155
149
buffer [ 2 ] = MethodNoAuth ;
150
+ return 3 ;
156
151
}
157
- else
158
- {
159
- buffer [ 1 ] = 2 ;
160
- buffer [ 2 ] = MethodNoAuth ;
161
- buffer [ 3 ] = MethodUsernamePassword ;
162
- }
152
+
153
+ buffer [ 1 ] = 2 ;
154
+ buffer [ 2 ] = MethodNoAuth ;
155
+ buffer [ 3 ] = MethodUsernamePassword ;
156
+ return 4 ;
163
157
}
164
158
165
159
private static void ReadGreetingResponse ( Stream stream , byte [ ] buffer , bool useAuth , Socks5AuthenticationSettings authenticationSettings , CancellationToken cancellationToken )
@@ -214,7 +208,6 @@ private static void PerformUsernamePasswordAuth(Stream stream, byte[] buffer, So
214
208
215
209
var authLength = 3 + usernameLength + passwordLength ;
216
210
stream . Write ( buffer , 0 , authLength ) ;
217
- stream . Flush ( ) ;
218
211
219
212
stream . ReadBytes ( buffer , 0 , 2 , cancellationToken ) ;
220
213
if ( buffer [ 0 ] != SubnegotiationVersion || buffer [ 1 ] != Socks5Success )
@@ -237,7 +230,7 @@ private static async Task PerformUsernamePasswordAuthAsync(Stream stream, byte[]
237
230
238
231
var authLength = 3 + usernameLength + passwordLength ;
239
232
await stream . WriteAsync ( buffer , 0 , authLength , cancellationToken ) . ConfigureAwait ( false ) ;
240
- await stream . FlushAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
233
+
241
234
242
235
await stream . ReadBytesAsync ( buffer , 0 , 2 , cancellationToken ) . ConfigureAwait ( false ) ;
243
236
if ( buffer [ 0 ] != SubnegotiationVersion || buffer [ 1 ] != Socks5Success )
@@ -284,7 +277,8 @@ private static int CreateConnectRequest(byte[] buffer, string targetHost, int ta
284
277
return addressLength ;
285
278
}
286
279
287
- private static int ReadConnectResponse ( byte [ ] buffer , CancellationToken cancellationToken )
280
+ // Reads the SOCKS5 connect response and returns the number of bytes to skip in the buffer.
281
+ private static int ReadConnectResponse ( byte [ ] buffer )
288
282
{
289
283
VerifyProtocolVersion ( buffer [ 0 ] ) ;
290
284
0 commit comments