mirror of https://github.com/grpc/grpc-java.git
netty: prevent IndexOutOfBoundsException when no handler is passed to BufferingHandler
This commit is contained in:
parent
8e6fa122a6
commit
5f60f22b6a
|
|
@ -465,7 +465,7 @@ final class ProtocolNegotiators {
|
||||||
* This check is necessary as a channel may be registered with different event loops during it
|
* This check is necessary as a channel may be registered with different event loops during it
|
||||||
* lifetime and we only want to configure it once.
|
* lifetime and we only want to configure it once.
|
||||||
*/
|
*/
|
||||||
if (handlers != null) {
|
if (handlers != null && handlers.length > 0) {
|
||||||
for (ChannelHandler handler : handlers) {
|
for (ChannelHandler handler : handlers) {
|
||||||
ctx.pipeline().addBefore(ctx.name(), null, handler);
|
ctx.pipeline().addBefore(ctx.name(), null, handler);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import io.grpc.Grpc;
|
||||||
import io.grpc.SecurityLevel;
|
import io.grpc.SecurityLevel;
|
||||||
import io.grpc.internal.GrpcAttributes;
|
import io.grpc.internal.GrpcAttributes;
|
||||||
import io.grpc.internal.testing.TestUtils;
|
import io.grpc.internal.testing.TestUtils;
|
||||||
|
import io.grpc.netty.ProtocolNegotiators.AbstractBufferingHandler;
|
||||||
import io.grpc.netty.ProtocolNegotiators.HostPort;
|
import io.grpc.netty.ProtocolNegotiators.HostPort;
|
||||||
import io.grpc.netty.ProtocolNegotiators.ServerTlsHandler;
|
import io.grpc.netty.ProtocolNegotiators.ServerTlsHandler;
|
||||||
import io.grpc.netty.ProtocolNegotiators.TlsNegotiator;
|
import io.grpc.netty.ProtocolNegotiators.TlsNegotiator;
|
||||||
|
|
@ -584,6 +585,24 @@ public class ProtocolNegotiatorsTest {
|
||||||
elg.shutdownGracefully();
|
elg.shutdownGracefully();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = Test.None.class /* no exception expected */)
|
||||||
|
@SuppressWarnings("TestExceptionChecker")
|
||||||
|
public void bufferingHandler_shouldNotThrowForEmptyHandler() throws Exception {
|
||||||
|
LocalAddress addr = new LocalAddress("local");
|
||||||
|
ChannelFuture unused = new Bootstrap()
|
||||||
|
.channel(LocalChannel.class)
|
||||||
|
.handler(new BufferingHandlerWithoutHandlers())
|
||||||
|
.group(group)
|
||||||
|
.register().sync();
|
||||||
|
ChannelFuture sf = new ServerBootstrap()
|
||||||
|
.channel(LocalServerChannel.class)
|
||||||
|
.childHandler(new ChannelHandlerAdapter() {})
|
||||||
|
.group(group)
|
||||||
|
.bind(addr);
|
||||||
|
// sync will trigger client's NoHandlerBufferingHandler which should not throw
|
||||||
|
sf.sync();
|
||||||
|
}
|
||||||
|
|
||||||
private static class FakeGrpcHttp2ConnectionHandler extends GrpcHttp2ConnectionHandler {
|
private static class FakeGrpcHttp2ConnectionHandler extends GrpcHttp2ConnectionHandler {
|
||||||
|
|
||||||
static GrpcHttp2ConnectionHandler noopHandler() {
|
static GrpcHttp2ConnectionHandler noopHandler() {
|
||||||
|
|
@ -629,4 +648,11 @@ public class ProtocolNegotiatorsTest {
|
||||||
private static ByteBuf bb(String s, Channel c) {
|
private static ByteBuf bb(String s, Channel c) {
|
||||||
return ByteBufUtil.writeUtf8(c.alloc(), s);
|
return ByteBufUtil.writeUtf8(c.alloc(), s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class BufferingHandlerWithoutHandlers extends AbstractBufferingHandler {
|
||||||
|
|
||||||
|
public BufferingHandlerWithoutHandlers(ChannelHandler... handlers) {
|
||||||
|
super(handlers);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue