< prev index next >
test/jdk/java/net/httpclient/websocket/WebSocketProxyTest.java
Print this page
rev 53931 : Backport JDK-8236859
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * 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,14 +21,19 @@
* questions.
*/
/*
* @test
- * @bug 8217429
+ * @bug 8217429 8236859
* @summary WebSocket proxy tunneling tests
- * @compile DummyWebSocketServer.java ../ProxyServer.java
+ * @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,13 +55,18 @@
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,31 +74,53 @@
// 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[],DummyWebSocketServer> SERVER_WITH_CANNED_DATA =
+ static final Function<int[],DummySecureWebSocketServer> SERVER_WITH_CANNED_DATA =
new Function<>() {
- @Override public DummyWebSocketServer apply(int[] data) {
- return Support.serverWithCannedData(data); }
+ @Override public DummySecureWebSocketServer apply(int[] data) {
+ return SecureSupport.serverWithCannedData(data); }
@Override public String toString() { return "SERVER_WITH_CANNED_DATA"; }
};
- static final Function<int[],DummyWebSocketServer> AUTH_SERVER_WITH_CANNED_DATA =
+ static final Function<int[],DummySecureWebSocketServer> SSL_SERVER_WITH_CANNED_DATA =
new Function<>() {
- @Override public DummyWebSocketServer apply(int[] data) {
- return Support.serverWithCannedDataAndAuthentication(USERNAME, PASSWORD, data); }
+ @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,17 +137,22 @@
@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[],DummyWebSocketServer> serverSupplier,
+ (Function<int[],DummySecureWebSocketServer> serverSupplier,
Supplier<ProxyServer> proxyServerSupplier)
throws IOException
{
List<byte[]> expected = List.of("hello", "chegar")
.stream()
@@ -132,10 +169,12 @@
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,11 +246,11 @@
* 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()){
+ var server = new DummySecureWebSocketServer()){
server.open();
InetSocketAddress proxyAddress = new InetSocketAddress(
InetAddress.getLoopbackAddress(), proxyServer.getPort());
var webSocket = newBuilder()
@@ -228,11 +267,34 @@
* 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()) {
+ 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,10 +302,11 @@
var webSocket = newBuilder()
.proxy(ProxySelector.of(proxyAddress)).build()
.newWebSocketBuilder()
.header("Proxy-Authorization", hv)
+ .header("Authorization", hv)
.buildAsync(server.getURI(), new WebSocket.Listener() { })
.join();
}
}
@@ -251,11 +314,11 @@
* 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)) {
+ var server = new DummySecureWebSocketServer(USERNAME, PASSWORD)) {
server.open();
InetSocketAddress proxyAddress = new InetSocketAddress(
InetAddress.getLoopbackAddress(), proxyServer.getPort());
CompletableFuture<WebSocket> cf = newBuilder()
@@ -279,11 +342,11 @@
* unauthorized credentials.
*/
@Test
public void failBadCredentials() throws IOException {
try (var proxyServer = AUTH_TUNNELING_PROXY_SERVER.get();
- var server = new DummyWebSocketServer(USERNAME, PASSWORD)) {
+ var server = new DummySecureWebSocketServer(USERNAME, PASSWORD)) {
server.open();
InetSocketAddress proxyAddress = new InetSocketAddress(
InetAddress.getLoopbackAddress(), proxyServer.getPort());
Authenticator authenticator = new Authenticator() {
< prev index next >