Example #1
0
        public void AutoAckPingFalse()
        {
            var builder = Http2FrameCodecBuilder.ForServer();

            builder.AutoAckPingFrame = false;
            SetUp(builder, new Http2Settings());
            _frameInboundWriter.WriteInboundPing(false, 8);
            _frameWriter.Verify(
                x => x.WritePingAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.Is <bool>(v => v == true),
                    It.Is <long>(v => v == 8L),
                    It.IsAny <IPromise>()),
                Times.Never());
            var frame = _inboundHandler.ReadInbound <IHttp2PingFrame>();

            Assert.False(frame.Ack);
            Assert.Equal(8, frame.Content);

            // Now ack the frame manually.
            _channel.WriteAndFlushAsync(new DefaultHttp2PingFrame(8, true));
            _frameWriter.Verify(
                x => x.WritePingAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.Is <bool>(v => v == true),
                    It.Is <long>(v => v == 8L),
                    It.IsAny <IPromise>()));
        }
Example #2
0
        public void UpgradeToHttp2FrameCodec()
        {
            var b = new Http2FrameCodecBuilder(true);

            b.GracefulShutdownTimeout = TimeSpan.Zero;
            TestUpgrade(b.Build(), null);
        }
        protected override void InitChannel(IChannel channel)
        {
            var pipeline = channel.Pipeline;

            if (_cert is object)
            {
                var tlsSettings = new ClientTlsSettings(_targetHost)
                {
                    ApplicationProtocols = new List <SslApplicationProtocol>(new[]
                    {
                        SslApplicationProtocol.Http2,
                        SslApplicationProtocol.Http11
                    })
                }.AllowAnyServerCertificate();
                pipeline.AddLast("tls", new TlsHandler(tlsSettings));
            }

            var build = Http2FrameCodecBuilder.ForClient();

            build.InitialSettings = Http2Settings.DefaultSettings(); // this is the default, but shows it can be changed.
            Http2FrameCodec http2FrameCodec = build.Build();

            pipeline.AddLast(http2FrameCodec);
            pipeline.AddLast(new Http2MultiplexHandler(new SimpleChannelInboundHandler0()));
        }
        protected override void InitChannel(IChannel ch)
        {
            var pipeline = ch.Pipeline;

            if (_cert is object)
            {
                pipeline.AddLast("tls", new TlsHandler(
                                     stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true),
                                     new ClientTlsSettings(_targetHost)
                {
                    ApplicationProtocols = new List <SslApplicationProtocol>(new[]
                    {
                        SslApplicationProtocol.Http2,
                        //SslApplicationProtocol.Http11
                    })
                }
                                     ));
            }
            var build = Http2FrameCodecBuilder.ForClient();

            build.InitialSettings = Http2Settings.DefaultSettings(); // this is the default, but shows it can be changed.
            Http2FrameCodec http2FrameCodec = build.Build();

            pipeline.AddLast(http2FrameCodec);
            pipeline.AddLast(new Http2MultiplexHandler(new SimpleChannelInboundHandler0()));
        }
 public HttpServerUpgradeHandler.IUpgradeCodec NewUpgradeCodec(ICharSequence protocol)
 {
     if (AsciiString.ContentEquals(Http2CodecUtil.HttpUpgradeProtocolName, protocol))
     {
         return(new Http2ServerUpgradeCodec(Http2FrameCodecBuilder.ForServer().Build(), new HelloWorldHttp2Handler()));
     }
     else
     {
         return(null);
     }
 }
Example #6
0
 public Http2FrameCodecTest()
 {
     _request           = new DefaultHttp2Headers();
     _request.Method    = HttpMethod.Get.AsciiName;
     _request.Scheme    = HttpScheme.Https.Name;
     _request.Authority = new AsciiString("example.org");
     _request.Path      = new AsciiString("/foo");
     _response          = new DefaultHttp2Headers();
     _response.Status   = HttpResponseStatus.OK.CodeAsText;
     SetUp(Http2FrameCodecBuilder.ForServer(), new Http2Settings());
 }
Example #7
0
        public void IterateActiveStreams()
        {
            var builder = Http2FrameCodecBuilder.ForServer();

            builder.EncoderEnforceMaxConcurrentStreams = true;
            SetUp(builder, new Http2Settings().MaxConcurrentStreams(1));

            _frameInboundWriter.WriteInboundHeaders(3, _request, 0, false);

            IHttp2HeadersFrame headersFrame = _inboundHandler.ReadInbound <IHttp2HeadersFrame>();

            Assert.NotNull(headersFrame);

            IHttp2FrameStream activeInbond = headersFrame.Stream;

            IHttp2FrameStream activeOutbound = _frameCodec.NewStream();

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = activeOutbound
            });

            IHttp2FrameStream bufferedOutbound = _frameCodec.NewStream();

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = bufferedOutbound
            });

            //@SuppressWarnings("unused")
            IHttp2FrameStream idleStream = _frameCodec.NewStream();

            ISet <IHttp2FrameStream> activeStreams = new HashSet <IHttp2FrameStream>();

            bool localVisit(IHttp2FrameStream stream)
            {
                activeStreams.Add(stream);
                return(true);
            }

            _frameCodec.ForEachActiveStream(localVisit);

            Assert.Equal(2, activeStreams.Count);

            ISet <IHttp2FrameStream> expectedStreams = new HashSet <IHttp2FrameStream>();

            expectedStreams.Add(activeInbond);
            expectedStreams.Add(activeOutbound);
            Assert.Equal(expectedStreams, activeStreams);
        }
Example #8
0
        private void SetUp(Http2FrameCodecBuilder frameCodecBuilder, Http2Settings initialRemoteSettings)
        {
            // Some tests call this method twice. Once with JUnit's @Before and once directly to pass special settings.
            // This call ensures that in case of two consecutive calls to setUp(), the previous channel is shutdown and
            // ByteBufs are released correctly.
            Dispose0();

            _frameWriter = Http2TestUtil.MockedFrameWriter();

            var builder = frameCodecBuilder.FrameWriter(_frameWriter.Object);

            builder.FrameLogger     = new Http2FrameLogger(Common.Internal.Logging.InternalLogLevel.TRACE);
            builder.InitialSettings = initialRemoteSettings;
            _frameCodec             = frameCodecBuilder.Build();
            _inboundHandler         = new LastInboundHandler();

            _channel            = new EmbeddedChannel();
            _frameInboundWriter = new Http2FrameInboundWriter(_channel);
            //channel.Connect(new InetSocketAddress(0));
            _channel.Pipeline.AddLast(_frameCodec);
            _channel.Pipeline.AddLast(_inboundHandler);
            _channel.Pipeline.FireChannelActive();

            // Handshake
            _frameWriter.Verify(
                x => x.WriteSettingsAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.IsAny <Http2Settings>(),
                    It.IsAny <IPromise>()));
            _frameWriter.VerifyNoOtherCalls();
            _channel.WriteInbound(Http2CodecUtil.ConnectionPrefaceBuf());

            _frameInboundWriter.WriteInboundSettings(initialRemoteSettings);
            _frameWriter.Verify(
                x => x.WriteSettingsAckAsync(
                    It.Is <IChannelHandlerContext>(v => v == _frameCodec._ctx),
                    It.IsAny <IPromise>()));
            _frameInboundWriter.WriteInboundSettingsAck();

            var settingsFrame = _inboundHandler.ReadInbound <IHttp2SettingsFrame>();

            Assert.NotNull(settingsFrame);
            var settingsAckFrame = _inboundHandler.ReadInbound <IHttp2SettingsAckFrame>();

            Assert.NotNull(settingsAckFrame);
        }
Example #9
0
        protected override void ConfigurePipeline(IChannelHandlerContext ctx, SslApplicationProtocol protocol)
        {
            if (SslApplicationProtocol.Http2.Equals(protocol))
            {
                ctx.Pipeline.AddLast(Http2FrameCodecBuilder.ForServer().Build(), new HelloWorldHttp2Handler());
                return;
            }

            if (SslApplicationProtocol.Http11.Equals(protocol))
            {
                ctx.Pipeline.AddLast(new HttpServerCodec(),
                                     new HttpObjectAggregator(MAX_CONTENT_LENGTH),
                                     new Http2Helloworld.Server.HelloWorldHttp1Handler("ALPN Negotiation"));
                return;
            }

            throw new InvalidOperationException("unknown protocol: " + protocol);
        }
Example #10
0
        public void DoNotLeakOnFailedInitializationForChannels()
        {
            // We use a limit of 1 and then increase it step by step.
            SetUp(Http2FrameCodecBuilder.ForServer(), new Http2Settings().MaxConcurrentStreams(2));

            IHttp2FrameStream stream1 = _frameCodec.NewStream();
            IHttp2FrameStream stream2 = _frameCodec.NewStream();

            var stream1HeaderPromise = _channel.NewPromise();
            var stream2HeaderPromise = _channel.NewPromise();

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream1
            },
                                        stream1HeaderPromise);
            _channel.RunPendingTasks();

            _frameInboundWriter.WriteInboundGoAway(stream1.Id, 0L, Unpooled.Empty);

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream2
            },
                                        stream2HeaderPromise);
            _channel.RunPendingTasks();

            try
            {
                stream1HeaderPromise.Task.GetAwaiter().GetResult();
            }
            catch
            {
                Assert.False(true);
            }
            Assert.True(stream2HeaderPromise.IsCompleted);

            Assert.Equal(0, _frameCodec.NumInitializingStreams);
            Assert.False(_channel.FinishAndReleaseAll());
        }
Example #11
0
        public void NewOutboundStreamsShouldBeBuffered()
        {
            var builder = Http2FrameCodecBuilder.ForServer();

            builder.EncoderEnforceMaxConcurrentStreams = true;
            SetUp(builder, new Http2Settings().MaxConcurrentStreams(1));

            var stream1 = _frameCodec.NewStream();
            var stream2 = _frameCodec.NewStream();

            var promise1 = _channel.NewPromise();
            var promise2 = _channel.NewPromise();

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream1
            }, promise1);
            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream2
            }, promise2);

            Assert.True(Http2CodecUtil.IsStreamIdValid(stream1.Id));
            _channel.RunPendingTasks();
            Assert.True(Http2CodecUtil.IsStreamIdValid(stream2.Id));

            Assert.True(promise1.IsSuccess);
            Assert.False(promise2.IsCompleted);

            // Increase concurrent streams limit to 2
            _frameInboundWriter.WriteInboundSettings(new Http2Settings().MaxConcurrentStreams(2));

            _channel.Flush();

            Assert.True(promise2.IsSuccess);
        }
Example #12
0
 public void UpgradeToHttp2FrameCodecWithMultiplexer()
 {
     TestUpgrade(
         Http2FrameCodecBuilder.ForClient().Build(),
         new Http2MultiplexHandler(new HttpInboundHandler(), new HttpInboundHandler()));
 }
Example #13
0
 public void UpgradeToHttp2FrameCodec()
 {
     TestUpgrade(Http2FrameCodecBuilder.ForClient().Build(), null);
 }
Example #14
0
        public void MultipleNewOutboundStreamsShouldBeBuffered()
        {
            var builder = Http2FrameCodecBuilder.ForServer();

            builder.EncoderEnforceMaxConcurrentStreams = true;
            // We use a limit of 1 and then increase it step by step.
            SetUp(builder, new Http2Settings().MaxConcurrentStreams(1));

            IHttp2FrameStream stream1 = _frameCodec.NewStream();
            IHttp2FrameStream stream2 = _frameCodec.NewStream();
            IHttp2FrameStream stream3 = _frameCodec.NewStream();

            IPromise promise1 = _channel.NewPromise();
            IPromise promise2 = _channel.NewPromise();
            IPromise promise3 = _channel.NewPromise();

            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream1
            }, promise1);
            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream2
            }, promise2);
            _channel.WriteAndFlushAsync(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers())
            {
                Stream = stream3
            }, promise3);

            Assert.True(Http2CodecUtil.IsStreamIdValid(stream1.Id));
            _channel.RunPendingTasks();
            Assert.True(Http2CodecUtil.IsStreamIdValid(stream2.Id));

            if (promise1.IsCompleted)
            {
                Assert.True(promise1.Task.IsSuccess());
            }
            else
            {
                try
                {
                    promise1.Task.GetAwaiter().GetResult();
                }
                catch (Exception)
                {
                    Assert.False(true);
                }
            }
            Assert.False(promise2.IsCompleted);
            Assert.False(promise3.IsCompleted);

            // Increase concurrent streams limit to 2
            _frameInboundWriter.WriteInboundSettings(new Http2Settings().MaxConcurrentStreams(2));
            _channel.Flush();

            // As we increased the limit to 2 we should have also succeed the second frame.
            if (promise2.IsCompleted)
            {
                Assert.True(promise2.Task.IsSuccess());
            }
            else
            {
                try
                {
                    promise2.Task.GetAwaiter().GetResult();
                }
                catch (Exception)
                {
                    Assert.False(true);
                }
            }
            Assert.False(promise3.IsCompleted);

            _frameInboundWriter.WriteInboundSettings(new Http2Settings().MaxConcurrentStreams(3));
            _channel.Flush();

            // With the max streams of 3 all streams should be succeed now.
            if (promise3.IsCompleted)
            {
                Assert.True(promise3.Task.IsSuccess());
            }
            else
            {
                try
                {
                    promise3.Task.GetAwaiter().GetResult();
                }
                catch (Exception)
                {
                    Assert.False(true);
                }
            }

            Assert.False(_channel.FinishAndReleaseAll());
        }
Example #15
0
 protected override Http2FrameCodec NewCodec(IChannelHandler upgradeHandler)
 {
     return(Http2FrameCodecBuilder.ForClient().Build());
 }