Exemple #1
0
        public void DecodeFrameSimpleBuf()
        {
            WebSocketFrame frame;

            _decoderStateMachine.Read(_messageByteBuf1, out frame);
            _decoderStateMachine.Read(_messageByteBuf2, out frame);
            _decoderStateMachine.Read(_messageByteBuf3, out frame);
            _decoderStateMachine.Read(_messageByteBuf4, out frame);
            _decoderStateMachine.Read(_messageByteBuf5, out frame);
            _decoderStateMachine.Read(_messageByteBuf6, out frame);
            _decoderStateMachine.Read(_messageByteBuf7, out frame);
            _decoderStateMachine.Read(_messageByteBuf8, out frame);
            _decoderStateMachine.Read(_messageByteBuf9, out frame);
            _decoderStateMachine.Read(_messageByteBuf10, out frame);
        }
        protected override ByteBuf DecodeOne(ByteBuf byteBuf)
        {
            WebSocketFrameInfo?frameInfo;

            _decoderStateMachine.Read(byteBuf, out frameInfo);

            ByteBuf outputByteBuf = null;

            if (frameInfo != null)
            {
                WebSocketFrameInfo info = (WebSocketFrameInfo)frameInfo;

                outputByteBuf = this.Pipeline.GetBuffer();

                for (int i = 0; i < info.PayloadDataLen; i++)
                {
                    if (info.Masked)
                    {
                        outputByteBuf.Write((byte)(byteBuf.ReadByte() ^ info.MaskBytes[i % 4]));
                    }
                    else
                    {
                        outputByteBuf.Write(byteBuf.ReadByte());
                    }
                }

                //Console.WriteLine(outputByteBuf.Dump(System.Text.Encoding.UTF8));
            }

            // Как минимум мы можем освободить прочитанную часть.
            // Буфер при этом не освободится полностью.
            byteBuf.ReleaseReaded();

            return(outputByteBuf);
        }
        protected override WebSocketFrame DecodeOne(IChannelHandlerContext ctx, ByteBuf byteBuf)
        {
            // Сохраняем ссылку на буфер, чтобы иметь возможность полностью освободить его, при деконструкции декодера.
            _byteBuf = byteBuf;

            WebSocketFrame frame;

            _decoderStateMachine.Read(byteBuf, out frame);

            // Как минимум мы можем освободить прочитанную часть.
            // Буфер при этом не освободится полностью.
            byteBuf.ReleaseReaded();

            return(frame);
        }
        public void WebSocketDecoderCycleTest1(
            byte[] message,
            bool fin,
            bool mask,
            byte opCode,
            int payloadLen,
            string payloadTextData)
        {
            ByteBuf byteBuf = new SimpleByteBuf(message);

            var decoderCycle = new WebSocketDecoderStateMachine();

            WebSocketFrame frame;

            decoderCycle.Read(byteBuf, out frame);

            Assert.True(frame != null);
            Assert.True(frame.IsFinal = fin);
            Assert.True(frame.Type == WebSocketFrameType.Text);
            Assert.True(frame.Text.Equals(payloadTextData));
        }