public override WebSocketCommandInfo FindCommand(SocketContext context, byte[] readBuffer, int offset, int length, bool isReusableBuffer) { int total = BufferSegments.Count + length; var socketContext = context as WebSocketContext; if (total == 8) { List<byte> key = new List<byte>(); key.AddRange(BufferSegments.ToArrayData()); key.AddRange(readBuffer.Skip(offset).Take(length)); socketContext.SecWebSocketKey3 = key.ToArray(); BufferSegments.ClearSegements(); NextCommandReader = new WebSocketDataReader(this); return CreateHeadCommandInfo(); } else if (total > 8) { List<byte> key = new List<byte>(); key.AddRange(BufferSegments.ToArrayData()); key.AddRange(readBuffer.Skip(offset).Take(8 - BufferSegments.Count)); socketContext.SecWebSocketKey3 = key.ToArray(); BufferSegments.ClearSegements(); AddArraySegment(readBuffer, offset + 8 - BufferSegments.Count, total - 8, isReusableBuffer); NextCommandReader = new WebSocketDataReader(this); return CreateHeadCommandInfo(); } else { AddArraySegment(readBuffer, offset, length, isReusableBuffer); NextCommandReader = this; return null; } }
public override bool Handshake(IWebSocketSession session, WebSocketReaderBase previousReader, out ICommandReader <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, previousReader, 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)) { Extensions.AppendFormatWithCrCf(responseBuilder, WebSocketConstant.ResponseOriginLine, session.Origin); } Extensions.AppendFormatWithCrCf(responseBuilder, WebSocketConstant.ResponseLocationLine, session.UriScheme, session.Host, session.Path); var subProtocol = session.GetAvailableSubProtocol(session.Items.GetValue <string>(WebSocketConstant.SecWebSocketProtocol, string.Empty)); if (!string.IsNullOrEmpty(subProtocol)) { Extensions.AppendFormatWithCrCf(responseBuilder, WebSocketConstant.ResponseProtocolLine, subProtocol); } responseBuilder.AppendWithCrCf(); session.SocketSession.SendResponse(responseBuilder.ToString()); //Encrypt message byte[] secret = GetResponseSecurityKey(secKey1, secKey2, secKey3); session.SocketSession.SendResponse(secret, 0, secret.Length); dataFrameReader = new WebSocketDataReader(previousReader); return(true); }
public override bool Handshake(IWebSocketSession session, WebSocketReaderBase previousReader, out ICommandReader<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, previousReader, 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(); session.SocketSession.SendResponse(responseBuilder.ToString()); //Encrypt message byte[] secret = GetResponseSecurityKey(secKey1, secKey2, secKey3); session.SocketSession.SendResponse(secret, 0, secret.Length); dataFrameReader = new WebSocketDataReader(previousReader); return true; }
public override WebSocketCommandInfo FindCommand(SocketContext context, byte[] readBuffer, int offset, int length, bool isReusableBuffer) { AddArraySegment(readBuffer, offset, length, isReusableBuffer); int? result = BufferSegments.SearchMark(m_HeaderTerminator); if (!result.HasValue || result.Value <= 0) { NextCommandReader = this; return null; } string header = Encoding.UTF8.GetString(BufferSegments.ToArrayData(0, result.Value)); var socketContext = context as WebSocketContext; WebSocketServer.ParseHandshake(socketContext, new StringReader(header)); var secWebSocketKey1 = socketContext.SecWebSocketKey1; var secWebSocketKey2 = socketContext.SecWebSocketKey2; int left = BufferSegments.Count - result.Value - m_HeaderTerminator.Length; BufferSegments.ClearSegements(); if (string.IsNullOrEmpty(secWebSocketKey1) && string.IsNullOrEmpty(secWebSocketKey2)) { //v.75 if (left > 0) AddArraySegment(readBuffer, offset + length - left, left, isReusableBuffer); NextCommandReader = new WebSocketDataReader(this); return CreateHeadCommandInfo(); } else { //v.76 //Read SecWebSocketKey3(8 bytes) if (left == 8) { socketContext.SecWebSocketKey3 = readBuffer.Skip(offset + length - left).Take(left).ToArray(); NextCommandReader = new WebSocketDataReader(this); return CreateHeadCommandInfo(); } else if (left > 8) { socketContext.SecWebSocketKey3 = readBuffer.Skip(offset + length - left).Take(8).ToArray(); AddArraySegment(readBuffer, offset + length - left + 8, left - 8, isReusableBuffer); NextCommandReader = new WebSocketDataReader(this); return CreateHeadCommandInfo(); } else { //left < 8 if (left > 0) AddArraySegment(readBuffer, offset + length - left, left, isReusableBuffer); NextCommandReader = new WebSocketSecKey3Reader(this); return null; } } }