예제 #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;
        }
예제 #2
0
        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));
        }
예제 #3
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));
        }
예제 #4
0
        public static string Checksum(WSKey key)
        {
            var bytes = UTF8.GetBytes(key.Text + WSConsts.KeySuffix);

            return(Convert.ToBase64String(bytes));
        }