diff --git a/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolAccessor.java b/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolAccessor.java index 8835bc810a5..1db0e1408a9 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolAccessor.java +++ b/handler/src/main/java/io/netty/handler/ssl/ApplicationProtocolAccessor.java @@ -26,5 +26,5 @@ interface ApplicationProtocolAccessor { * @return the application-level protocol name or * {@code null} if the negotiation failed or the client does not have ALPN/NPN extension */ - String getApplicationProtocol(); + String getNegotiatedApplicationProtocol(); } diff --git a/handler/src/main/java/io/netty/handler/ssl/Java9SslEngine.java b/handler/src/main/java/io/netty/handler/ssl/Java9SslEngine.java index 6534f39b503..5910855b414 100644 --- a/handler/src/main/java/io/netty/handler/ssl/Java9SslEngine.java +++ b/handler/src/main/java/io/netty/handler/ssl/Java9SslEngine.java @@ -150,17 +150,25 @@ public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dst, int offset, int } @Override - void setApplicationProtocol(String applicationProtocol) { + void setNegotiatedApplicationProtocol(String applicationProtocol) { // Do nothing as this is handled internally by the Java9 implementation of SSLEngine. } @Override - public String getApplicationProtocol() { - return Java9SslUtils.getApplicationProtocol(getWrappedEngine()); + public String getNegotiatedApplicationProtocol() { + String protocol = getApplicationProtocol(); + if (protocol != null) { + return protocol.isEmpty() ? null : protocol; + } + return protocol; } // These methods will override the methods defined by Java 9. As we compile with Java8 we can not add // @Override annotations here. + public String getApplicationProtocol() { + return Java9SslUtils.getApplicationProtocol(getWrappedEngine()); + } + public String getHandshakeApplicationProtocol() { return Java9SslUtils.getHandshakeApplicationProtocol(getWrappedEngine()); } diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkBaseApplicationProtocolNegotiator.java b/handler/src/main/java/io/netty/handler/ssl/JdkBaseApplicationProtocolNegotiator.java index 8e20c9b1b1c..068c4946016 100644 --- a/handler/src/main/java/io/netty/handler/ssl/JdkBaseApplicationProtocolNegotiator.java +++ b/handler/src/main/java/io/netty/handler/ssl/JdkBaseApplicationProtocolNegotiator.java @@ -137,14 +137,14 @@ static class NoFailProtocolSelector implements ProtocolSelector { @Override public void unsupported() { - engineWrapper.setApplicationProtocol(null); + engineWrapper.setNegotiatedApplicationProtocol(null); } @Override public String select(List protocols) throws Exception { for (String p : supportedProtocols) { if (protocols.contains(p)) { - engineWrapper.setApplicationProtocol(p); + engineWrapper.setNegotiatedApplicationProtocol(p); return p; } } @@ -152,7 +152,7 @@ public String select(List protocols) throws Exception { } public String noSelectMatchFound() throws Exception { - engineWrapper.setApplicationProtocol(null); + engineWrapper.setNegotiatedApplicationProtocol(null); return null; } } @@ -179,13 +179,13 @@ private static class NoFailProtocolSelectionListener implements ProtocolSelectio @Override public void unsupported() { - engineWrapper.setApplicationProtocol(null); + engineWrapper.setNegotiatedApplicationProtocol(null); } @Override public void selected(String protocol) throws Exception { if (supportedProtocols.contains(protocol)) { - engineWrapper.setApplicationProtocol(protocol); + engineWrapper.setNegotiatedApplicationProtocol(protocol); } else { noSelectedMatchFound(protocol); } diff --git a/handler/src/main/java/io/netty/handler/ssl/JdkSslEngine.java b/handler/src/main/java/io/netty/handler/ssl/JdkSslEngine.java index 1cc3bdfa32a..3304e384853 100644 --- a/handler/src/main/java/io/netty/handler/ssl/JdkSslEngine.java +++ b/handler/src/main/java/io/netty/handler/ssl/JdkSslEngine.java @@ -33,11 +33,11 @@ class JdkSslEngine extends SSLEngine implements ApplicationProtocolAccessor { } @Override - public String getApplicationProtocol() { + public String getNegotiatedApplicationProtocol() { return applicationProtocol; } - void setApplicationProtocol(String applicationProtocol) { + void setNegotiatedApplicationProtocol(String applicationProtocol) { this.applicationProtocol = applicationProtocol; } diff --git a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java index 2670e53b23d..0c4bf5c2d47 100644 --- a/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java +++ b/handler/src/main/java/io/netty/handler/ssl/ReferenceCountedOpenSslEngine.java @@ -1829,7 +1829,7 @@ final boolean checkSniHostnameMatch(String hostname) { } @Override - public String getApplicationProtocol() { + public String getNegotiatedApplicationProtocol() { return applicationProtocol; } diff --git a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java index 3724b772719..ac32c9c76f0 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SslHandler.java +++ b/handler/src/main/java/io/netty/handler/ssl/SslHandler.java @@ -66,7 +66,6 @@ import javax.net.ssl.SSLEngineResult.HandshakeStatus; import javax.net.ssl.SSLEngineResult.Status; import javax.net.ssl.SSLException; -import javax.net.ssl.SSLSession; import static io.netty.buffer.ByteBufUtil.ensureWritableSuccess; import static io.netty.handler.ssl.SslUtils.getEncryptedPacketLength; @@ -578,7 +577,7 @@ public String applicationProtocol() { return null; } - return ((ApplicationProtocolAccessor) engine).getApplicationProtocol(); + return ((ApplicationProtocolAccessor) engine).getNegotiatedApplicationProtocol(); } /** diff --git a/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java b/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java index 0ab9456b0fe..43f1c781abe 100644 --- a/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java +++ b/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java @@ -42,6 +42,7 @@ import io.netty.util.concurrent.Promise; import io.netty.util.internal.EmptyArrays; import io.netty.util.internal.PlatformDependent; +import io.netty.util.internal.StringUtil; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -996,10 +997,8 @@ protected void runTest(String expectedApplicationProtocol) throws Exception { try { writeAndVerifyReceived(clientMessage.retain(), clientChannel, serverLatch, serverReceiver); writeAndVerifyReceived(serverMessage.retain(), serverConnectedChannel, clientLatch, clientReceiver); - if (expectedApplicationProtocol != null) { - verifyApplicationLevelProtocol(clientChannel, expectedApplicationProtocol); - verifyApplicationLevelProtocol(serverConnectedChannel, expectedApplicationProtocol); - } + verifyApplicationLevelProtocol(clientChannel, expectedApplicationProtocol); + verifyApplicationLevelProtocol(serverConnectedChannel, expectedApplicationProtocol); } finally { clientMessage.release(); serverMessage.release(); @@ -1011,6 +1010,14 @@ private static void verifyApplicationLevelProtocol(Channel channel, String expec assertNotNull(handler); String appProto = handler.applicationProtocol(); assertEquals(appProto, expectedApplicationProtocol); + + SSLEngine engine = handler.engine(); + if (engine instanceof Java9SslEngine) { + // Also verify the Java9 exposed method. + Java9SslEngine java9SslEngine = (Java9SslEngine) engine; + assertEquals(expectedApplicationProtocol == null ? StringUtil.EMPTY_STRING : expectedApplicationProtocol, + java9SslEngine.getApplicationProtocol()); + } } private static void writeAndVerifyReceived(ByteBuf message, Channel sendChannel, CountDownLatch receiverLatch,