< prev index next >

test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java

Print this page
rev 53931 : Backport JDK-8236859

*** 1,7 **** /* ! * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 21,34 **** * questions. */ /* * @test ! * @bug 8217429 * @summary WebSocket proxy tunneling tests ! * @compile DummyWebSocketServer.java ../ProxyServer.java * @run testng/othervm * -Djdk.http.auth.tunneling.disabledSchemes= * WebSocketProxyTest */ import java.io.IOException; --- 21,39 ---- * questions. */ /* * @test ! * @bug 8217429 8236859 * @summary WebSocket proxy tunneling tests ! * @library /test/lib ! * @compile SecureSupport.java DummySecureWebSocketServer.java ../ProxyServer.java ! * @build jdk.test.lib.net.SimpleSSLContext WebSocketProxyTest * @run testng/othervm + * -Djdk.internal.httpclient.debug=true + * -Djdk.internal.httpclient.websocket.debug=true + * -Djdk.httpclient.HttpClient.log=errors,requests,headers * -Djdk.http.auth.tunneling.disabledSchemes= * WebSocketProxyTest */ import java.io.IOException;
*** 50,62 **** --- 55,72 ---- import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; + + import jdk.test.lib.net.SimpleSSLContext; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; + + import javax.net.ssl.SSLContext; + import static java.net.http.HttpClient.newBuilder; import static java.nio.charset.StandardCharsets.UTF_8; import static org.testng.Assert.assertEquals; import static org.testng.FileAssert.fail;
*** 64,94 **** // Used to verify a proxy/websocket server requiring Authentication private static final String USERNAME = "wally"; private static final String PASSWORD = "xyz987"; static class WSAuthenticator extends Authenticator { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(USERNAME, PASSWORD.toCharArray()); } } ! static final Function<int[],DummyWebSocketServer> SERVER_WITH_CANNED_DATA = new Function<>() { ! @Override public DummyWebSocketServer apply(int[] data) { ! return Support.serverWithCannedData(data); } @Override public String toString() { return "SERVER_WITH_CANNED_DATA"; } }; ! static final Function<int[],DummyWebSocketServer> AUTH_SERVER_WITH_CANNED_DATA = new Function<>() { ! @Override public DummyWebSocketServer apply(int[] data) { ! return Support.serverWithCannedDataAndAuthentication(USERNAME, PASSWORD, data); } @Override public String toString() { return "AUTH_SERVER_WITH_CANNED_DATA"; } }; static final Supplier<ProxyServer> TUNNELING_PROXY_SERVER = new Supplier<>() { @Override public ProxyServer get() { try { return new ProxyServer(0, true);} catch(IOException e) { throw new UncheckedIOException(e); } } --- 74,126 ---- // Used to verify a proxy/websocket server requiring Authentication private static final String USERNAME = "wally"; private static final String PASSWORD = "xyz987"; + static { + try { + SSLContext.setDefault(new SimpleSSLContext().get()); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + static class WSAuthenticator extends Authenticator { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(USERNAME, PASSWORD.toCharArray()); } } ! static final Function<int[],DummySecureWebSocketServer> SERVER_WITH_CANNED_DATA = new Function<>() { ! @Override public DummySecureWebSocketServer apply(int[] data) { ! return SecureSupport.serverWithCannedData(data); } @Override public String toString() { return "SERVER_WITH_CANNED_DATA"; } }; ! static final Function<int[],DummySecureWebSocketServer> SSL_SERVER_WITH_CANNED_DATA = new Function<>() { ! @Override public DummySecureWebSocketServer apply(int[] data) { ! return SecureSupport.serverWithCannedData(data).secure(); } ! @Override public String toString() { return "SSL_SERVER_WITH_CANNED_DATA"; } ! }; ! ! static final Function<int[],DummySecureWebSocketServer> AUTH_SERVER_WITH_CANNED_DATA = ! new Function<>() { ! @Override public DummySecureWebSocketServer apply(int[] data) { ! return SecureSupport.serverWithCannedDataAndAuthentication(USERNAME, PASSWORD, data); } @Override public String toString() { return "AUTH_SERVER_WITH_CANNED_DATA"; } }; + static final Function<int[],DummySecureWebSocketServer> AUTH_SSL_SVR_WITH_CANNED_DATA = + new Function<>() { + @Override public DummySecureWebSocketServer apply(int[] data) { + return SecureSupport.serverWithCannedDataAndAuthentication(USERNAME, PASSWORD, data).secure(); } + @Override public String toString() { return "AUTH_SSL_SVR_WITH_CANNED_DATA"; } + }; + static final Supplier<ProxyServer> TUNNELING_PROXY_SERVER = new Supplier<>() { @Override public ProxyServer get() { try { return new ProxyServer(0, true);} catch(IOException e) { throw new UncheckedIOException(e); } }
*** 105,121 **** @DataProvider(name = "servers") public Object[][] servers() { return new Object[][] { { SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, { SERVER_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, { AUTH_SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, }; } @Test(dataProvider = "servers") public void simpleAggregatingBinaryMessages ! (Function<int[],DummyWebSocketServer> serverSupplier, Supplier<ProxyServer> proxyServerSupplier) throws IOException { List<byte[]> expected = List.of("hello", "chegar") .stream() --- 137,158 ---- @DataProvider(name = "servers") public Object[][] servers() { return new Object[][] { { SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, { SERVER_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, + { SSL_SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, + { SSL_SERVER_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, { AUTH_SERVER_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, + { AUTH_SSL_SVR_WITH_CANNED_DATA, TUNNELING_PROXY_SERVER }, + { AUTH_SERVER_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, + { AUTH_SSL_SVR_WITH_CANNED_DATA, AUTH_TUNNELING_PROXY_SERVER }, }; } @Test(dataProvider = "servers") public void simpleAggregatingBinaryMessages ! (Function<int[],DummySecureWebSocketServer> serverSupplier, Supplier<ProxyServer> proxyServerSupplier) throws IOException { List<byte[]> expected = List.of("hello", "chegar") .stream()
*** 132,141 **** --- 169,180 ---- var server = serverSupplier.apply(binary)) { InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); server.open(); + System.out.println("Server: " + server.getURI()); + System.out.println("Proxy: " + proxyAddress); WebSocket.Listener listener = new WebSocket.Listener() { List<byte[]> collectedBytes = new ArrayList<>(); ByteBuffer buffer = ByteBuffer.allocate(1024);
*** 207,217 **** * Ensures authentication succeeds when an Authenticator set on client builder. */ @Test public void clientAuthenticate() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummyWebSocketServer()){ server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); var webSocket = newBuilder() --- 246,256 ---- * Ensures authentication succeeds when an Authenticator set on client builder. */ @Test public void clientAuthenticate() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummySecureWebSocketServer()){ server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); var webSocket = newBuilder()
*** 228,238 **** * Ensures authentication succeeds when an `Authorization` header is explicitly set. */ @Test public void explicitAuthenticate() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummyWebSocketServer()) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); String hv = "Basic " + Base64.getEncoder().encodeToString( --- 267,300 ---- * Ensures authentication succeeds when an `Authorization` header is explicitly set. */ @Test public void explicitAuthenticate() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummySecureWebSocketServer()) { ! server.open(); ! InetSocketAddress proxyAddress = new InetSocketAddress( ! InetAddress.getLoopbackAddress(), proxyServer.getPort()); ! ! String hv = "Basic " + Base64.getEncoder().encodeToString( ! (USERNAME + ":" + PASSWORD).getBytes(UTF_8)); ! ! var webSocket = newBuilder() ! .proxy(ProxySelector.of(proxyAddress)).build() ! .newWebSocketBuilder() ! .header("Proxy-Authorization", hv) ! .buildAsync(server.getURI(), new WebSocket.Listener() { }) ! .join(); ! } ! } ! ! /* ! * Ensures authentication succeeds when an `Authorization` header is explicitly set. ! */ ! @Test ! public void explicitAuthenticate2() throws IOException { ! try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummySecureWebSocketServer(USERNAME, PASSWORD).secure()) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); String hv = "Basic " + Base64.getEncoder().encodeToString(
*** 240,249 **** --- 302,312 ---- var webSocket = newBuilder() .proxy(ProxySelector.of(proxyAddress)).build() .newWebSocketBuilder() .header("Proxy-Authorization", hv) + .header("Authorization", hv) .buildAsync(server.getURI(), new WebSocket.Listener() { }) .join(); } }
*** 251,261 **** * Ensures authentication does not succeed when no authenticator is present. */ @Test public void failNoAuthenticator() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummyWebSocketServer(USERNAME, PASSWORD)) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); CompletableFuture<WebSocket> cf = newBuilder() --- 314,324 ---- * Ensures authentication does not succeed when no authenticator is present. */ @Test public void failNoAuthenticator() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummySecureWebSocketServer(USERNAME, PASSWORD)) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); CompletableFuture<WebSocket> cf = newBuilder()
*** 279,289 **** * unauthorized credentials. */ @Test public void failBadCredentials() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummyWebSocketServer(USERNAME, PASSWORD)) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); Authenticator authenticator = new Authenticator() { --- 342,352 ---- * unauthorized credentials. */ @Test public void failBadCredentials() throws IOException { try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get(); ! var server = new DummySecureWebSocketServer(USERNAME, PASSWORD)) { server.open(); InetSocketAddress proxyAddress = new InetSocketAddress( InetAddress.getLoopbackAddress(), proxyServer.getPort()); Authenticator authenticator = new Authenticator() {
< prev index next >