Not add inboundStreamHandler for outbound streams created by Http2MultiplexCodec.

Motivation:

We must not add the inboundStreamHandler for outbound streams creates by Http2MultiplexCodec as the user will specify a handler via Http2StreamChannelBootstrap.

Modifications:

- Check if the stream is for outbound and if so not add the inboundStreamHandler to the pipeline
- Update tests so this is covered.

Result:

Fixes [#7178]
This commit is contained in:
Norman Maurer 2017-09-05 18:34:34 +01:00
parent 5c572f0f63
commit 870b5f5e4b
2 changed files with 16 additions and 6 deletions

View File

@ -239,7 +239,7 @@ public class Http2MultiplexCodec extends Http2FrameCodec {
break;
}
// fall-trough
DefaultHttp2StreamChannel childChannel = new DefaultHttp2StreamChannel(stream);
DefaultHttp2StreamChannel childChannel = new DefaultHttp2StreamChannel(stream, false);
ChannelFuture future = ctx.channel().eventLoop().register(childChannel);
if (future.isDone()) {
registerDone(future);
@ -266,7 +266,7 @@ public class Http2MultiplexCodec extends Http2FrameCodec {
// TODO: This is most likely not the best way to expose this, need to think more about it.
final Http2StreamChannel newOutboundStream() {
return new DefaultHttp2StreamChannel(newStream());
return new DefaultHttp2StreamChannel(newStream(), true);
}
@Override
@ -403,6 +403,7 @@ public class Http2MultiplexCodec extends Http2FrameCodec {
private final ChannelPipeline pipeline;
private final Http2FrameStream stream;
private final ChannelPromise closePromise;
private final boolean outbound;
private volatile boolean registered;
private volatile boolean writable;
@ -427,8 +428,9 @@ public class Http2MultiplexCodec extends Http2FrameCodec {
// channelReadComplete(...)
DefaultHttp2StreamChannel next;
DefaultHttp2StreamChannel(Http2FrameStream stream) {
DefaultHttp2StreamChannel(Http2FrameStream stream, boolean outbound) {
this.stream = stream;
this.outbound = outbound;
((Http2MultiplexCodecStream) stream).channel = this;
pipeline = new DefaultChannelPipeline(this) {
@Override
@ -791,8 +793,10 @@ public class Http2MultiplexCodec extends Http2FrameCodec {
registered = true;
// Add the handler to the pipeline now that we are registered.
pipeline().addLast(inboundStreamHandler);
if (!outbound) {
// Add the handler to the pipeline now that we are registered.
pipeline().addLast(inboundStreamHandler);
}
promise.setSuccess();

View File

@ -32,6 +32,7 @@ import io.netty.channel.local.LocalChannel;
import io.netty.channel.local.LocalServerChannel;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@ -82,7 +83,12 @@ public class Http2MultiplexCodecBuilderTest {
Bootstrap cb = new Bootstrap()
.channel(LocalChannel.class)
.group(group)
.handler(new Http2MultiplexCodecBuilder(false, new TestChannelInitializer()).build());
.handler(new Http2MultiplexCodecBuilder(false, new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
Assert.fail("Should not be called for outbound streams");
}
}).build());
clientChannel = cb.connect(serverAddress).sync().channel();
assertTrue(serverChannelLatch.await(5, SECONDS));
}