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> ClientHandshake(Stream stream, Uri uri) { var clientHeaders = CreateClientHeaders(); var serverHeaders = CreateServerHeaders(); var streamWriter = new StreamWriter(stream); var streamReader = new StreamReader(stream); var key = WSKey.FromID(ID); clientHeaders["Host"] = uri.Host; clientHeaders["Upgrade"] = "WebSocket"; clientHeaders["Connection"] = "Upgrade"; clientHeaders["Sec-WebSocket-Key"] = key.Text; clientHeaders["Sec-WebSocket-Version"] = "13"; var clientDirective = new HTTPClientDirective { Method = "GET", Version = new Version(1, 1), PathAndQuery = uri.PathAndQuery, }; await SendResponse(clientHeaders, streamWriter, clientDirective); var serverDirective = HTTPServerDirective.Parse(streamReader.ReadLine()); if (serverDirective.StatusCode != 101) { throw new NotSupportedException("Server Handshake Response"); } await ReadHeaders(streamReader, serverHeaders); return(new WSHTTPConnectionParameters(stream, clientHeaders, serverHeaders, WSHTTPConnectionType.Client)); }
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)); }
public static string Checksum(WSKey key) { var bytes = UTF8.GetBytes(key.Text + WSConsts.KeySuffix); return(Convert.ToBase64String(bytes)); }