Exemple #1
0
        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;
        }
Exemple #2
0
        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));
        }