/// <summary> /// Handles the WebSocket handshake. /// </summary> /// <param name="channel"></param> /// <param name="request"></param> private void HandleHandshake(ISockNetChannel channel, ref HttpRequest request) { string connection = request.Header["Connection"]; string upgrade = request.Header["Upgrade"]; string securityKey = request.Header[WebSocketUtil.WebSocketKeyHeader]; if (connection != null && upgrade != null && securityKey != null && "websocket".Equals(upgrade.Trim().ToLower()) && "upgrade".Equals(connection.Trim().ToLower())) { string[] requestProtocols = request.Headers[WebSocketUtil.WebSocketProtocolHeader]; List <string> handledProtocols = new List <string>(); if (requestProtocols != null && protocolDelegate != null) { for (int i = 0; i < requestProtocols.Length; i++) { if (protocolDelegate(channel, requestProtocols[i])) { handledProtocols.Add(requestProtocols[i]); } } } HttpResponse response = new HttpResponse(channel.BufferPool) { Version = "HTTP/1.1", Code = "101", Reason = "Switching Protocols" }; response.Header["Upgrade"] = "websocket"; response.Header["Connection"] = "Upgrade"; response.Header[WebSocketUtil.WebSocketAcceptHeader] = WebSocketUtil.GenerateAccept(securityKey); response.Header[WebSocketUtil.WebSocketProtocolHeader] = string.Join(",", handledProtocols.ToArray()); channel.Send(response); channel.RemoveModule(httpModule); channel.Pipe.AddIncomingFirst <object>(HandleIncomingFrames); channel.Pipe.AddOutgoingLast <object>(HandleOutgoingFrames); } else { SockNetLogger.Log(SockNetLogger.LogLevel.ERROR, this, "Expecting upgrade request."); channel.Close(); } }
/// <summary> /// Invoked on channel connect. /// </summary> /// <param name="channel"></param> public void OnConnected(ISockNetChannel channel) { SockNetLogger.Log(SockNetLogger.LogLevel.INFO, this, "Sending WebSocket upgrade request."); channel.Pipe.AddIncomingLast <HttpResponse>(HandleHandshake); HttpRequest request = new HttpRequest(channel.BufferPool) { Action = "GET", Path = path, Version = "HTTP/1.1" }; request.Header["Host"] = hostname; request.Header["Upgrade"] = "websocket"; request.Header["Connection"] = "Upgrade"; request.Header[WebSocketUtil.WebSocketKeyHeader] = secKey; request.Header[WebSocketUtil.WebSocketVersionHeader] = "13"; channel.Send(request); }
/// <summary> /// Invoked on channel connect. /// </summary> /// <param name="channel"></param> public void OnConnected(ISockNetChannel channel) { SockNetLogger.Log(SockNetLogger.LogLevel.INFO, this, "Sending WebSocket upgrade request."); channel.Pipe.AddIncomingLast<HttpResponse>(HandleHandshake); HttpRequest request = new HttpRequest(channel.BufferPool) { Action = "GET", Path = path, Version = "HTTP/1.1" }; request.Header["Host"] = hostname; request.Header["Upgrade"] = "websocket"; request.Header["Connection"] = "Upgrade"; request.Header[WebSocketUtil.WebSocketKeyHeader] = secKey; request.Header[WebSocketUtil.WebSocketVersionHeader] = "13"; channel.Send(request); }
/// <summary> /// Handles the WebSocket handshake. /// </summary> /// <param name="channel"></param> /// <param name="request"></param> private void HandleHandshake(ISockNetChannel channel, ref HttpRequest request) { string connection = request.Header["Connection"]; string upgrade = request.Header["Upgrade"]; string securityKey = request.Header[WebSocketUtil.WebSocketKeyHeader]; if (connection != null && upgrade != null && securityKey != null && "websocket".Equals(upgrade.Trim().ToLower()) && "upgrade".Equals(connection.Trim().ToLower())) { string[] requestProtocols = request.Headers[WebSocketUtil.WebSocketProtocolHeader]; List<string> handledProtocols = new List<string>(); if (requestProtocols != null && protocolDelegate != null) { for (int i = 0; i < requestProtocols.Length; i++) { if (protocolDelegate(channel, requestProtocols[i])) { handledProtocols.Add(requestProtocols[i]); } } } HttpResponse response = new HttpResponse(channel.BufferPool) { Version = "HTTP/1.1", Code = "101", Reason = "Switching Protocols" }; response.Header["Upgrade"] = "websocket"; response.Header["Connection"] = "Upgrade"; response.Header[WebSocketUtil.WebSocketAcceptHeader] = WebSocketUtil.GenerateAccept(securityKey); response.Header[WebSocketUtil.WebSocketProtocolHeader] = string.Join(",", handledProtocols.ToArray()); channel.Send(response); channel.RemoveModule(httpModule); channel.Pipe.AddIncomingFirst<object>(HandleIncomingFrames); channel.Pipe.AddOutgoingLast<object>(HandleOutgoingFrames); } else { SockNetLogger.Log(SockNetLogger.LogLevel.ERROR, this, "Expecting upgrade request."); channel.Close(); } }