diff --git a/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolConfig.java b/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolConfig.java index 9552c75179..d5562bada2 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolConfig.java +++ b/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolConfig.java @@ -15,18 +15,23 @@ */ package io.netty.handler.ssl; -import static io.netty.handler.ssl.ApplicationProtocolUtil.toList; -import static io.netty.util.internal.ObjectUtil.checkNotNull; - +import javax.net.ssl.SSLEngine; import java.util.Collections; import java.util.List; -import javax.net.ssl.SSLEngine; +import static io.netty.handler.ssl.ApplicationProtocolUtil.*; +import static io.netty.util.internal.ObjectUtil.*; /** * Provides an {@link SSLEngine} agnostic way to configure a {@link ApplicationProtocolNegotiator}. */ public final class ApplicationProtocolConfig { + + /** + * The configuration that disables application protocol negotiation. + */ + public static final ApplicationProtocolConfig DISABLED = new ApplicationProtocolConfig(); + private final List supportedProtocols; private final Protocol protocol; private final SelectorFailureBehavior selectorBehavior; @@ -63,12 +68,27 @@ public final class ApplicationProtocolConfig { * @param selectedBehavior How the peer being notified of the selected protocol should behave. * @param supportedProtocols The order of iteration determines the preference of support for protocols. */ - private ApplicationProtocolConfig(Protocol protocol, SelectorFailureBehavior selectorBehavior, + private ApplicationProtocolConfig( + Protocol protocol, SelectorFailureBehavior selectorBehavior, SelectedListenerFailureBehavior selectedBehavior, List supportedProtocols) { this.supportedProtocols = Collections.unmodifiableList(checkNotNull(supportedProtocols, "supportedProtocols")); this.protocol = checkNotNull(protocol, "protocol"); this.selectorBehavior = checkNotNull(selectorBehavior, "selectorBehavior"); this.selectedBehavior = checkNotNull(selectedBehavior, "selectedBehavior"); + + if (protocol == Protocol.NONE) { + throw new IllegalArgumentException("protocol (" + Protocol.NONE + ") must not be " + Protocol.NONE + '.'); + } + } + + /** + * A special constructor that is used to instantiate {@link #DISABLED}. + */ + private ApplicationProtocolConfig() { + supportedProtocols = Collections.emptyList(); + protocol = Protocol.NONE; + selectorBehavior = SelectorFailureBehavior.CHOOSE_MY_LAST_PROTOCOL; + selectedBehavior = SelectedListenerFailureBehavior.ACCEPT; } /** diff --git a/handler/src/main/java/io/netty/handler/ssl/SslContext.java b/handler/src/main/java/io/netty/handler/ssl/SslContext.java index 48032fb7e9..843e2c0fc4 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SslContext.java +++ b/handler/src/main/java/io/netty/handler/ssl/SslContext.java @@ -31,7 +31,6 @@ import javax.net.ssl.SSLException; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import java.io.File; -import java.util.Collections; import java.util.List; /** @@ -602,9 +601,7 @@ public abstract class SslContext { static ApplicationProtocolConfig toApplicationProtocolConfig(Iterable nextProtocols) { ApplicationProtocolConfig apn; if (nextProtocols == null) { - apn = new ApplicationProtocolConfig( - Protocol.NONE, SelectorFailureBehavior.CHOOSE_MY_LAST_PROTOCOL, - SelectedListenerFailureBehavior.ACCEPT, Collections.emptyList()); + apn = ApplicationProtocolConfig.DISABLED; } else { apn = new ApplicationProtocolConfig( Protocol.NPN_AND_ALPN, SelectorFailureBehavior.CHOOSE_MY_LAST_PROTOCOL,