// As server internal void Close (HttpResponse response) { _readyState = WebSocketState.Closing; sendHttpResponse (response); releaseServerResources (); _readyState = WebSocketState.Closed; }
// As client private string checkIfValidHandshakeResponse (HttpResponse response) { var headers = response.Headers; return response.IsRedirect ? "Indicates the redirection." : response.IsUnauthorized ? "Requires the authentication." : !response.IsWebSocketResponse ? "Not a WebSocket connection response." : !validateSecWebSocketAcceptHeader (headers["Sec-WebSocket-Accept"]) ? "Includes an invalid Sec-WebSocket-Accept header." : !validateSecWebSocketProtocolHeader (headers["Sec-WebSocket-Protocol"]) ? "Includes an invalid Sec-WebSocket-Protocol header." : !validateSecWebSocketExtensionsHeader (headers["Sec-WebSocket-Extensions"]) ? "Includes an invalid Sec-WebSocket-Extensions header." : !validateSecWebSocketVersionServerHeader (headers["Sec-WebSocket-Version"]) ? "Includes an invalid Sec-WebSocket-Version header." : null; }
// As server private bool sendHttpResponse (HttpResponse response) { _logger.Debug ("A response to this request:\n" + response.ToString ()); return sendBytes (response.ToByteArray ()); }
internal static HttpResponse CreateWebSocketResponse () { var res = new HttpResponse (HttpStatusCode.SwitchingProtocols); var headers = res.Headers; headers["Upgrade"] = "websocket"; headers["Connection"] = "Upgrade"; return res; }
internal static HttpResponse CreateUnauthorizedResponse (string challenge) { var res = new HttpResponse (HttpStatusCode.Unauthorized); res.Headers["WWW-Authenticate"] = challenge; return res; }
internal static HttpResponse CreateCloseResponse (HttpStatusCode code) { var res = new HttpResponse (code); res.Headers["Connection"] = "close"; return res; }
// As client private bool checkHandshakeResponse (HttpResponse response, out string message) { message = null; if (response.IsRedirect) { message = "Indicates the redirection."; return false; } if (response.IsUnauthorized) { message = "Requires the authentication."; return false; } if (!response.IsWebSocketResponse) { message = "Not a WebSocket handshake response."; return false; } var headers = response.Headers; if (!validateSecWebSocketAcceptHeader (headers["Sec-WebSocket-Accept"])) { message = "Includes no Sec-WebSocket-Accept header, or it has an invalid value."; return false; } if (!validateSecWebSocketProtocolHeader (headers["Sec-WebSocket-Protocol"])) { message = "Includes no Sec-WebSocket-Protocol header, or it has an invalid value."; return false; } if (!validateSecWebSocketExtensionsHeader (headers["Sec-WebSocket-Extensions"])) { message = "Includes an invalid Sec-WebSocket-Extensions header."; return false; } if (!validateSecWebSocketVersionServerHeader (headers["Sec-WebSocket-Version"])) { message = "Includes an invalid Sec-WebSocket-Version header."; return false; } return true; }