public override bool Handshake(IWebSocketSession session, WebSocketRequestFilterBase previousFilter, out IRequestFilter <IWebSocketFragment> dataFrameReader) { if (!VersionTag.Equals(session.SecWebSocketVersion) && NextProcessor != null) { return(NextProcessor.Handshake(session, previousFilter, out dataFrameReader)); } dataFrameReader = null; session.ProtocolProcessor = this; var secWebSocketKey = session.Items.GetValue <string>(WebSocketConstant.SecWebSocketKey, string.Empty); if (string.IsNullOrEmpty(secWebSocketKey)) { return(false); } var responseBuilder = new StringBuilder(); string secKeyAccept = string.Empty; try { secKeyAccept = Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(secWebSocketKey + m_Magic))); } catch (Exception) { return(false); } responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseHeadLine10); responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseUpgradeLine); responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseConnectionLine); responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseAcceptLine, secKeyAccept); var subProtocol = session.GetAvailableSubProtocol(session.Items.GetValue <string>(WebSocketConstant.SecWebSocketProtocol, string.Empty)); if (!string.IsNullOrEmpty(subProtocol)) { responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseProtocolLine, subProtocol); } responseBuilder.AppendWithCrCf(); byte[] data = Encoding.UTF8.GetBytes(responseBuilder.ToString()); session.SendRawData(data, 0, data.Length); dataFrameReader = new WebSocketDataFrameRequestFilter(); return(true); }
public override bool Handshake(IWebSocketSession session, WebSocketRequestFilterBase previousFilter, out IRequestFilter <IWebSocketFragment> dataFrameReader) { var secKey1 = session.Items.GetValue <string>(WebSocketConstant.SecWebSocketKey1, string.Empty); var secKey2 = session.Items.GetValue <string>(WebSocketConstant.SecWebSocketKey2, string.Empty); if (string.IsNullOrEmpty(secKey1) && string.IsNullOrEmpty(secKey2) && NextProcessor != null) { return(NextProcessor.Handshake(session, previousFilter, out dataFrameReader)); } session.ProtocolProcessor = this; var secKey3 = session.Items.GetValue <byte[]>(WebSocketConstant.SecWebSocketKey3, m_ZeroKeyBytes); var responseBuilder = new StringBuilder(); responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseHeadLine00); responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseUpgradeLine); responseBuilder.AppendWithCrCf(WebSocketConstant.ResponseConnectionLine); if (!string.IsNullOrEmpty(session.Origin)) { responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseOriginLine, session.Origin); } responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseLocationLine, session.UriScheme, session.Host, session.Path); var subProtocol = session.GetAvailableSubProtocol(session.Items.GetValue <string>(WebSocketConstant.SecWebSocketProtocol, string.Empty)); if (!string.IsNullOrEmpty(subProtocol)) { responseBuilder.AppendFormatWithCrCf(WebSocketConstant.ResponseProtocolLine, subProtocol); } responseBuilder.AppendWithCrCf(); byte[] data = Encoding.UTF8.GetBytes(responseBuilder.ToString()); session.SendRawResponse(data, 0, data.Length); //Encrypt message byte[] secret = GetResponseSecurityKey(secKey1, secKey2, secKey3); session.SendRawResponse(secret, 0, secret.Length); dataFrameReader = new WebSocketDataRequestFilter(previousFilter); return(true); }
public WebSocketDataRequestFilter(WebSocketRequestFilterBase prevFilter) : base(prevFilter) { }
public abstract bool Handshake(IWebSocketSession session, WebSocketRequestFilterBase previousFilter, out IRequestFilter <IWebSocketFragment> dataFrameReader);
/// <summary> /// Initializes a new instance of the <see cref="WebSocketRequestFilterBase"/> class. /// </summary> /// <param name="previousRequestFilter">The previous request filter.</param> public WebSocketRequestFilterBase(WebSocketRequestFilterBase previousRequestFilter) : base(previousRequestFilter) { }
public bool Handshake(IWebSocketSession session, WebSocketRequestFilterBase previousReader, out IRequestFilter <IWebSocketFragment> dataFrameReader) { dataFrameReader = null; session.SocketSession.SendResponse(m_SwitchResponse, 0, m_SwitchResponse.Length); return(true); }
public WebSocketSecKey3RequestFilter(WebSocketRequestFilterBase prevFilter) : base(prevFilter) { }
/// <summary> /// Initializes a new instance of the <see cref="WebSocketRequestFilterBase"/> class. /// </summary> /// <param name="previousRequestFilter">The previous request filter.</param> protected WebSocketRequestFilterBase(WebSocketRequestFilterBase previousRequestFilter) : base(previousRequestFilter) { m_Session = previousRequestFilter.Session; }