public void ReceiveRstStream() { _frameInboundWriter.WriteInboundHeaders(3, _request, 31, false); IHttp2Stream stream = _frameCodec.Connection.Stream(3); Assert.NotNull(stream); Assert.Equal(Http2StreamState.Open, stream.State); IHttp2HeadersFrame expectedHeaders = new DefaultHttp2HeadersFrame(_request, false, 31); IHttp2HeadersFrame actualHeaders = _inboundHandler.ReadInbound <IHttp2HeadersFrame>(); expectedHeaders.Stream = actualHeaders.Stream; Assert.Equal(expectedHeaders, actualHeaders); _frameInboundWriter.WriteInboundRstStream(3, Http2Error.NoError); IHttp2ResetFrame expectedRst = new DefaultHttp2ResetFrame(Http2Error.NoError) { Stream = actualHeaders.Stream }; IHttp2ResetFrame actualRst = _inboundHandler.ReadInbound <IHttp2ResetFrame>(); Assert.Equal(expectedRst, actualRst); Assert.Null(_inboundHandler.ReadInbound()); }
private static void TestUpgrade(Http2ConnectionHandler handler, IChannelHandler multiplexer) { IFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.Http11, HttpMethod.Options, "*"); request.Headers.Set(HttpHeaderNames.Host, "netty.io"); request.Headers.Set(HttpHeaderNames.Connection, "Upgrade, HTTP2-Settings"); request.Headers.Set(HttpHeaderNames.Upgrade, "h2c"); request.Headers.Set((AsciiString)"HTTP2-Settings", "AAMAAABkAAQAAP__"); var parent = new Mock <IServerChannel>(); EmbeddedChannel channel = new EmbeddedChannel(parent.Object, DefaultChannelId.NewInstance(), false, true, new ChannelHandlerAdapter()); IChannelHandlerContext ctx = channel.Pipeline.FirstContext(); Http2ServerUpgradeCodec codec; if (multiplexer == null) { codec = new Http2ServerUpgradeCodec(handler); } else { codec = new Http2ServerUpgradeCodec((Http2FrameCodec)handler, multiplexer); } Assert.True(codec.PrepareUpgradeResponse(ctx, request, new DefaultHttpHeaders())); codec.UpgradeTo(ctx, request); // Flush the channel to ensure we write out all buffered data channel.Flush(); channel.WriteInbound(Http2CodecUtil.ConnectionPrefaceBuf()); Http2FrameInboundWriter writer = new Http2FrameInboundWriter(channel); writer.WriteInboundSettings(new Http2Settings()); writer.WriteInboundRstStream(Http2CodecUtil.HttpUpgradeStreamId, Http2Error.Cancel); Assert.Same(handler, channel.Pipeline.Remove <Http2ConnectionHandler>()); Assert.Null(channel.Pipeline.Get <Http2ConnectionHandler>()); Assert.True(channel.Finish()); // Check that the preface was send (a.k.a the settings frame) var settingsBuffer = channel.ReadOutbound <IByteBuffer>(); Assert.NotNull(settingsBuffer); settingsBuffer.Release(); var buf = channel.ReadOutbound <IByteBuffer>(); Assert.NotNull(buf); buf.Release(); Assert.Null(channel.ReadOutbound()); }