33// See LICENSE file in the project root for full license information.
44//
55
6+ using System . Collections ;
67using System . Diagnostics ;
8+ using System . IO ;
79using System . Net . Security ;
810using System . Net . Sockets ;
911using System . Net . WebSockets . WebSocketFrame ;
@@ -238,31 +240,26 @@ private void WebSocketClientConnect(IPEndPoint remoteEndPoint, string prefix = "
238240
239241 string beginHeader = ( $ "HTTP/1.1 101". ToLower ( ) ) ;
240242 byte [ ] bufferStart = new byte [ beginHeader . Length ] ;
241- byte [ ] buffer = new byte [ 600 ] ;
242243
243244 int bytesRead = _networkStream . Read ( bufferStart , 0 , bufferStart . Length ) ;
244245
245246 bool correctHandshake = false ;
246247
247248 if ( bytesRead == bufferStart . Length )
248249 {
249- if ( Encoding . UTF8 . GetString ( bufferStart , 0 , bufferStart . Length ) . ToLower ( ) == beginHeader )
250+ if ( Encoding . UTF8 . GetString ( bufferStart , 0 , bytesRead ) . ToLower ( ) == beginHeader )
250251 {
252+ IDictionary headers = ReadHeaders ( ) ;
253+
251254 //right http request
252- bytesRead = _networkStream . Read ( buffer , 0 , buffer . Length ) ;
255+ string swka = swk + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ;
256+ byte [ ] swkaSha1 = WebSocketHelpers . ComputeHash ( swka ) ;
257+ string swkaSha1Base64 = Convert . ToBase64String ( swkaSha1 ) ;
253258
254- if ( bytesRead > 20 )
259+ if ( ( ( string ) headers [ "connection" ] ) . ToLower ( ) == "upgrade" && ( ( string ) headers [ "upgrade" ] ) . ToLower ( ) == "websocket" && ( string ) headers [ "sec-websocket-accept" ] == swkaSha1Base64 )
255260 {
256- var headers = WebSocketHelpers . ParseHeaders ( Encoding . UTF8 . GetString ( buffer , 0 , bytesRead ) ) ;
257- string swka = swk + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ;
258- byte [ ] swkaSha1 = WebSocketHelpers . ComputeHash ( swka ) ;
259- string swkaSha1Base64 = Convert . ToBase64String ( swkaSha1 ) ;
260-
261- if ( ( ( string ) headers [ "connection" ] ) . ToLower ( ) == "upgrade" && ( ( string ) headers [ "upgrade" ] ) . ToLower ( ) == "websocket" && ( string ) headers [ "sec-websocket-accept" ] == swkaSha1Base64 )
262- {
263- Debug . WriteLine ( "WebSocket Client connected" ) ;
264- correctHandshake = true ;
265- }
261+ Debug . WriteLine ( "WebSocket Client connected" ) ;
262+ correctHandshake = true ;
266263 }
267264 }
268265 }
@@ -276,9 +273,59 @@ private void WebSocketClientConnect(IPEndPoint remoteEndPoint, string prefix = "
276273 }
277274
278275 ConnectToStream ( _networkStream , false , _tcpSocket ) ;
276+ }
277+
278+ private IDictionary ReadHeaders ( )
279+ {
280+ IDictionary headers = new Hashtable ( ) ;
281+
282+ string header ;
283+ while ( ! string . IsNullOrEmpty ( header = ReadLine ( ) ) )
284+ {
285+ var keyVal = header . Split ( ':' ) ;
286+ if ( keyVal . Length == 2 )
287+ {
288+ headers [ keyVal [ 0 ] . Trim ( ) . ToLower ( ) ] = keyVal [ 1 ] . Trim ( ) ;
289+ }
290+ }
279291
292+ return headers ;
293+ }
294+
295+ private string ReadLine ( )
296+ {
297+ byte [ ] buffer = new byte [ 200 ] ;
298+ int index = 0 ;
280299
300+ void Append ( int i )
301+ {
302+ buffer [ index ++ ] = ( byte ) i ;
303+
304+ if ( index >= buffer . Length )
305+ {
306+ var newBuffer = new byte [ buffer . Length * 2 ] ;
307+ buffer . CopyTo ( newBuffer , 0 ) ;
308+ buffer = newBuffer ;
309+ }
310+ }
311+
312+ int b ;
313+ while ( ( b = _networkStream . ReadByte ( ) ) != - 1 )
314+ {
315+ if ( b == '\r ' )
316+ {
317+ b = _networkStream . ReadByte ( ) ;
318+ if ( b == '\n ' )
319+ {
320+ return Encoding . UTF8 . GetString ( buffer , 0 , index ) ;
321+ }
322+ Append ( '\r ' ) ;
323+ }
324+
325+ Append ( b ) ;
326+ }
281327
328+ return null ;
282329 }
283330
284331 /// <inheritdoc/>
0 commit comments