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 (!ValidateSecWebSocketProtocolServerHeader(headers["Sec-WebSocket-Protocol"])) { message = "Includes no Sec-WebSocket-Protocol header, or it has an invalid value."; return false; } if (!ValidateSecWebSocketExtensionsServerHeader(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; }
// As server internal void Close(HttpResponse response) { _readyState = WebSocketState.Closing; SendHttpResponse(response); ReleaseServerResources(); _readyState = WebSocketState.Closed; }
// As server private bool SendHttpResponse(HttpResponse response) { #if COMPAT Log.DebugFormat("A response to this request:\n" + response); #else $"A response to the server:\n {response.Stringify()}".Debug(); #endif return SendBytes(response.ToByteArray()); }