Skip to content

Commit a36dc09

Browse files
Read Headers line by line until an empty line is found (#136)
1 parent 9c24301 commit a36dc09

File tree

3 files changed

+63
-32
lines changed

3 files changed

+63
-32
lines changed

WebSockets/ClientWebSocket/ClientWebSocket.cs

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
// See LICENSE file in the project root for full license information.
44
//
55

6+
using System.Collections;
67
using System.Diagnostics;
8+
using System.IO;
79
using System.Net.Security;
810
using System.Net.Sockets;
911
using 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/>

WebSockets/WebSocket.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ protected void ConnectToStream(NetworkStream stream, bool isServer, Socket socke
138138
WebSocketReceiver = new WebSocketReceiver(stream, RemoteEndPoint, this, IsServer, MaxReceiveFrameSize, OnReadError);
139139
_webSocketSender = new WebSocketSender(stream, IsServer, OnWriteError);
140140

141+
State = WebSocketState.Open;
142+
141143
ReceiveAndControllThread receiveThread = new ReceiveAndControllThread(this);
142144
new Thread(receiveThread.WorkerThread).Start();
143-
144-
State = WebSocketState.Open;
145145
}
146146

147147
/// <summary>

WebSockets/WebSocketHelpers.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,6 @@ internal static byte[] ReverseBytes(byte[] bytes)
2121
return returnBytes;
2222
}
2323

24-
public static IDictionary ParseHeaders(string handshake)
25-
{
26-
var headers = handshake.Split(new char[] { '\r', '\n' });
27-
IDictionary dic = new Hashtable();
28-
foreach (string header in headers)
29-
{
30-
var keyVal = header.Split(':');
31-
if (keyVal.Length == 2)
32-
{
33-
dic[keyVal[0].Trim().ToLower()] = keyVal[1].Trim();
34-
}
35-
}
36-
37-
return dic;
38-
}
39-
4024
private static uint SHA1RotateLeft(uint x, int n)
4125
{
4226
return ((x << n) | (x >> (32 - n)));

0 commit comments

Comments
 (0)