Example #1
0
        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;
        }
Example #2
0
        public static int Write(HttpResponse response, MemoryStream ms, int keepAlives, TimeSpan keepAliveTimeout)
        {
            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"));

            if (!string.IsNullOrEmpty(response.ContentType))
            {
                bytesWritten += ms.WriteAsciiFormat("Content-Type: {0}\r\n", response.ContentType);
            }
            var contentLength = response.Body == null ? 0 : response.Body.Length;
            bytesWritten += ms.WriteAsciiFormat("Content-Length: {0}\r\n", contentLength);

            var headers = response.Headers;
            if (headers?.Count > 0)
            {
                foreach (var kvp in headers) //TODO: duplicate handling with fixed headers
                {
                    bytesWritten += ms.WriteAsciiFormat("{0}: {1}\r\n", kvp.Key, kvp.Value);
                }
            }

            if (keepAlives > 0)
            {
                bytesWritten += ms.WriteAsciiFormat("Connection: keep-alive\r\n", keepAlives);
                bytesWritten += ms.WriteAsciiFormat("Keep-Alive: timeout={0},max={1}\r\n", (int)keepAliveTimeout.TotalSeconds, keepAlives);
            }
            else
            {
                bytesWritten += ms.WriteAsciiFormat("Connection: close\r\n", keepAlives);
            }

            bytesWritten += ms.Write(CRLF);

            if (contentLength > 0)
            {
                bytesWritten += ms.Write(response.Body);
            }

            return bytesWritten;
        }