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;
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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");
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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"]);
        }