public WSHTTPConnectionParameters(Stream stream, WSHTTPClientHeaders clientHeaders, WSHTTPServerHeaders serverHeaders, WSHTTPConnectionType type) { if (stream == null) { throw new ArgumentNullException(nameof(stream), $"{nameof(stream)} is null."); } if (clientHeaders == null) { throw new ArgumentNullException(nameof(clientHeaders), $"{nameof(clientHeaders)} is null."); } if (serverHeaders == null) { throw new ArgumentNullException(nameof(serverHeaders), $"{nameof(serverHeaders)} is null."); } var key = WSKey.FromString(clientHeaders.SecWebSocketKey); ID = key.ID; Type = type; Stream = stream; ClientHeaders = clientHeaders; ServerHeaders = serverHeaders; }
private async Task <IWSConnectionParameters> ServerHandshake(Stream stream) { var clientHeaders = CreateClientHeaders(); var serverHeaders = CreateServerHeaders(); var streamWriter = new StreamWriter(stream); var streamReader = new StreamReader(stream); var clientDirective = HTTPClientDirective.Parse(streamReader.ReadLine()); if (clientDirective.Method != "GET" || clientDirective.PathAndQuery != "/ws") { throw new NotSupportedException("Client Handshake Request"); } await ReadHeaders(streamReader, clientHeaders); var key = WSKey.FromString(clientHeaders["Sec-WebSocket-Key"]); ID = key.ID; UpdateHeaders(clientHeaders, serverHeaders); serverHeaders["Upgrade"] = "WebSocket"; serverHeaders["Connection"] = "Upgrade"; serverHeaders["Sec-WebSocket-Accept"] = key.ComputeAccept(); var serverDirective = new HTTPServerDirective { Version = new Version(1, 1), StatusText = "Switch Protocol WebSocket", StatusCode = 101, }; await SendResponse(serverHeaders, streamWriter, serverDirective); return(new WSHTTPConnectionParameters(stream, clientHeaders, serverHeaders, WSHTTPConnectionType.Server)); }