@@ -106,7 +106,10 @@ public static void PerformSocks5Handshake(Stream stream, EndPoint endPoint, Sock
106
106
stream . Write ( buffer , 0 , addressLength + 6 ) ;
107
107
stream . Flush ( ) ;
108
108
109
- ReadConnectResponse ( stream , buffer , cancellationToken ) ;
109
+ stream . ReadBytes ( buffer , 0 , 5 , cancellationToken ) ;
110
+ var skip = ReadConnectResponse ( buffer , cancellationToken ) ;
111
+ stream . ReadBytes ( buffer , 0 , skip , cancellationToken ) ;
112
+
110
113
}
111
114
finally
112
115
{
@@ -132,7 +135,9 @@ public static async Task PerformSocks5HandshakeAsync(Stream stream, EndPoint end
132
135
await stream . WriteAsync ( buffer , 0 , addressLength + 6 , cancellationToken ) . ConfigureAwait ( false ) ;
133
136
await stream . FlushAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
134
137
135
- await ReadConnectResponseAsync ( stream , buffer , cancellationToken ) . ConfigureAwait ( false ) ;
138
+ await stream . ReadBytesAsync ( buffer , 0 , 5 , cancellationToken ) . ConfigureAwait ( false ) ;
139
+ var skip = ReadConnectResponse ( buffer , cancellationToken ) ;
140
+ await stream . ReadBytesAsync ( buffer , 0 , skip , cancellationToken ) . ConfigureAwait ( true ) ;
136
141
}
137
142
finally
138
143
{
@@ -262,38 +267,18 @@ private static int CreateConnectRequest(byte[] buffer, string targetHost, int ta
262
267
return addressLength ;
263
268
}
264
269
265
- private static void ReadConnectResponse ( Stream stream , byte [ ] buffer , CancellationToken cancellationToken )
270
+ private static int ReadConnectResponse ( byte [ ] buffer , CancellationToken cancellationToken )
266
271
{
267
- stream . ReadBytes ( buffer , 0 , 5 , cancellationToken ) ;
268
272
VerifyProtocolVersion ( buffer [ 0 ] ) ;
269
273
VerifySockSuccess ( buffer [ 1 ] ) ;
270
274
271
- var skip = buffer [ 3 ] switch
275
+ return buffer [ 3 ] switch
272
276
{
273
277
AddressTypeIPv4 => 5 ,
274
278
AddressTypeIPv6 => 17 ,
275
279
AddressTypeDomain => buffer [ 4 ] + 2 ,
276
280
_ => throw new IOException ( "Unknown address type in SOCKS5 reply." )
277
281
} ;
278
-
279
- stream . ReadBytes ( buffer , 0 , skip , cancellationToken ) ;
280
- }
281
-
282
- private static async Task ReadConnectResponseAsync ( Stream stream , byte [ ] buffer , CancellationToken cancellationToken )
283
- {
284
- await stream . ReadBytesAsync ( buffer , 0 , 5 , cancellationToken ) . ConfigureAwait ( false ) ;
285
- VerifyProtocolVersion ( buffer [ 0 ] ) ;
286
- VerifySockSuccess ( buffer [ 1 ] ) ;
287
-
288
- var skip = buffer [ 3 ] switch
289
- {
290
- AddressTypeIPv4 => 5 ,
291
- AddressTypeIPv6 => 17 ,
292
- AddressTypeDomain => buffer [ 4 ] + 2 ,
293
- _ => throw new IOException ( "Unknown address type in SOCKS5 reply." )
294
- } ;
295
-
296
- await stream . ReadBytesAsync ( buffer , 0 , skip , cancellationToken ) . ConfigureAwait ( false ) ;
297
282
}
298
283
299
284
private static void CreateGreetingRequest ( byte [ ] buffer , bool useAuth )
@@ -317,15 +302,15 @@ private static void VerifyProtocolVersion(byte version)
317
302
{
318
303
if ( version != ProtocolVersion5 )
319
304
{
320
- throw new IOException ( "Invalid SOCKS version in method selection response." ) ;
305
+ throw new IOException ( "Invalid SOCKS version in response." ) ;
321
306
}
322
307
}
323
308
324
- private static void VerifySockSuccess ( byte value )
309
+ private static void VerifySockSuccess ( byte value ) //TODO Need to check this
325
310
{
326
311
if ( value != Socks5Success )
327
312
{
328
- throw new IOException ( $ "SOCKS5 connect failed with code 0x { value : X2 } ") ;
313
+ throw new IOException ( $ "SOCKS5 connect failed") ;
329
314
}
330
315
}
331
316
0 commit comments