private void OnNewHandshakeRequest(IAsyncResult ar) { var parameters = (HandshakeParameter)ar.AsyncState; var requestMessageTrimmed = Encoding.UTF8.GetString(parameters.HandshakeBuffer).TrimEnd("\0".ToCharArray()); var handshakeRequest = new HandshakeRequest(requestMessageTrimmed); var handshakeResponse = _handshakeResponseFactory.GetResponse(handshakeRequest); if (NewConnection == null) { parameters.ClientSocket.Close(); parameters.ClientSocket.Dispose(); return; } var messageDecoder = _messageDecoderFactory.GetDecoder(handshakeRequest.Version); var clientSocket = new ClientSocket(parameters.ClientSocket,new byte[parameters.MessageSize],_maskingService); var messageHandler = new ClientMessageHandler(clientSocket, messageDecoder,new ThreadSafeBuffer()); var clientEvents = new ClientEvents(messageHandler); var clientSender = new ClientSender(messageHandler); var connectionInfo = new ConnectionInfo { Accept = handshakeResponse.AcceptToken, Path = handshakeRequest.Path, Version = handshakeRequest.Version }; NewConnection(clientSender, clientEvents, connectionInfo); parameters.ClientSocket.Send(Encoding.UTF8.GetBytes(handshakeResponse.ToString())); }
public void Parse_Hixie76_Handshake_Correctly() { const string handshakeRequestMessage = @"GET /ws HTTP/1.1 Host: pmx Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Origin: http://pmx Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 7"; var handshakeRequest = new HandshakeRequest(handshakeRequestMessage); handshakeRequest.Connection.ShouldEqual("Upgrade"); handshakeRequest.Host.ShouldEqual("pmx"); handshakeRequest.Key.ShouldEqual("dGhlIHNhbXBsZSBub25jZQ=="); handshakeRequest.Origin.ShouldEqual("http://pmx"); handshakeRequest.Path.ShouldEqual("ws"); handshakeRequest.Upgrade.ShouldEqual("websocket"); handshakeRequest.Version.ShouldEqual(ProtocolVersion.Hixie76); }
public HandshakeResponse GetResponse(HandshakeRequest handshakeRequest) { var keyConverter = _keyConverters.Where(kc => kc.AppliesTo(handshakeRequest.Version)).FirstOrDefault(); return keyConverter == null ? null : new HandshakeResponse(keyConverter.CreateAcceptToken(handshakeRequest.Key)); }