< 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 >