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();
+ }
+ }
}