public static int WriteWebSocketUpgradeResponse(WebSocketUpgradeResponse response, MemoryStream ms) { var bytesWritten = 0; bytesWritten += ms.WriteAsciiFormat("HTTP/1.1 {0} {1}\r\n", (int)response.StatusCode, response.StatusDescription); bytesWritten += ms.WriteAsciiFormat("Server: {0}\r\n", Server); bytesWritten += ms.WriteAsciiFormat("Date: {0}\r\n", DateTime.UtcNow.ToString("R")); var acceptResponse = response as WebSocketUpgradeResponse.AcceptUpgradeResponse; if (acceptResponse != null) { var acceptKey = Encoding.UTF8.GetBytes(acceptResponse.RequestKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); var acceptKeyHash = Convert.ToBase64String(SHA1.Create().ComputeHash(acceptKey)); bytesWritten += ms.WriteAscii("Connection: upgrade\r\n"); bytesWritten += ms.WriteAscii("Upgrade: websocket\r\n"); bytesWritten += ms.WriteAsciiFormat("Sec-WebSocket-Accept: {0}\r\n", acceptKeyHash); } else // Reject { bytesWritten += ms.WriteAscii("Connection: close\r\n"); } bytesWritten += ms.Write(CRLF); return bytesWritten; }
public void TestParseHeaders() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; request.WriteAscii("User-Agent: curl/7.35.0\r\n"); request.WriteAscii("Host: localhost:8080\r\n"); request.WriteAscii("Accept: */*\r\n"); request.WriteAscii("\r\n"); var headers = new Dictionary<string, string>(); Assert.IsTrue(RequestParser.TryParseHeaders(buffer, ref start, (int)request.Length, headers.Add)); }
public void TestMixedNewLines() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; int lineStart, lineEnd; request.WriteAscii("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0\n"); request.WriteAscii("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n"); request.WriteAscii("Accept-language: en-US;q=0.7,en;q=0.3\n"); request.WriteAscii("Connection: close\r\n"); Assert.IsTrue(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); var line = Encoding.ASCII.GetString(buffer, lineStart, lineEnd); Assert.AreEqual("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0", line); }
public void TestParseHeader() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; int lineStart, lineEnd; request.WriteAscii("Host : localhost:8080\r\n"); Assert.IsTrue(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); string name, value; RequestParser.ParseHeader(buffer, lineStart, lineEnd, out name, out value); Assert.AreEqual("Host", name); Assert.AreEqual("localhost:8080", value); }
public void TestParseRequestLine1() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; int lineStart, lineEnd; request.WriteAscii("POST /accounts?flag=x HTTP/1.1\r\n"); Assert.IsTrue(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); Method method; string path, query, version; RequestParser.ParseRequestLine(buffer, lineStart, lineEnd, out method, out path, out query, out version); Assert.AreEqual(Method.POST, method); Assert.AreEqual("/accounts", path); Assert.AreEqual("?flag=x", query); Assert.AreEqual("HTTP/1.1", version); }
public void TestTryReadLine() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; int lineStart, lineEnd; Assert.IsFalse(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); request.WriteAscii("\r\n"); Assert.IsTrue(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); request.WriteAscii("GET /"); Assert.IsFalse(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); request.WriteAscii(" HTTP/1.1\r\nUser-Agent: "); Assert.IsTrue(RequestParser.TryReadLine(buffer, ref start, (int)request.Length, out lineStart, out lineEnd)); Assert.AreEqual(Encoding.ASCII.GetString(buffer, lineStart, lineEnd - lineStart), "GET / HTTP/1.1"); }
public void TestTryParseHttpPostRequest() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; request.WriteAscii("POST /accounts/create HTTP/1.1\r\n"); request.WriteAscii("Host: localhost:8080\r\n"); request.WriteAscii("Content-Length: 23\r\n"); request.WriteAscii("\r\n"); request.WriteAscii(@"{ ""username"" : ""test"" }"); var state = new HttpRequest(RemoteEndPoint, false); HttpRequest httpRequest; Assert.IsTrue(RequestParser.TryParseHttpRequest(buffer, ref start, (int)request.Length, state, out httpRequest)); Assert.AreEqual(Method.POST, httpRequest.Method); Assert.AreEqual("http://*****:*****@"{ ""username"" : ""test"" }", requestBody); }
public void TestTryParseHttpGetRequest() { var request = new MemoryStream(8192); var buffer = request.GetBuffer(); var start = 0; request.WriteAscii("GET /index.jsp HTTP/1.1\r\n"); request.WriteAscii("User-Agent: curl/7.35.0\r\n"); request.WriteAscii("Host: localhost:8080\r\n"); request.WriteAscii("Accept: */*\r\n"); var state = new HttpRequest(RemoteEndPoint, false); HttpRequest httpRequest; Assert.IsFalse(RequestParser.TryParseHttpRequest(buffer, ref start, (int)request.Length, state, out httpRequest)); request.WriteAscii("\r\n"); Assert.IsTrue(RequestParser.TryParseHttpRequest(buffer, ref start, (int)request.Length, state, out httpRequest)); Assert.AreEqual(Method.GET, httpRequest.Method); Assert.AreEqual("http://localhost:8080/index.jsp", httpRequest.Url.AbsoluteUri); Assert.AreEqual("curl/7.35.0", httpRequest.Headers["User-Agent"]); }