/**
  * If receive a frame with end-of-stream set, send a pre-canned response.
  */
 private static void OnDataRead(IChannelHandlerContext context, IHttp2DataFrame data)
 {
     if (data.IsEndStream)
     {
         SendResponse(context, data.Content);
     }
     else
     {
         // We do not send back the response to the remote-peer, so we need to release it.
         data.Release();
     }
 }
Beispiel #2
0
        /**
         * If receive a frame with end-of-stream set, send a pre-canned response.
         */
        private static void OnDataRead(IChannelHandlerContext ctx, IHttp2DataFrame data)
        {
            IHttp2FrameStream stream = data.Stream;

            if (data.IsEndStream)
            {
                SendResponse(ctx, stream, data.Content);
            }
            else
            {
                // We do not send back the response to the remote-peer, so we need to release it.
                data.Release();
            }

            // Update the flowcontroller
            ctx.WriteAsync(new DefaultHttp2WindowUpdateFrame(data.InitialFlowControlledBytes)
            {
                Stream = stream
            });
        }
Beispiel #3
0
        public void TestEncodeEmptyEndAsClient()
        {
            EmbeddedChannel  ch  = new EmbeddedChannel(new Http2StreamFrameToHttpObjectCodec(false));
            ILastHttpContent end = EmptyLastHttpContent.Default;

            Assert.True(ch.WriteOutbound(end));

            IHttp2DataFrame emptyFrame = ch.ReadOutbound <IHttp2DataFrame>();

            try
            {
                Assert.Equal(0, emptyFrame.Content.ReadableBytes);
                Assert.True(emptyFrame.IsEndStream);
            }
            finally
            {
                emptyFrame.Release();
            }

            Assert.Null(ch.ReadOutbound <object>());
            Assert.False(ch.Finish());
        }
Beispiel #4
0
        public void CreateOutboundStream()
        {
            IChannel childChannel = this.NewOutboundStream(new TestChannelInitializer());

            Assert.True(childChannel.Registered);
            Assert.True(childChannel.Active);

            IHttp2Headers headers = new DefaultHttp2Headers();

            childChannel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(headers));
            IByteBuffer data = Unpooled.Buffer(100).WriteZero(100);

            childChannel.WriteAndFlushAsync(new DefaultHttp2DataFrame(data, true));

            IHttp2HeadersFrame headersFrame = serverLastInboundHandler.BlockingReadInbound <IHttp2HeadersFrame>();

            Assert.NotNull(headersFrame);
            Assert.Equal(3, headersFrame.Stream.Id);
            Assert.Equal(headers, headersFrame.Headers);

            IHttp2DataFrame dataFrame = serverLastInboundHandler.BlockingReadInbound <IHttp2DataFrame>();

            Assert.NotNull(dataFrame);
            Assert.Equal(3, dataFrame.Stream.Id);
            Assert.Equal(data.ResetReaderIndex(), dataFrame.Content);
            Assert.True(dataFrame.IsEndStream);
            dataFrame.Release();

            childChannel.CloseAsync();

            IHttp2ResetFrame rstFrame = serverLastInboundHandler.BlockingReadInbound <IHttp2ResetFrame>();

            Assert.NotNull(rstFrame);
            Assert.Equal(3, rstFrame.Stream.Id);

            serverLastInboundHandler.CheckException();
        }
Beispiel #5
0
        public void EntityRequestEntityResponse()
        {
            _frameInboundWriter.WriteInboundHeaders(1, _request, 0, false);

            IHttp2Stream stream = _frameCodec.Connection.Stream(1);

            Assert.NotNull(stream);
            Assert.Equal(Http2StreamState.Open, stream.State);

            IHttp2HeadersFrame inboundHeaders = _inboundHandler.ReadInbound <IHttp2HeadersFrame>();
            IHttp2FrameStream  stream2        = inboundHeaders.Stream;

            Assert.NotNull(stream2);
            Assert.Equal(1, stream2.Id);
            Assert.Equal(new DefaultHttp2HeadersFrame(_request, false)
            {
                Stream = stream2
            }, inboundHeaders);
            Assert.Null(_inboundHandler.ReadInbound());

            IByteBuffer hello = Http2TestUtil.BB("hello");

            _frameInboundWriter.WriteInboundData(1, hello, 31, true);
            IHttp2DataFrame inboundData = _inboundHandler.ReadInbound <IHttp2DataFrame>();
            IHttp2DataFrame expected    = new DefaultHttp2DataFrame(Http2TestUtil.BB("hello"), true, 31)
            {
                Stream = stream2
            };

            Http2TestUtil.AssertEqualsAndRelease(expected, inboundData);

            Assert.Null(_inboundHandler.ReadInbound());

            _channel.WriteOutbound(new DefaultHttp2HeadersFrame(_response, false)
            {
                Stream = stream2
            });
            _frameWriter.Verify(
                x => x.WriteHeadersAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.Is <int>(v => v == 1),
                    It.Is <IHttp2Headers>(v => v.Equals(_response)),
                    It.Is <int>(v => v == 0),
                    It.Is <bool>(v => v == false),
                    It.IsAny <IPromise>()));

            _channel.WriteOutbound(new DefaultHttp2DataFrame(Http2TestUtil.BB("world"), true, 27)
            {
                Stream = stream2
            });
            var outboundData = new ArgumentCaptor <IByteBuffer>();

            _frameWriter.Verify(
                x => x.WriteDataAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.Is <int>(v => v == 1),
                    It.Is <IByteBuffer>(v => outboundData.Capture(v)),
                    It.Is <int>(v => v == 27),
                    It.Is <bool>(v => v == true),
                    It.IsAny <IPromise>()));

            IByteBuffer bb = Http2TestUtil.BB("world");

            Assert.Equal(bb, outboundData.GetValue());
            Assert.Equal(1, outboundData.GetValue().ReferenceCount);
            bb.Release();
            outboundData.GetValue().Release();

            _frameWriter.Verify(
                x => x.WriteRstStreamAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.IsAny <int>(),
                    It.IsAny <Http2Error>(),
                    It.IsAny <IPromise>()), Times.Never());
            Assert.True(_channel.IsActive);
        }