From 3ddac6adffb737e0940a2cd287014bac78f51ff6 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Fri, 31 Oct 2014 14:09:46 +0900 Subject: [PATCH] Add ApplicationProtocolConfig.DISABLED Motivation: When ALPN/NPN is disabled, a user has to instantiate a new ApplicationProtocolConfig with meaningless parameters. Modifications: - Add ApplicationProtocolConfig.DISABLED, the singleton instance - Reject the constructor calls with Protocol.NONE, which doesn't make much sense because a user should use DISABLED instead. Result: More user-friendly API when ALPN/NPN is not needed by a user. --- .../ssl/ApplicationProtocolConfig.java | 30 +++++++++++++++---- .../java/io/netty/handler/ssl/SslContext.java | 5 +--- 2 files changed, 26 insertions(+), 9 deletions(-) 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,