8230435: Replace wildcard address with loopback or local host in tests - part 22
Summary: fixes tests to use the loopback address whenever possible. It also fixes some safe publishing issues, or add diagnostics in some of the tests.
Reviewed-by: michaelm
--- a/test/jdk/com/sun/net/httpserver/bugs/8199849/BasicAuthenticatorCharset.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/com/sun/net/httpserver/bugs/8199849/BasicAuthenticatorCharset.java Wed Sep 04 18:10:07 2019 +0100
@@ -157,7 +157,7 @@
String defaultCharset = System.getProperty("file.encoding");
boolean isUTF8 = defaultCharset.equalsIgnoreCase("UTF-8");
testHandler = new Handler();
- InetSocketAddress addr = new InetSocketAddress(0);
+ InetSocketAddress addr = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
testHttpServer = HttpServer.create(addr, 0);
// Set the passing credentials OLD client
--- a/test/jdk/java/net/Authenticator/B4678055.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/java/net/Authenticator/B4678055.java Wed Sep 04 18:10:07 2019 +0100
@@ -38,8 +38,8 @@
public class B4678055 implements HttpCallback {
- static int count = 0;
- static String authstring;
+ static volatile int count = 0;
+ static volatile String authstring;
void errorReply (HttpTransaction req, String reply) throws IOException {
req.addResponseHeader ("Connection", "close");
@@ -56,6 +56,7 @@
public void request (HttpTransaction req) {
try {
+ System.out.println("Server handling case: "+ count);
authstring = req.getRequestHeader ("Authorization");
System.out.println (authstring);
switch (count) {
@@ -95,6 +96,7 @@
}
count ++;
} catch (IOException e) {
+ System.err.println("Unexpected exception for case " + count + ": " + e);
e.printStackTrace();
}
}
@@ -143,6 +145,8 @@
client(serverURL + "d2/foo.html");
client(serverURL + "d2/foo.html");
} catch (Exception e) {
+ System.out.println("Client got exception: " + e);
+ System.out.println("Terminating server");
if (server != null) {
server.terminate();
}
@@ -156,10 +160,13 @@
if (!checkFinalAuth()) {
except ("Wrong authorization string received from client");
}
+ System.out.println("Terminating server");
server.terminate();
}
public static void except (String s) {
+ System.out.println("Check failed: " + s);
+ System.out.println("Terminating server");
server.terminate();
throw new RuntimeException (s);
}
@@ -169,7 +176,7 @@
super ();
}
- int count = 0;
+ volatile int count = 0;
public PasswordAuthentication getPasswordAuthentication () {
PasswordAuthentication pw;
--- a/test/jdk/java/net/DatagramSocket/PortUnreachable.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/java/net/DatagramSocket/PortUnreachable.java Wed Sep 04 18:10:07 2019 +0100
@@ -24,6 +24,7 @@
/**
* @test
* @bug 4361783
+ * @key intermittent
* @summary Test to see if ICMP Port Unreachable on non-connected
* DatagramSocket causes a SocketException "socket closed"
* exception on Windows 2000.
@@ -43,7 +44,7 @@
public void serverSend() {
try {
InetAddress addr = InetAddress.getLocalHost();
- Thread.currentThread().sleep(1000);
+ Thread.sleep(1000);
// send a delayed packet which should mean a delayed icmp
// port unreachable
byte b[] = "A late msg".getBytes();
@@ -64,26 +65,70 @@
DatagramSocket recreateServerSocket (int serverPort) throws Exception {
DatagramSocket serverSocket = null;
int retryCount = 0;
+ long sleeptime = 0;
System.out.println("Attempting to recreate server socket with port: " +
serverPort);
+ // it's possible that this method intermittently fails, if some other
+ // process running on the machine grabs the port we want before us,
+ // and doesn't release it before the 5 * 500 ms are elapsed...
while (serverSocket == null) {
try {
serverSocket = new DatagramSocket(serverPort, InetAddress.getLocalHost());
} catch (BindException bEx) {
if (retryCount++ < 5) {
- Thread.sleep(500);
+ sleeptime += sleepAtLeast(500);
} else {
- System.out.println("Give up after 5 retries");
+ System.out.println("Give up after 5 retries and " + sleeptime(sleeptime));
+ System.out.println("Has some other process grabbed port " + serverPort + "?");
throw bEx;
}
}
}
System.out.println("PortUnreachableTest.recreateServerSocket: returning socket == "
- + serverSocket.getLocalAddress() + ":" + serverSocket.getLocalPort());
+ + serverSocket.getLocalAddress() + ":" + serverSocket.getLocalPort()
+ + " obtained at " + attempt(retryCount) + " attempt with " + sleeptime(sleeptime));
return serverSocket;
}
+ long sleepAtLeast(long millis) throws Exception {
+ long start = System.nanoTime();
+ long ms = millis;
+ while (ms > 0) {
+ assert ms < Long.MAX_VALUE/1000_000L;
+ Thread.sleep(ms);
+ long elapsedms = (System.nanoTime() - start)/1000_000L;
+ ms = millis - elapsedms;
+ }
+ return millis - ms;
+ }
+
+ String attempt(int retry) {
+ switch (retry) {
+ case 0: return "first";
+ case 1: return "second";
+ case 2: return "third";
+ default: return retry + "th";
+ }
+ }
+
+ String sleeptime(long millis) {
+ if (millis == 0) return "no sleep";
+ long sec = millis / 1000L;
+ long ms = millis % 1000L;
+ String sleeptime = "";
+ if (millis > 0) {
+ if (sec > 0) {
+ sleeptime = "" + sec + " s" +
+ (ms > 0 ? " " : "");
+ }
+ if (ms > 0 ) {
+ sleeptime += ms + " ms";
+ }
+ } else sleeptime = millis + " ms"; // should not happen
+ return sleeptime + " of sleep time";
+ }
+
PortUnreachable() throws Exception {
clientSock = new DatagramSocket(new InetSocketAddress(InetAddress.getLocalHost(), 0));
clientPort = clientSock.getLocalPort();
@@ -126,4 +171,3 @@
}
}
-
--- a/test/jdk/java/net/URLConnection/RedirectLimit.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/java/net/URLConnection/RedirectLimit.java Wed Sep 04 18:10:07 2019 +0100
@@ -73,7 +73,9 @@
// Read until the end of a HTTP request
void readOneRequest(InputStream is) throws IOException {
int requestEndCount = 0, r;
+ StringBuilder sb = new StringBuilder();
while ((r = is.read()) != -1) {
+ sb.append((char)r);
if (r == requestEnd[requestEndCount]) {
requestEndCount++;
if (requestEndCount == 4) {
@@ -83,6 +85,7 @@
requestEndCount = 0;
}
}
+ System.out.println("Server got request: " + sb.toString());
}
public void run() {
@@ -90,15 +93,19 @@
readyToStart.countDown();
for (int i=0; i<NUM_REDIRECTS; i++) {
try (Socket s = ss.accept()) {
+ System.out.println("Server accepted socket: " + s);
s.setSoTimeout(TIMEOUT);
readOneRequest(s.getInputStream());
+ System.out.println("Redirecting to: /redirect" + i);
String reply = reply1 + port + "/redirect" + i + reply2;
s.getOutputStream().write(reply.getBytes());
}
}
try (Socket s = ss.accept()) {
+ System.out.println("Server accepted socket: " + s);
s.setSoTimeout(TIMEOUT);
readOneRequest(s.getInputStream());
+ System.out.println("Replying...");
s.getOutputStream().write(reply3.getBytes());
}
} catch (Exception e) {
--- a/test/jdk/java/net/URLConnection/Responses.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/java/net/URLConnection/Responses.java Wed Sep 04 18:10:07 2019 +0100
@@ -56,7 +56,8 @@
* "HTTP/1.1 404 "
*/
static class HttpServer implements Runnable {
- ServerSocket ss;
+ final ServerSocket ss;
+ volatile boolean shutdown;
public HttpServer() {
try {
@@ -83,6 +84,7 @@
}
public void shutdown() throws IOException {
+ shutdown = true;
ss.close();
}
@@ -90,7 +92,7 @@
Object[][] tests = getTests();
try {
- for (;;) {
+ while(!shutdown) {
Socket s = ss.accept();
BufferedReader in = new BufferedReader(
@@ -101,6 +103,7 @@
int pos2 = req.indexOf(' ', pos1+1);
int i = Integer.parseInt(req.substring(pos1+2, pos2));
+ System.out.println("Server replying to >" + tests[i][0] + "<");
PrintStream out = new PrintStream(
new BufferedOutputStream(
@@ -117,6 +120,9 @@
s.close();
}
} catch (Exception e) {
+ if (!shutdown) {
+ e.printStackTrace();
+ }
}
}
}
@@ -170,6 +176,7 @@
actualPhrase + ", expected: " + expectedPhrase);
}
} catch (IOException e) {
+ System.err.println("Test failed for >" + tests[i][0] + "<: " + e);
e.printStackTrace();
failures++;
}
--- a/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/javax/net/ssl/templates/SSLSocketTemplate.java Wed Sep 04 18:10:07 2019 +0100
@@ -45,6 +45,7 @@
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
import java.security.KeyStore;
@@ -222,14 +223,24 @@
protected volatile int serverPort = 0;
/*
+ * What's the server address? null means binding to the wildcard.
+ */
+ protected volatile InetAddress serverAddress = null;
+
+ /*
* Define the server side of the test.
*/
protected void doServerSide() throws Exception {
// kick start the server side service
SSLContext context = createServerSSLContext();
SSLServerSocketFactory sslssf = context.getServerSocketFactory();
- SSLServerSocket sslServerSocket =
- (SSLServerSocket)sslssf.createServerSocket(serverPort);
+ InetAddress serverAddress = this.serverAddress;
+ SSLServerSocket sslServerSocket = serverAddress == null ?
+ (SSLServerSocket)sslssf.createServerSocket(serverPort)
+ : (SSLServerSocket)sslssf.createServerSocket();
+ if (serverAddress != null) {
+ sslServerSocket.bind(new InetSocketAddress(serverAddress, serverPort));
+ }
configureServerSocket(sslServerSocket);
serverPort = sslServerSocket.getLocalPort();
@@ -317,8 +328,11 @@
try (SSLSocket sslSocket = (SSLSocket)sslsf.createSocket()) {
try {
configureClientSocket(sslSocket);
- sslSocket.connect(
- new InetSocketAddress("localhost", serverPort), 15000);
+ InetAddress serverAddress = this.serverAddress;
+ InetSocketAddress connectAddress = serverAddress == null
+ ? new InetSocketAddress("localhost", serverPort)
+ : new InetSocketAddress(serverAddress, serverPort);
+ sslSocket.connect(connectAddress, 15000);
} catch (IOException ioe) {
// The server side may be impacted by naughty test cases or
// third party routines, and cannot accept connections.
--- a/test/jdk/sun/net/InetAddress/nameservice/simple/DefaultCaching.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/InetAddress/nameservice/simple/DefaultCaching.java Wed Sep 04 18:10:07 2019 +0100
@@ -101,8 +101,22 @@
static void sleep(int seconds) {
try {
- Thread.sleep(seconds * 1000);
- } catch (InterruptedException e) {}
+ sleepms(seconds * 1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ static long sleepms(long millis) throws InterruptedException {
+ long start = System.nanoTime();
+ long ms = millis;
+ while (ms > 0) {
+ assert ms < Long.MAX_VALUE/1000_000L;
+ Thread.sleep(ms);
+ long elapsedms = (System.nanoTime() - start)/1000_000L;
+ ms = millis - elapsedms;
+ }
+ return millis - ms;
}
static void test(String host, String address, boolean shouldSucceed) {
@@ -114,7 +128,7 @@
+ addr + ")");
}
if (!address.equals(addr.getHostAddress())) {
- throw new RuntimeException(host+":"+address+": compare failed (found "
+ throw new RuntimeException(host+"/"+address+": compare failed (found "
+ addr + ")");
}
System.out.println("test: " + host + "/" + address
--- a/test/jdk/sun/net/www/AuthHeaderTest.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/AuthHeaderTest.java Wed Sep 04 18:10:07 2019 +0100
@@ -85,7 +85,7 @@
static void client (String u) throws Exception {
URL url = new URL (u);
System.out.println ("client opening connection to: " + u);
- URLConnection urlc = url.openConnection ();
+ URLConnection urlc = url.openConnection (Proxy.NO_PROXY);
InputStream is = urlc.getInputStream ();
read (is);
is.close();
--- a/test/jdk/sun/net/www/http/HttpClient/RetryPost.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/http/HttpClient/RetryPost.java Wed Sep 04 18:10:07 2019 +0100
@@ -84,13 +84,17 @@
throw new RuntimeException("Failed: POST request being retried");
} catch (SocketException se) {
+ System.out.println("Got expected exception: " + se);
// this is what we expect to happen and is OK.
- if (shouldRetry && httpHandler.getCallCount() != 2)
+ if (shouldRetry && httpHandler.getCallCount() != 2) {
+ se.printStackTrace(System.out);
throw new RuntimeException("Failed: Handler should have been called twice. " +
"It was called "+ httpHandler.getCallCount() + " times");
- else if (!shouldRetry && httpHandler.getCallCount() != 1)
+ } else if (!shouldRetry && httpHandler.getCallCount() != 1) {
+ se.printStackTrace(System.out);
throw new RuntimeException("Failed: Handler should have only been called once" +
"It was called "+ httpHandler.getCallCount() + " times");
+ }
} finally {
httpServer.stop(1);
executorService.shutdown();
--- a/test/jdk/sun/net/www/protocol/https/HttpsClient/ProxyAuthTest.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsClient/ProxyAuthTest.java Wed Sep 04 18:10:07 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -59,6 +59,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Authenticator;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
@@ -80,6 +81,10 @@
public class ProxyAuthTest extends SSLSocketTemplate {
private static boolean expectSuccess;
+ ProxyAuthTest() {
+ serverAddress = InetAddress.getLoopbackAddress();
+ }
+
/*
* Run the test case.
*/
@@ -143,18 +148,25 @@
*/
HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier());
- InetSocketAddress paddr =
- new InetSocketAddress("localhost", ps.getPort());
+ InetSocketAddress paddr = InetSocketAddress
+ .createUnresolved(ps.getInetAddress().getHostAddress(),
+ ps.getPort());
Proxy proxy = new Proxy(Proxy.Type.HTTP, paddr);
+ InetAddress serverAddress = this.serverAddress;
+ String host = serverAddress == null
+ ? "localhost"
+ : serverAddress.getHostAddress();
+ if (host.indexOf(':') > -1) host = "[" + host + "]";
URL url = new URL(
- "https://" + "localhost:" + serverPort + "/index.html");
+ "https://" + host + ":" + serverPort + "/index.html");
+ System.out.println("URL: " + url);
BufferedReader in = null;
HttpsURLConnection uc = (HttpsURLConnection) url.openConnection(proxy);
try {
in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String inputLine;
- System.out.print("Client recieved from the server: ");
+ System.out.print("Client received from the server: ");
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
@@ -226,7 +238,8 @@
}
private static ProxyTunnelServer setupProxy() throws IOException {
- ProxyTunnelServer pserver = new ProxyTunnelServer();
+ InetAddress loopback = InetAddress.getLoopbackAddress();
+ ProxyTunnelServer pserver = new ProxyTunnelServer(loopback);
/*
* register a system wide authenticator and setup the proxy for
--- a/test/jdk/sun/net/www/protocol/https/HttpsClient/ProxyTunnelServer.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsClient/ProxyTunnelServer.java Wed Sep 04 18:10:07 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -61,9 +61,14 @@
static boolean needAuth = false;
public ProxyTunnelServer() throws IOException {
+ this(null); // use wildcard
+ }
+
+ public ProxyTunnelServer(InetAddress proxyAddress) throws IOException {
if (ss == null) {
- ss = (ServerSocket) ServerSocketFactory.getDefault().
- createServerSocket(0);
+ ss = (ServerSocket) ServerSocketFactory.getDefault().
+ createServerSocket();
+ ss.bind(new InetSocketAddress(proxyAddress, 0));
}
setDaemon(true);
}
@@ -274,9 +279,9 @@
serverName = connectInfo.substring(0, endi);
serverPort = Integer.parseInt(connectInfo.substring(endi+1));
} catch (Exception e) {
- throw new IOException("Proxy recieved a request: "
- + connectStr);
- }
+ throw new IOException("Proxy received a request: "
+ + connectStr, e);
+ }
serverInetAddr = InetAddress.getByName(serverName);
}
@@ -284,6 +289,10 @@
return ss.getLocalPort();
}
+ public InetAddress getInetAddress() {
+ return ss.getInetAddress();
+ }
+
/*
* do "basic" authentication, authInfo is of the form:
* Basic <encoded username":"password>
--- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java Wed Sep 04 18:10:07 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -139,8 +139,8 @@
// Both the https server and the proxy let the
// system pick up an ephemeral port.
httpTrans = new SimpleHttpTransaction();
- server = new TestHttpsServer(httpTrans, 1, 10, 0);
- proxy = new TunnelProxy(1, 10, 0);
+ server = new TestHttpsServer(httpTrans, 1, 10, firstNonLoAddress, 0);
+ proxy = new TunnelProxy(1, 10, firstNonLoAddress, 0);
}
public static void makeHttpCall() throws Exception {
--- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/B6226610.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/B6226610.java Wed Sep 04 18:10:07 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -47,12 +47,14 @@
proxy = new HeaderCheckerProxyTunnelServer();
proxy.start();
- String hostname = InetAddress.getLocalHost().getHostName();
+ InetAddress localHost = InetAddress.getLocalHost();
+ String hostname = localHost.getHostName();
+ String hostAddress = localHost.getHostAddress();
try {
URL u = new URL("https://" + hostname + "/");
System.out.println("Connecting to " + u);
- InetSocketAddress proxyAddr = new InetSocketAddress(hostname, proxy.getLocalPort());
+ InetSocketAddress proxyAddr = InetSocketAddress.createUnresolved(hostAddress, proxy.getLocalPort());
java.net.URLConnection c = u.openConnection(new Proxy(Proxy.Type.HTTP, proxyAddr));
/* I want this header to go to the destination server only, protected
@@ -96,7 +98,8 @@
public HeaderCheckerProxyTunnelServer() throws IOException
{
if (ss == null) {
- ss = new ServerSocket(0);
+ ss = new ServerSocket();
+ ss.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
}
}
@@ -143,16 +146,16 @@
retrieveConnectInfo(statusLine);
if (mheader.findValue("X-TestHeader") != null) {
- System.out.println("Proxy should not receive user defined headers for tunneled requests");
- failed = true;
+ System.out.println("Proxy should not receive user defined headers for tunneled requests");
+ failed = true;
}
// 6973030
String value;
if ((value = mheader.findValue("Proxy-Connection")) == null ||
!value.equals("keep-alive")) {
- System.out.println("Proxy-Connection:keep-alive not being sent");
- failed = true;
+ System.out.println("Proxy-Connection:keep-alive not being sent");
+ failed = true;
}
//This will allow the main thread to terminate without trying to perform the SSL handshake.
@@ -206,8 +209,8 @@
serverPort = Integer.parseInt(connectInfo.substring(endi+1));
} catch (Exception e) {
throw new IOException("Proxy recieved a request: "
- + connectStr);
- }
+ + connectStr, e);
+ }
serverInetAddr = InetAddress.getByName(serverName);
}
}
--- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/HttpsProxyStackOverflow.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/HttpsProxyStackOverflow.java Wed Sep 04 18:10:07 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -34,6 +34,7 @@
import java.io.InputStream;
import java.net.Authenticator;
import java.net.Proxy;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.ServerSocket;
@@ -51,9 +52,11 @@
static void doClient(BadAuthProxyServer server) throws IOException {
// url doesn't matter since we will never make the connection
URL url = new URL("https://anythingwilldo/");
+ InetAddress loopback = InetAddress.getLoopbackAddress();
+ String loopbackAddress = loopback.getHostAddress();
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(
new Proxy(Proxy.Type.HTTP,
- new InetSocketAddress("localhost", server.getPort())));
+ InetSocketAddress.createUnresolved(loopbackAddress, server.getPort())));
try (InputStream is = conn.getInputStream()) {
} catch(IOException unused) {
// no real server, IOException is expected.
@@ -70,8 +73,11 @@
return new PasswordAuthentication("xyz", "xyz".toCharArray());
}
});
-
- BadAuthProxyServer server = new BadAuthProxyServer(new ServerSocket(0));
+ InetAddress loopback = InetAddress.getLoopbackAddress();
+ InetSocketAddress address = new InetSocketAddress(loopback, 0);
+ ServerSocket ss = new ServerSocket();
+ ss.bind(address);
+ BadAuthProxyServer server = new BadAuthProxyServer(ss);
Thread serverThread = new Thread(server);
serverThread.start();
return server;
@@ -113,4 +119,3 @@
}
}
}
-
--- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TunnelProxy.java Wed Sep 04 17:36:53 2019 +0100
+++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/TunnelProxy.java Wed Sep 04 18:10:07 2019 +0100
@@ -86,8 +86,29 @@
public TunnelProxy (int threads, int cperthread, int port)
throws IOException {
+ this(threads, cperthread, null, 0);
+ }
+
+ /**
+ * Create a <code>TunnelProxy<code> instance with the specified number
+ * of threads and maximum number of connections per thread and running on
+ * the specified port. The specified number of threads are created to
+ * handle incoming requests, and each thread is allowed
+ * to handle a number of simultaneous TCP connections.
+ * @param cb the callback object which is invoked to handle
+ * each incoming request
+ * @param threads the number of threads to create to handle
+ * requests in parallel
+ * @param cperthread the number of simultaneous TCP connections
+ * to handle per thread
+ * @param address the address to bind to. null means all addresses.
+ * @param port the port number to bind the server to. <code>Zero</code>
+ * means choose any free port.
+ */
+ public TunnelProxy (int threads, int cperthread, InetAddress address, int port)
+ throws IOException {
schan = ServerSocketChannel.open ();
- InetSocketAddress addr = new InetSocketAddress (port);
+ InetSocketAddress addr = new InetSocketAddress (address, port);
schan.socket().bind (addr);
this.threads = threads;
this.cperthread = cperthread;