コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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;
        }
コード例 #4
0
        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;
                }
            }
        }