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()); }
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); }
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(); }
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()); } }
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()); } }
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); }
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); }
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(); }
public void FragmentedFrameWithLeftOverInLastFragment() { string hexDump = "677170647a777a737574656b707a787a6f6a7561756578756f6b7868616371716c657a6d64697479766d726f6" + "269746c6376777464776f6f72767a726f64667278676764687775786f6762766d776d706b76697773777a7072" + "6a6a737279707a7078697a6c69616d7461656d646278626d786f66666e686e776a7a7461746d7a776668776b6" + "f6f736e73746575637a6d727a7175707a6e74627578687871767771697a71766c64626d78726d6d7675756877" + "62667963626b687a726d676e646263776e67797264706d6c6863626577616967706a78636a72697464756e627" + "977616f79736475676f76736f7178746a7a7479626c64636b6b6778637768746c62"; EmbeddedChannel encoderChannel = new EmbeddedChannel( ZlibCodecFactory.NewZlibEncoder(ZlibWrapper.None, 9, 15, 8)); EmbeddedChannel decoderChannel = new EmbeddedChannel(new PerMessageDeflateDecoder(false)); IByteBuffer originPayload = Unpooled.WrappedBuffer(StringUtil.DecodeHexDump(hexDump)); Assert.True(encoderChannel.WriteOutbound(originPayload.Duplicate().Retain())); var compressedPayload = encoderChannel.ReadOutbound <IByteBuffer>(); compressedPayload = compressedPayload.Slice(0, compressedPayload.ReadableBytes - 4); int oneThird = compressedPayload.ReadableBytes / 3; TextWebSocketFrame compressedFrame1 = new TextWebSocketFrame( false, WebSocketRsv.Rsv1, compressedPayload.Slice(0, oneThird)); ContinuationWebSocketFrame compressedFrame2 = new ContinuationWebSocketFrame( false, WebSocketRsv.Rsv3, compressedPayload.Slice(oneThird, oneThird)); ContinuationWebSocketFrame compressedFrame3 = new ContinuationWebSocketFrame( false, WebSocketRsv.Rsv3, compressedPayload.Slice(oneThird * 2, oneThird)); int offset = oneThird * 3; ContinuationWebSocketFrame compressedFrameWithExtraData = new ContinuationWebSocketFrame( true, WebSocketRsv.Rsv3, compressedPayload.Slice(offset, compressedPayload.ReadableBytes - offset)); // check that last fragment contains only one extra byte Assert.Equal(1, compressedFrameWithExtraData.Content.ReadableBytes); Assert.Equal(1, compressedFrameWithExtraData.Content.GetByte(0)); // write compressed frames Assert.True(decoderChannel.WriteInbound(compressedFrame1.Retain())); Assert.True(decoderChannel.WriteInbound(compressedFrame2.Retain())); Assert.True(decoderChannel.WriteInbound(compressedFrame3.Retain())); Assert.True(decoderChannel.WriteInbound(compressedFrameWithExtraData)); // read uncompressed frames TextWebSocketFrame uncompressedFrame1 = decoderChannel.ReadInbound <TextWebSocketFrame>(); ContinuationWebSocketFrame uncompressedFrame2 = decoderChannel.ReadInbound <ContinuationWebSocketFrame>(); ContinuationWebSocketFrame uncompressedFrame3 = decoderChannel.ReadInbound <ContinuationWebSocketFrame>(); ContinuationWebSocketFrame uncompressedExtraData = decoderChannel.ReadInbound <ContinuationWebSocketFrame>(); Assert.False(uncompressedExtraData.Content.IsReadable()); var uncompressedPayload = Unpooled.WrappedBuffer(uncompressedFrame1.Content, uncompressedFrame2.Content, uncompressedFrame3.Content, uncompressedExtraData.Content); Assert.Equal(originPayload, uncompressedPayload); Assert.True(originPayload.Release()); Assert.True(uncompressedPayload.Release()); Assert.True(encoderChannel.FinishAndReleaseAll()); Assert.False(decoderChannel.Finish()); }
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(); }
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); }