public void GoAwayLastStreamIdOverflowed() { _frameInboundWriter.WriteInboundHeaders(5, _request, 31, false); IHttp2Stream stream = _frameCodec.Connection.Stream(5); Assert.NotNull(stream); Assert.Equal(Http2StreamState.Open, stream.State); var debugData = Http2TestUtil.BB("debug"); IHttp2GoAwayFrame goAwayFrame = new DefaultHttp2GoAwayFrame(Http2Error.NoError, debugData.RetainedDuplicate()); goAwayFrame.ExtraStreamIds = int.MaxValue; _channel.WriteOutbound(goAwayFrame); // When the last stream id computation overflows, the last stream id should just be set to 2^31 - 1. _frameWriter.Verify( x => x.WriteGoAwayAsync( It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx), It.Is <int>(v => v == int.MaxValue), It.Is <Http2Error>(v => v == Http2Error.NoError), It.Is <IByteBuffer>(v => v.Equals(debugData)), It.IsAny <IPromise>())); debugData.Release(); Assert.Equal(Http2StreamState.Open, stream.State); Assert.True(_channel.IsActive); }
public void SendGoAway() { _frameInboundWriter.WriteInboundHeaders(3, _request, 31, false); IHttp2Stream stream = _frameCodec.Connection.Stream(3); Assert.NotNull(stream); Assert.Equal(Http2StreamState.Open, stream.State); IByteBuffer debugData = Http2TestUtil.BB("debug"); IByteBuffer expected = debugData.Copy(); IHttp2GoAwayFrame goAwayFrame = new DefaultHttp2GoAwayFrame(Http2Error.NoError, debugData.RetainedDuplicate()); goAwayFrame.ExtraStreamIds = 2; _channel.WriteOutbound(goAwayFrame); _frameWriter.Verify( x => x.WriteGoAwayAsync( It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx), It.Is <int>(v => v == 7), It.Is <Http2Error>(v => v == Http2Error.NoError), It.Is <IByteBuffer>(v => v.Equals(expected)), It.IsAny <IPromise>())); Assert.Equal(Http2StreamState.Open, stream.State); Assert.True(_channel.IsActive); expected.Release(); debugData.Release(); }
public void ReceiveGoaway() { IByteBuffer debugData = Http2TestUtil.BB("foo"); _frameInboundWriter.WriteInboundGoAway(2, Http2Error.NoError, debugData); IHttp2GoAwayFrame expectedFrame = new DefaultHttp2GoAwayFrame(2, Http2Error.NoError, Http2TestUtil.BB("foo")); IHttp2GoAwayFrame actualFrame = _inboundHandler.ReadInbound <IHttp2GoAwayFrame>(); Http2TestUtil.AssertEqualsAndRelease(expectedFrame, actualFrame); Assert.Null(_inboundHandler.ReadInbound()); }
public void UpgradeWithoutFlowControlling() { _channel.Pipeline.AddAfter(_frameCodec._ctx.Name, null, new TestUpgradeChannelHandler()); _frameInboundWriter.WriteInboundHeaders(Http2CodecUtil.HttpUpgradeStreamId, _request, 31, false); string longString = "*".PadRight(70000, '*'); DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.Http11, HttpMethod.Get, "/", Http2TestUtil.BB(longString)); var constructors = typeof(HttpServerUpgradeHandler.UpgradeEvent).GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); var upgradeEvent = (HttpServerUpgradeHandler.UpgradeEvent)constructors[0].Invoke(new object[] { (AsciiString)"HTTP/2", request }); _channel.Pipeline.FireUserEventTriggered(upgradeEvent); }
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); }