public void TestNeverSkip()
        {
            IWebSocketExtensionFilter neverSkip = NeverSkipWebSocketExtensionFilter.Instance;

            BinaryWebSocketFrame binaryFrame = new BinaryWebSocketFrame();

            Assert.False(neverSkip.MustSkip(binaryFrame));
            Assert.True(binaryFrame.Release());

            TextWebSocketFrame textFrame = new TextWebSocketFrame();

            Assert.False(neverSkip.MustSkip(textFrame));
            Assert.True(textFrame.Release());

            PingWebSocketFrame pingFrame = new PingWebSocketFrame();

            Assert.False(neverSkip.MustSkip(pingFrame));
            Assert.True(pingFrame.Release());

            PongWebSocketFrame pongFrame = new PongWebSocketFrame();

            Assert.False(neverSkip.MustSkip(pongFrame));
            Assert.True(pongFrame.Release());

            CloseWebSocketFrame closeFrame = new CloseWebSocketFrame();

            Assert.False(neverSkip.MustSkip(closeFrame));
            Assert.True(closeFrame.Release());

            ContinuationWebSocketFrame continuationFrame = new ContinuationWebSocketFrame();

            Assert.False(neverSkip.MustSkip(continuationFrame));
            Assert.True(continuationFrame.Release());
        }
예제 #2
0
        public void NormalFrame()
        {
            var decoderChannel = new EmbeddedChannel(new PerFrameDeflateDecoder(false));

            // initialize
            var payload = new byte[300];

            _random.NextBytes(payload);

            var frame = new BinaryWebSocketFrame(true,
                                                 WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload));

            // execute
            Assert.True(decoderChannel.WriteInbound(frame));
            var newFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            // test
            Assert.NotNull(newFrame);
            Assert.NotNull(newFrame.Content);
            Assert.Equal(WebSocketRsv.Rsv3, newFrame.Rsv);
            Assert.Equal(300, newFrame.Content.ReadableBytes);

            var finalPayload = new byte[300];

            newFrame.Content.ReadBytes(finalPayload);
            Assert.Equal(payload, finalPayload);
            newFrame.Release();
        }
예제 #3
0
        public void AlreadyCompressedFrame()
        {
            var encoderChannel = new EmbeddedChannel(new PerFrameDeflateEncoder(9, 15, false));
            var payload        = new byte[300];

            this.random.NextBytes(payload);

            var frame = new BinaryWebSocketFrame(true,
                                                 WebSocketRsv.Rsv3 | WebSocketRsv.Rsv1, Unpooled.WrappedBuffer(payload));

            encoderChannel.WriteOutbound(frame);
            var newFrame = encoderChannel.ReadOutbound <BinaryWebSocketFrame>();

            Assert.NotNull(newFrame);
            Assert.NotNull(newFrame.Content);
            Assert.IsType <BinaryWebSocketFrame>(newFrame);
            Assert.Equal(WebSocketRsv.Rsv3 | WebSocketRsv.Rsv1, newFrame.Rsv);
            Assert.Equal(300, newFrame.Content.ReadableBytes);

            var finalPayload = new byte[300];

            newFrame.Content.ReadBytes(finalPayload);
            Assert.Equal(payload, finalPayload);
            newFrame.Release();
        }
예제 #4
0
        protected override void Decode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
        {
            var decompressedContent = DecompressContent(ctx, msg);

            WebSocketFrame outMsg = null;

            switch (msg.Opcode)
            {
            case Opcode.Text:
                outMsg = new TextWebSocketFrame(msg.IsFinalFragment, NewRsv(msg), decompressedContent);
                break;

            case Opcode.Binary:
                outMsg = new BinaryWebSocketFrame(msg.IsFinalFragment, NewRsv(msg), decompressedContent);
                break;

            case Opcode.Cont:
                outMsg = new ContinuationWebSocketFrame(msg.IsFinalFragment, NewRsv(msg), decompressedContent);
                break;

            default:
                ThrowHelper.ThrowCodecException_UnexpectedFrameType(msg);
                break;
            }
            output.Add(outMsg);
        }
예제 #5
0
        protected override void Encode(IChannelHandlerContext context, IMessage message, List <object> output)
        {
            Contract.Requires(context != null);
            Contract.Requires(message != null);
            Contract.Requires(output != null);

            IByteBuffer buffer = null;

            try
            {
                int size = message.CalculateSize();
                if (size == 0)
                {
                    return;
                }

                buffer = Unpooled.WrappedBuffer(message.ToByteArray());

                var frame = new BinaryWebSocketFrame(buffer);

                output.Add(frame);
                buffer = null;
                frame  = null;
            }
            catch (Exception exception)
            {
                throw new CodecException(exception);
            }
            finally
            {
                buffer?.Release();
            }
        }
예제 #6
0
        public void CompressedFrame()
        {
            var encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            var decoderChannel = new EmbeddedChannel(new PerFrameDeflateDecoder(false));

            // initialize
            var payload = new byte[300];

            _random.NextBytes(payload);

            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(payload)));
            var compressedPayload = encoderChannel.ReadOutbound <IByteBuffer>();

            var compressedFrame = new BinaryWebSocketFrame(true,
                                                           WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3,
                                                           compressedPayload.Slice(0, compressedPayload.ReadableBytes - 4));

            // execute
            Assert.True(decoderChannel.WriteInbound(compressedFrame));
            var uncompressedFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            // test
            Assert.NotNull(uncompressedFrame);
            Assert.NotNull(uncompressedFrame.Content);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame.Rsv);
            Assert.Equal(300, uncompressedFrame.Content.ReadableBytes);

            var finalPayload = new byte[300];

            uncompressedFrame.Content.ReadBytes(finalPayload);
            Assert.Equal(payload, finalPayload);
            uncompressedFrame.Release();
        }
예제 #7
0
        public void DecompressionSkip()
        {
            EmbeddedChannel encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            EmbeddedChannel decoderChannel = new EmbeddedChannel(new PerFrameDeflateDecoder(false, AlwaysSkipWebSocketExtensionFilter.Instance));

            byte[] payload = new byte[300];
            _random.NextBytes(payload);

            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(payload)));
            var compressedPayload = encoderChannel.ReadOutbound <IByteBuffer>();

            BinaryWebSocketFrame compressedBinaryFrame = new BinaryWebSocketFrame(
                true, WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedPayload);

            Assert.True(decoderChannel.WriteInbound(compressedBinaryFrame));

            var inboundBinaryFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            Assert.NotNull(inboundBinaryFrame);
            Assert.NotNull(inboundBinaryFrame.Content);
            Assert.Equal(compressedPayload, inboundBinaryFrame.Content);
            Assert.Equal(5, inboundBinaryFrame.Rsv);

            Assert.True(inboundBinaryFrame.Release());

            Assert.True(encoderChannel.FinishAndReleaseAll());
            Assert.False(decoderChannel.Finish());
        }
예제 #8
0
        private void HandleBinaryWebSocketFrame(BinaryWebSocketFrame binaryWebSocketFrame, AppSession appSession)
        {
            var byteBuffer = binaryWebSocketFrame.Content;
            var readBytes  = new byte[byteBuffer.ReadableBytes];

            byteBuffer.ReadBytes(readBytes);
            var message = _packetCodec.Decode(readBytes);

            var requestContext = new RequestContext()
            {
                AppSession = appSession, Request = message
            };
            var commandDescriptor = _commandContainer.Get(message.Command);

            if (commandDescriptor != null)
            {
                var commandContext = new CommandContext(commandDescriptor, _serviceProvider);
                if (!(_commandActivator.Create(commandContext) is ICommand command))
                {
                    throw new NotImplementedException();
                }

                command.Execute(requestContext);
            }
            else
            {
                _logger.LogWarning($"The msg' command {byteBuffer} was not found.");
            }
        }
예제 #9
0
        public void CompressedFrame()
        {
            var encoderChannel = new EmbeddedChannel(new PerFrameDeflateEncoder(9, 15, false));
            var decoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));

            var payload = new byte[300];

            this.random.NextBytes(payload);
            var frame = new BinaryWebSocketFrame(true,
                                                 WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload));

            encoderChannel.WriteOutbound(frame);
            var compressedFrame = encoderChannel.ReadOutbound <BinaryWebSocketFrame>();

            Assert.NotNull(compressedFrame);
            Assert.NotNull(compressedFrame.Content);
            Assert.IsType <BinaryWebSocketFrame>(compressedFrame);
            Assert.Equal(WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedFrame.Rsv);

            decoderChannel.WriteInbound(compressedFrame.Content);
            decoderChannel.WriteInbound(DeflateDecoder.FrameTail);
            var uncompressedPayload = decoderChannel.ReadInbound <IByteBuffer>();

            Assert.Equal(300, uncompressedPayload.ReadableBytes);

            var finalPayload = new byte[300];

            uncompressedPayload.ReadBytes(finalPayload);

            Assert.Equal(payload, finalPayload);
            uncompressedPayload.Release();
        }
예제 #10
0
        public async Task SendCommandByBytesAsync(ICommand command)
        {
            WebSocketFrame frame = new BinaryWebSocketFrame();

            frame.Content.SetBytes(0, command.ToBytes());
            await SendMessageAsync(frame);

            _clientHandler.OnSendMessage(command.ToJson());
        }
예제 #11
0
 /// <summary>
 /// 发送数据
 /// </summary>
 /// <param name="channel"></param>
 /// <param name="data"></param>
 /// <returns></returns>
 public static async Task SendDataAsync(this IChannel channel, byte[] data)
 {
     if (channel != null && channel.Open)
     {
         IByteBuffer buffer      = Unpooled.WrappedBuffer(data);
         var         socketFrame = new BinaryWebSocketFrame(buffer);
         await channel.WriteAndFlushAsync(socketFrame);
     }
 }
예제 #12
0
        public static async Task BroadCast(IByteBuffer message)
        {
            if (ChannelGroup == null)
            {
                return;
            }

            BinaryWebSocketFrame frame = new BinaryWebSocketFrame(message);

            message.Retain();
            await ChannelGroup.WriteAndFlushAsync(frame);
        }
예제 #13
0
        public void FragmentedFrame()
        {
            var encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            var decoderChannel = new EmbeddedChannel(new PerMessageDeflateDecoder(false));

            // initialize
            var payload = new byte[300];

            _random.NextBytes(payload);

            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(payload)));
            var compressedPayload = encoderChannel.ReadOutbound <IByteBuffer>();

            compressedPayload = compressedPayload.Slice(0, compressedPayload.ReadableBytes - 4);

            int oneThird         = compressedPayload.ReadableBytes / 3;
            var compressedFrame1 = new BinaryWebSocketFrame(false,
                                                            WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3,
                                                            compressedPayload.Slice(0, oneThird));
            var compressedFrame2 = new ContinuationWebSocketFrame(false,
                                                                  WebSocketRsv.Rsv3, compressedPayload.Slice(oneThird, oneThird));
            var compressedFrame3 = new ContinuationWebSocketFrame(true,
                                                                  WebSocketRsv.Rsv3, compressedPayload.Slice(oneThird * 2,
                                                                                                             compressedPayload.ReadableBytes - oneThird * 2));

            // execute
            Assert.True(decoderChannel.WriteInbound(compressedFrame1.Retain()));
            Assert.True(decoderChannel.WriteInbound(compressedFrame2.Retain()));
            Assert.True(decoderChannel.WriteInbound(compressedFrame3));
            var uncompressedFrame1 = decoderChannel.ReadInbound <BinaryWebSocketFrame>();
            var uncompressedFrame2 = decoderChannel.ReadInbound <ContinuationWebSocketFrame>();
            var uncompressedFrame3 = decoderChannel.ReadInbound <ContinuationWebSocketFrame>();

            // test
            Assert.NotNull(uncompressedFrame1);
            Assert.NotNull(uncompressedFrame2);
            Assert.NotNull(uncompressedFrame3);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame1.Rsv);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame2.Rsv);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame3.Rsv);

            IByteBuffer finalPayloadWrapped = Unpooled.WrappedBuffer(uncompressedFrame1.Content,
                                                                     uncompressedFrame2.Content, uncompressedFrame3.Content);

            Assert.Equal(300, finalPayloadWrapped.ReadableBytes);

            var finalPayload = new byte[300];

            finalPayloadWrapped.ReadBytes(finalPayload);
            Assert.Equal(payload, finalPayload);
            finalPayloadWrapped.Release();
        }
예제 #14
0
        public void IllegalStateWhenDecompressionInProgress()
        {
            var             selectivityDecompressionFilter = new SelectivityDecompressionFilter1();
            EmbeddedChannel encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            EmbeddedChannel decoderChannel = new EmbeddedChannel(
                new PerMessageDeflateDecoder(false, selectivityDecompressionFilter));

            byte[] firstPayload = new byte[200];
            _random.NextBytes(firstPayload);

            byte[] finalPayload = new byte[50];
            _random.NextBytes(finalPayload);

            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(firstPayload)));
            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(finalPayload)));
            var compressedFirstPayload = encoderChannel.ReadOutbound <IByteBuffer>();
            var compressedFinalPayload = encoderChannel.ReadOutbound <IByteBuffer>();

            Assert.True(encoderChannel.FinishAndReleaseAll());

            BinaryWebSocketFrame       firstPart = new BinaryWebSocketFrame(false, WebSocketRsv.Rsv1, compressedFirstPayload);
            ContinuationWebSocketFrame finalPart = new ContinuationWebSocketFrame(true, WebSocketRsv.Rsv1, compressedFinalPayload);

            Assert.True(decoderChannel.WriteInbound(firstPart));

            var outboundFirstPart = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            //first part is decompressed
            Assert.Equal(0, outboundFirstPart.Rsv);
            Assert.Equal(firstPayload, ByteBufferUtil.GetBytes(outboundFirstPart.Content));
            Assert.True(outboundFirstPart.Release());

            //final part throwing exception
            try
            {
                decoderChannel.WriteInbound(finalPart);
                Assert.False(true);
            }
            catch (Exception exc)
            {
                Assert.IsType <DecoderException>(exc);
            }
            finally
            {
                Assert.True(finalPart.Release());
                Assert.False(encoderChannel.FinishAndReleaseAll());
            }
        }
예제 #15
0
        public void CompressionSkipForBinaryFrame()
        {
            EmbeddedChannel encoderChannel = new EmbeddedChannel(new PerMessageDeflateEncoder(9, 15, false, AlwaysSkipWebSocketExtensionFilter.Instance));

            byte[] payload = new byte[300];
            _random.NextBytes(payload);

            WebSocketFrame binaryFrame = new BinaryWebSocketFrame(Unpooled.WrappedBuffer(payload));

            Assert.True(encoderChannel.WriteOutbound(binaryFrame.Copy()));
            var outboundFrame = encoderChannel.ReadOutbound <WebSocketFrame>();

            Assert.Equal(0, outboundFrame.Rsv);
            Assert.Equal(payload, ByteBufferUtil.GetBytes(outboundFrame.Content));
            Assert.True(outboundFrame.Release());

            Assert.False(encoderChannel.Finish());
        }
예제 #16
0
        public void MultiCompressedPayloadWithinFrame()
        {
            var encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            var decoderChannel = new EmbeddedChannel(new PerMessageDeflateDecoder(false));

            var payload1 = new byte[100];

            this.random.NextBytes(payload1);
            var payload2 = new byte[100];

            this.random.NextBytes(payload2);

            encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(payload1));
            var compressedPayload1 = encoderChannel.ReadOutbound <IByteBuffer>();

            encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(payload2));
            var compressedPayload2 = encoderChannel.ReadOutbound <IByteBuffer>();

            var compressedFrame = new BinaryWebSocketFrame(true,
                                                           WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3,
                                                           Unpooled.WrappedBuffer(
                                                               compressedPayload1,
                                                               compressedPayload2.Slice(0, compressedPayload2.ReadableBytes - 4)));

            decoderChannel.WriteInbound(compressedFrame);
            var uncompressedFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            Assert.NotNull(uncompressedFrame);
            Assert.NotNull(uncompressedFrame.Content);
            Assert.IsType <BinaryWebSocketFrame>(uncompressedFrame);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame.Rsv);
            Assert.Equal(200, uncompressedFrame.Content.ReadableBytes);

            var finalPayload1 = new byte[100];

            uncompressedFrame.Content.ReadBytes(finalPayload1);
            Assert.Equal(payload1, finalPayload1);
            var finalPayload2 = new byte[100];

            uncompressedFrame.Content.ReadBytes(finalPayload2);
            Assert.Equal(payload2, finalPayload2);
            uncompressedFrame.Release();
        }
예제 #17
0
        public void IllegalStateWhenCompressionInProgress()
        {
            var             selectivityCompressionFilter = new SelectivityDecompressionFilter1();
            EmbeddedChannel encoderChannel = new EmbeddedChannel(
                new PerMessageDeflateEncoder(9, 15, false, selectivityCompressionFilter));

            byte[] firstPayload = new byte[200];
            _random.NextBytes(firstPayload);

            byte[] finalPayload = new byte[90];
            _random.NextBytes(finalPayload);

            BinaryWebSocketFrame       firstPart = new BinaryWebSocketFrame(false, 0, Unpooled.WrappedBuffer(firstPayload));
            ContinuationWebSocketFrame finalPart = new ContinuationWebSocketFrame(true, 0, Unpooled.WrappedBuffer(finalPayload));

            Assert.True(encoderChannel.WriteOutbound(firstPart));

            var outboundFirstPart = encoderChannel.ReadOutbound <BinaryWebSocketFrame>();

            //first part is compressed
            Assert.Equal(WebSocketRsv.Rsv1, outboundFirstPart.Rsv);
            Assert.NotEqual(firstPayload, ByteBufferUtil.GetBytes(outboundFirstPart.Content));
            Assert.True(outboundFirstPart.Release());

            //final part throwing exception
            try
            {
                encoderChannel.WriteOutbound(finalPart);
                Assert.False(true);
            }
            catch (Exception exc)
            {
                var ae = exc as AggregateException;
                Assert.NotNull(ae);
                Assert.IsType <EncoderException>(ae.InnerException);
            }
            finally
            {
                Assert.True(finalPart.Release());
                Assert.False(encoderChannel.FinishAndReleaseAll());
            }
        }
예제 #18
0
        public void SelectivityCompressionSkip()
        {
            var             selectivityCompressionFilter = new SelectivityDecompressionFilter0();
            EmbeddedChannel encoderChannel = new EmbeddedChannel(
                new PerMessageDeflateEncoder(9, 15, false, selectivityCompressionFilter));
            EmbeddedChannel decoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));

            string textPayload = "not compressed payload";

            byte[] binaryPayload = new byte[101];
            _random.NextBytes(binaryPayload);

            WebSocketFrame       textFrame   = new TextWebSocketFrame(textPayload);
            BinaryWebSocketFrame binaryFrame = new BinaryWebSocketFrame(Unpooled.WrappedBuffer(binaryPayload));

            Assert.True(encoderChannel.WriteOutbound(textFrame));
            Assert.True(encoderChannel.WriteOutbound(binaryFrame));

            var outboundTextFrame = encoderChannel.ReadOutbound <WebSocketFrame>();

            //compression skipped for textFrame
            Assert.Equal(0, outboundTextFrame.Rsv);
            Assert.Equal(textPayload, outboundTextFrame.Content.ToString(Encoding.UTF8));
            Assert.True(outboundTextFrame.Release());

            var outboundBinaryFrame = encoderChannel.ReadOutbound <WebSocketFrame>();

            //compression not skipped for binaryFrame
            Assert.Equal(WebSocketRsv.Rsv1, outboundBinaryFrame.Rsv);

            Assert.True(decoderChannel.WriteInbound(outboundBinaryFrame.Content.Retain()));
            var uncompressedBinaryPayload = decoderChannel.ReadInbound <IByteBuffer>();

            Assert.Equal(binaryPayload, ByteBufferUtil.GetBytes(uncompressedBinaryPayload));

            Assert.True(outboundBinaryFrame.Release());
            Assert.True(uncompressedBinaryPayload.Release());

            Assert.False(encoderChannel.Finish());
            Assert.False(decoderChannel.Finish());
        }
예제 #19
0
        protected override void Encode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
        {
            IByteBuffer compressedContent = null;

            if (msg.Content.IsReadable())
            {
                compressedContent = CompressContent(ctx, msg);
            }
            else if (msg.IsFinalFragment)
            {
                // Set empty DEFLATE block manually for unknown buffer size
                // https://tools.ietf.org/html/rfc7692#section-7.2.3.6
                compressedContent = DeflateDecoder.EmptyDeflateBlock.Duplicate();
            }
            else
            {
                ThrowHelper.ThrowCodecException_CannotCompressContentBuffer();
            }

            WebSocketFrame outMsg = null;

            switch (msg.Opcode)
            {
            case Opcode.Text:
                outMsg = new TextWebSocketFrame(msg.IsFinalFragment, Rsv(msg), compressedContent);
                break;

            case Opcode.Binary:
                outMsg = new BinaryWebSocketFrame(msg.IsFinalFragment, Rsv(msg), compressedContent);
                break;

            case Opcode.Cont:
                outMsg = new ContinuationWebSocketFrame(msg.IsFinalFragment, Rsv(msg), compressedContent);
                break;

            default:
                ThrowHelper.ThrowCodecException_UnexpectedFrameType(msg);
                break;
            }
            output.Add(outMsg);
        }
예제 #20
0
        public void CompressedEmptyFrame()
        {
            var encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            var decoderChannel = new EmbeddedChannel(new PerFrameDeflateDecoder(false));

            encoderChannel.WriteOutbound(Unpooled.Empty);
            var compressedPayload = encoderChannel.ReadOutbound <IByteBuffer>();
            var compressedFrame   =
                new BinaryWebSocketFrame(true, WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedPayload);

            decoderChannel.WriteInbound(compressedFrame);
            var uncompressedFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            Assert.NotNull(uncompressedFrame);
            Assert.NotNull(uncompressedFrame.Content);
            Assert.IsType <BinaryWebSocketFrame>(uncompressedFrame);
            Assert.Equal(WebSocketRsv.Rsv3, uncompressedFrame.Rsv);
            Assert.Equal(0, uncompressedFrame.Content.ReadableBytes);
            uncompressedFrame.Release();
        }
예제 #21
0
        public void SelectivityDecompressionSkip()
        {
            var             selectivityDecompressionFilter = new SelectivityDecompressionFilter0();
            EmbeddedChannel encoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8));
            EmbeddedChannel decoderChannel = new EmbeddedChannel(
                new PerMessageDeflateDecoder(false, selectivityDecompressionFilter));

            string textPayload = "compressed payload";

            byte[] binaryPayload = new byte[300];
            _random.NextBytes(binaryPayload);

            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(textPayload))));
            Assert.True(encoderChannel.WriteOutbound(Unpooled.WrappedBuffer(binaryPayload)));
            var compressedTextPayload   = encoderChannel.ReadOutbound <IByteBuffer>();
            var compressedBinaryPayload = encoderChannel.ReadOutbound <IByteBuffer>();

            TextWebSocketFrame   compressedTextFrame   = new TextWebSocketFrame(true, WebSocketRsv.Rsv1, compressedTextPayload);
            BinaryWebSocketFrame compressedBinaryFrame = new BinaryWebSocketFrame(true, WebSocketRsv.Rsv1, compressedBinaryPayload);

            Assert.True(decoderChannel.WriteInbound(compressedTextFrame));
            Assert.True(decoderChannel.WriteInbound(compressedBinaryFrame));

            var inboundTextFrame   = decoderChannel.ReadInbound <TextWebSocketFrame>();
            var inboundBinaryFrame = decoderChannel.ReadInbound <BinaryWebSocketFrame>();

            Assert.Equal(WebSocketRsv.Rsv1, inboundTextFrame.Rsv);
            Assert.Equal(compressedTextPayload, inboundTextFrame.Content);
            Assert.True(inboundTextFrame.Release());

            Assert.Equal(0, inboundBinaryFrame.Rsv);
            Assert.Equal(binaryPayload, ByteBufferUtil.GetBytes(inboundBinaryFrame.Content));
            Assert.True(inboundBinaryFrame.Release());

            Assert.True(encoderChannel.FinishAndReleaseAll());
            Assert.False(decoderChannel.Finish());
        }
예제 #22
0
            protected override void Decode(IChannelHandlerContext ctx, IByteBuffer msg, List <Object> output)
            {
                WebSocketFrame webSocketFrame = new BinaryWebSocketFrame(msg);

                output.Add(webSocketFrame);
            }
예제 #23
0
        protected internal override void Encode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
        {
            if (this.encoder == null)
            {
                this.encoder = new EmbeddedChannel(
                    ZlibCodecFactory.NewZlibEncoder(
                        ZlibWrapper.None,
                        this.compressionLevel,
                        this.windowSize,
                        8));
            }

            this.encoder.WriteOutbound(msg.Content.Retain());

            CompositeByteBuffer fullCompressedContent = ctx.Allocator.CompositeBuffer();

            for (;;)
            {
                var partCompressedContent = this.encoder.ReadOutbound <IByteBuffer>();
                if (partCompressedContent == null)
                {
                    break;
                }

                if (!partCompressedContent.IsReadable())
                {
                    partCompressedContent.Release();
                    continue;
                }

                fullCompressedContent.AddComponent(true, partCompressedContent);
            }

            if (fullCompressedContent.NumComponents <= 0)
            {
                fullCompressedContent.Release();
                throw new CodecException("cannot read compressed buffer");
            }

            if (msg.IsFinalFragment && this.noContext)
            {
                this.Cleanup();
            }

            IByteBuffer compressedContent;

            if (this.RemoveFrameTail(msg))
            {
                int realLength = fullCompressedContent.ReadableBytes - FrameTail.Length;
                compressedContent = fullCompressedContent.Slice(0, realLength);
            }
            else
            {
                compressedContent = fullCompressedContent;
            }

            WebSocketFrame outMsg;

            if (msg is TextWebSocketFrame)
            {
                outMsg = new TextWebSocketFrame(msg.IsFinalFragment, this.Rsv(msg), compressedContent);
            }
            else if (msg is BinaryWebSocketFrame)
            {
                outMsg = new BinaryWebSocketFrame(msg.IsFinalFragment, this.Rsv(msg), compressedContent);
            }
            else if (msg is ContinuationWebSocketFrame)
            {
                outMsg = new ContinuationWebSocketFrame(msg.IsFinalFragment, this.Rsv(msg), compressedContent);
            }
            else
            {
                throw new CodecException($"unexpected frame type: {msg.GetType().Name}");
            }

            output.Add(outMsg);
        }
 public async Task SendBinaryAsync(byte[] bytes)
 {
     var frame = new BinaryWebSocketFrame(Unpooled.WrappedBuffer(bytes));
     await _channel.WriteAndFlushAsync(frame);
 }
예제 #25
0
        public void FragmentedFrame()
        {
            var encoderChannel = new EmbeddedChannel(new PerMessageDeflateEncoder(9, 15, false, NeverSkipWebSocketExtensionFilter.Instance));
            var decoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));

            // initialize
            var payload1 = new byte[100];

            _random.NextBytes(payload1);
            var payload2 = new byte[100];

            _random.NextBytes(payload2);
            var payload3 = new byte[100];

            _random.NextBytes(payload3);

            var frame1 = new BinaryWebSocketFrame(false,
                                                  WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload1));
            var frame2 = new ContinuationWebSocketFrame(false,
                                                        WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload2));
            var frame3 = new ContinuationWebSocketFrame(true,
                                                        WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload3));

            // execute
            Assert.True(encoderChannel.WriteOutbound(frame1));
            Assert.True(encoderChannel.WriteOutbound(frame2));
            Assert.True(encoderChannel.WriteOutbound(frame3));
            var compressedFrame1 = encoderChannel.ReadOutbound <BinaryWebSocketFrame>();
            var compressedFrame2 = encoderChannel.ReadOutbound <ContinuationWebSocketFrame>();
            var compressedFrame3 = encoderChannel.ReadOutbound <ContinuationWebSocketFrame>();

            // test
            Assert.NotNull(compressedFrame1);
            Assert.NotNull(compressedFrame2);
            Assert.NotNull(compressedFrame3);
            Assert.Equal(WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedFrame1.Rsv);
            Assert.Equal(WebSocketRsv.Rsv3, compressedFrame2.Rsv);
            Assert.Equal(WebSocketRsv.Rsv3, compressedFrame3.Rsv);
            Assert.False(compressedFrame1.IsFinalFragment);
            Assert.False(compressedFrame2.IsFinalFragment);
            Assert.True(compressedFrame3.IsFinalFragment);

            Assert.True(decoderChannel.WriteInbound(compressedFrame1.Content));
            var uncompressedPayload1 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload1        = new byte[100];

            uncompressedPayload1.ReadBytes(finalPayload1);
            Assert.Equal(payload1, finalPayload1);
            uncompressedPayload1.Release();

            Assert.True(decoderChannel.WriteInbound(compressedFrame2.Content));
            var uncompressedPayload2 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload2        = new byte[100];

            uncompressedPayload2.ReadBytes(finalPayload2);
            Assert.Equal(payload2, finalPayload2);
            uncompressedPayload2.Release();

            Assert.True(decoderChannel.WriteInbound(compressedFrame3.Content));
            Assert.True(decoderChannel.WriteInbound(DeflateDecoder.FrameTail.Duplicate()));
            var uncompressedPayload3 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload3        = new byte[100];

            uncompressedPayload3.ReadBytes(finalPayload3);
            Assert.Equal(payload3, finalPayload3);
            uncompressedPayload3.Release();
        }
예제 #26
0
        protected internal override void Decode(IChannelHandlerContext ctx, WebSocketFrame msg, List <object> output)
        {
            if (this.decoder == null)
            {
                if (!(msg is TextWebSocketFrame) && !(msg is BinaryWebSocketFrame))
                {
                    throw new CodecException($"unexpected initial frame type: {msg.GetType().Name}");
                }

                this.decoder = new EmbeddedChannel(ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));
            }

            bool readable = msg.Content.IsReadable();

            this.decoder.WriteInbound(msg.Content.Retain());
            if (this.AppendFrameTail(msg))
            {
                this.decoder.WriteInbound(Unpooled.WrappedBuffer(FrameTail));
            }

            CompositeByteBuffer compositeUncompressedContent = ctx.Allocator.CompositeDirectBuffer();

            for (;;)
            {
                var partUncompressedContent = this.decoder.ReadInbound <IByteBuffer>();
                if (partUncompressedContent == null)
                {
                    break;
                }

                if (!partUncompressedContent.IsReadable())
                {
                    partUncompressedContent.Release();
                    continue;
                }

                compositeUncompressedContent.AddComponent(true, partUncompressedContent);
            }

            // Correctly handle empty frames
            // See https://github.com/netty/netty/issues/4348
            if (readable && compositeUncompressedContent.NumComponents <= 0)
            {
                compositeUncompressedContent.Release();
                throw new CodecException("cannot read uncompressed buffer");
            }

            if (msg.IsFinalFragment && this.noContext)
            {
                this.Cleanup();
            }

            WebSocketFrame outMsg;

            if (msg is TextWebSocketFrame)
            {
                outMsg = new TextWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else if (msg is BinaryWebSocketFrame)
            {
                outMsg = new BinaryWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else if (msg is ContinuationWebSocketFrame)
            {
                outMsg = new ContinuationWebSocketFrame(msg.IsFinalFragment, this.NewRsv(msg), compositeUncompressedContent);
            }
            else
            {
                throw new CodecException($"unexpected frame type: {msg.GetType().Name}");
            }

            output.Add(outMsg);
        }
예제 #27
0
        public void FramementedFrame()
        {
            var encoderChannel = new EmbeddedChannel(new PerFrameDeflateEncoder(9, 15, false));
            var decoderChannel = new EmbeddedChannel(
                ZlibCodecFactory.NewZlibDecoder(ZlibWrapper.None));

            var payload1 = new byte[100];

            this.random.NextBytes(payload1);
            var payload2 = new byte[100];

            this.random.NextBytes(payload2);
            var payload3 = new byte[100];

            this.random.NextBytes(payload3);

            var frame1 = new BinaryWebSocketFrame(false,
                                                  WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload1));
            var frame2 = new ContinuationWebSocketFrame(false,
                                                        WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload2));
            var frame3 = new ContinuationWebSocketFrame(true,
                                                        WebSocketRsv.Rsv3, Unpooled.WrappedBuffer(payload3));

            encoderChannel.WriteOutbound(frame1);
            encoderChannel.WriteOutbound(frame2);
            encoderChannel.WriteOutbound(frame3);
            var compressedFrame1 = encoderChannel.ReadOutbound <BinaryWebSocketFrame>();
            var compressedFrame2 = encoderChannel.ReadOutbound <ContinuationWebSocketFrame>();
            var compressedFrame3 = encoderChannel.ReadOutbound <ContinuationWebSocketFrame>();

            Assert.NotNull(compressedFrame1);
            Assert.NotNull(compressedFrame2);
            Assert.NotNull(compressedFrame3);
            Assert.Equal(WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedFrame1.Rsv);
            Assert.Equal(WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedFrame2.Rsv);
            Assert.Equal(WebSocketRsv.Rsv1 | WebSocketRsv.Rsv3, compressedFrame3.Rsv);
            Assert.False(compressedFrame1.IsFinalFragment);
            Assert.False(compressedFrame2.IsFinalFragment);
            Assert.True(compressedFrame3.IsFinalFragment);

            decoderChannel.WriteInbound(compressedFrame1.Content);
            decoderChannel.WriteInbound(Unpooled.WrappedBuffer(DeflateDecoder.FrameTail));
            var uncompressedPayload1 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload1        = new byte[100];

            uncompressedPayload1.ReadBytes(finalPayload1);
            Assert.Equal(payload1, finalPayload1);
            uncompressedPayload1.Release();

            decoderChannel.WriteInbound(compressedFrame2.Content);
            decoderChannel.WriteInbound(Unpooled.WrappedBuffer(DeflateDecoder.FrameTail));
            var uncompressedPayload2 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload2        = new byte[100];

            uncompressedPayload2.ReadBytes(finalPayload2);
            Assert.Equal(payload2, finalPayload2);
            uncompressedPayload2.Release();

            decoderChannel.WriteInbound(compressedFrame3.Content);
            decoderChannel.WriteInbound(Unpooled.WrappedBuffer(DeflateDecoder.FrameTail));
            var uncompressedPayload3 = decoderChannel.ReadInbound <IByteBuffer>();
            var finalPayload3        = new byte[100];

            uncompressedPayload3.ReadBytes(finalPayload3);
            Assert.Equal(payload3, finalPayload3);
            uncompressedPayload3.Release();
        }