diff --git a/pom.xml b/pom.xml index 8b5a4f23fb..6eb819cfea 100644 --- a/pom.xml +++ b/pom.xml @@ -703,6 +703,7 @@ java.net.StandardProtocolFamily java.nio.channels.spi.SelectorProvider java.net.SocketOption + java.net.StandardSocketOptions java.nio.channels.NetworkChannel diff --git a/transport/src/main/java/io/netty/channel/socket/nio/NioChannelOption.java b/transport/src/main/java/io/netty/channel/socket/nio/NioChannelOption.java index a56e07b382..3f9550f101 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/NioChannelOption.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/NioChannelOption.java @@ -20,6 +20,9 @@ import io.netty.channel.ChannelOption; import java.io.IOException; import java.nio.channels.Channel; +import java.nio.channels.ServerSocketChannel; +import java.util.ArrayList; +import java.util.List; import java.util.Set; /** @@ -55,6 +58,11 @@ public final class NioChannelOption extends ChannelOption { if (!channel.supportedOptions().contains(option.option)) { return false; } + if (channel instanceof ServerSocketChannel && option.option == java.net.StandardSocketOptions.IP_TOS) { + // Skip IP_TOS as a workaround for a JDK bug: + // See http://mail.openjdk.java.net/pipermail/nio-dev/2018-August/005365.html + return false; + } try { channel.setOption(option.option, value); return true; @@ -69,6 +77,11 @@ public final class NioChannelOption extends ChannelOption { if (!channel.supportedOptions().contains(option.option)) { return null; } + if (channel instanceof ServerSocketChannel && option.option == java.net.StandardSocketOptions.IP_TOS) { + // Skip IP_TOS as a workaround for a JDK bug: + // See http://mail.openjdk.java.net/pipermail/nio-dev/2018-August/005365.html + return null; + } try { return channel.getOption(option.option); } catch (IOException e) { @@ -80,12 +93,26 @@ public final class NioChannelOption extends ChannelOption { static ChannelOption[] getOptions(Channel jdkChannel) { java.nio.channels.NetworkChannel channel = (java.nio.channels.NetworkChannel) jdkChannel; Set> supportedOpts = channel.supportedOptions(); - ChannelOption[] extraOpts = new ChannelOption[supportedOpts.size()]; - int i = 0; - for (java.net.SocketOption opt : supportedOpts) { - extraOpts[i++] = new NioChannelOption(opt); + if (channel instanceof ServerSocketChannel) { + List> extraOpts = new ArrayList>(supportedOpts.size()); + for (java.net.SocketOption opt : supportedOpts) { + if (opt == java.net.StandardSocketOptions.IP_TOS) { + // Skip IP_TOS as a workaround for a JDK bug: + // See http://mail.openjdk.java.net/pipermail/nio-dev/2018-August/005365.html + continue; + } + extraOpts.add(new NioChannelOption(opt)); + } + return extraOpts.toArray(new ChannelOption[0]); + } else { + ChannelOption[] extraOpts = new ChannelOption[supportedOpts.size()]; + + int i = 0; + for (java.net.SocketOption opt : supportedOpts) { + extraOpts[i++] = new NioChannelOption(opt); + } + return extraOpts; } - return extraOpts; } } diff --git a/transport/src/test/java/io/netty/channel/socket/nio/AbstractNioChannelTest.java b/transport/src/test/java/io/netty/channel/socket/nio/AbstractNioChannelTest.java index c2a8c43dcc..5652a4ebac 100644 --- a/transport/src/test/java/io/netty/channel/socket/nio/AbstractNioChannelTest.java +++ b/transport/src/test/java/io/netty/channel/socket/nio/AbstractNioChannelTest.java @@ -66,4 +66,14 @@ public abstract class AbstractNioChannelTest { channel.unsafe().closeForcibly(); } } + + @Test + public void testGetOptions() { + T channel = newNioChannel(); + try { + channel.config().getOptions(); + } finally { + channel.unsafe().closeForcibly(); + } + } }