/// <summary> /// 处理握手 /// </summary> /// <param name="session">会话对象</param> /// <param name="buffer">接收到的数据</param> private void ProcessHandshake(T session, ReceiveBuffer buffer) { var request = default(HttpRequest); try { request = HttpRequest.Parse(buffer, this.LocalEndPoint, session.RemoteEndPoint); } catch (Exception) { session.Close(); return; } // http请求的数据未完整 if (request == null) { return; } if (this.OnHandshake(session, request) == false) { session.Close(); return; } // 握手成功 try { var response = new HandshakeResponse(request); session.SendResponse(response); } catch (Exception) { } finally { session.TagData.Set("HANDSHAKED", true); } }
/// <summary> /// 收到WebSocket的握手请求 /// </summary> /// <param name="context">上下文</param> /// <returns></returns> private Task OnWebSocketHandshakeRequest(IContenxt context) { try { var httpRequest = default(HttpRequest); if (HttpRequest.Parse(context, out httpRequest) == false) { return(this.Next.Invoke(context)); } if (httpRequest == null || httpRequest.IsWebsocketRequest() == false) { return(this.Next.Invoke(context)); } const string seckey = "Sec-WebSocket-Key"; var secValue = httpRequest.Headers[seckey]; return(this.ResponseHandshake(context, secValue)); } catch (Exception) { return(this.Next.Invoke(context)); } }