--- old/test/sun/net/www/protocol/https/HttpsClient/ProxyAuthTest.java 2016-10-07 13:22:31.817279278 -0700 +++ new/test/sun/net/www/protocol/https/HttpsClient/ProxyAuthTest.java 2016-10-07 13:22:31.717279274 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2016, 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 @@ -27,6 +27,7 @@ * @summary HttpsURLConnection doesn't send Proxy-Authorization on CONNECT * Incorrect checking of proxy server response * @modules java.base/sun.net.www + * @library /javax/net/ssl/templates * @run main/othervm ProxyAuthTest * * No way to reserve and restore java.lang.Authenticator, need to run this @@ -35,10 +36,7 @@ import java.io.*; import java.net.*; -import java.security.KeyStore; -import javax.net.*; import javax.net.ssl.*; -import java.security.cert.*; /* * ProxyAuthTest.java -- includes a simple server that can serve @@ -56,96 +54,83 @@ static String trustStoreFile = "truststore"; static String passwd = "passphrase"; - volatile private static int serverPort = 0; - - /* - * The TestServer implements a OriginServer that - * processes HTTP requests and responses. + /** + * read the response, don't care for the syntax of the request-line + * for this testing */ - static class TestServer extends OriginServer { - public TestServer(ServerSocket ss) throws Exception { - super(ss); - } - - /* - * Returns an array of bytes containing the bytes for - * the data sent in the response. - * - * @return bytes for the data in the response - */ - public byte[] getBytes() { - return "Proxy authentication for tunneling succeeded ..". - getBytes(); - } + private static void readRequest(BufferedReader in) throws IOException { + String line = null; + System.out.println("Server received: "); + do { + if (line != null) { + System.out.println(line); + } + line = in.readLine(); + } while ((line.length() != 0) && + (line.charAt(0) != '\r') && (line.charAt(0) != '\n')); } + /* * Main method to create the server and the client */ public static void main(String args[]) throws Exception { String keyFilename = - System.getProperty("test.src", "./") + "/" + pathToStores + - "/" + keyStoreFile; + SSLTest.TEST_SRC + "/" + pathToStores + "/" + keyStoreFile; String trustFilename = - System.getProperty("test.src", "./") + "/" + pathToStores + - "/" + trustStoreFile; + SSLTest.TEST_SRC + "/" + pathToStores + "/" + trustStoreFile; - System.setProperty("javax.net.ssl.keyStore", keyFilename); - System.setProperty("javax.net.ssl.keyStorePassword", passwd); - System.setProperty("javax.net.ssl.trustStore", trustFilename); - System.setProperty("javax.net.ssl.trustStorePassword", passwd); - - boolean useSSL = true; - /* - * setup the server - */ - try { - ServerSocketFactory ssf = - ProxyAuthTest.getServerSocketFactory(useSSL); - ServerSocket ss = ssf.createServerSocket(serverPort); - serverPort = ss.getLocalPort(); - new TestServer(ss); - } catch (Exception e) { - System.out.println("Server side failed:" + - e.getMessage()); - throw e; - } - // trigger the client - try { - doClientSide(); - } catch (Exception e) { - System.out.println("Client side failed: " + e.getMessage()); - throw e; - } - } + SSLTest.setup(keyFilename, trustFilename, passwd); - private static ServerSocketFactory getServerSocketFactory - (boolean useSSL) throws Exception { - if (useSSL) { - SSLServerSocketFactory ssf = null; - // set up key manager to do server authentication - SSLContext ctx; - KeyManagerFactory kmf; - KeyStore ks; - char[] passphrase = passwd.toCharArray(); - - ctx = SSLContext.getInstance("TLS"); - kmf = KeyManagerFactory.getInstance("SunX509"); - ks = KeyStore.getInstance("JKS"); - - ks.load(new FileInputStream(System.getProperty( - "javax.net.ssl.keyStore")), passphrase); - kmf.init(ks, passphrase); - ctx.init(kmf.getKeyManagers(), null, null); - - ssf = ctx.getServerSocketFactory(); - return ssf; - } else { - return ServerSocketFactory.getDefault(); + new SSLTest() + .setServerApplication((socket, test) -> { + DataOutputStream out = new DataOutputStream( + socket.getOutputStream()); + try { + BufferedReader in = new BufferedReader( + new InputStreamReader(socket.getInputStream())); + + // read the request + readRequest(in); + + // retrieve bytecodes + byte[] bytecodes = + "Proxy authentication for tunneling succeeded .." + .getBytes(); + + // send bytecodes in response (assumes HTTP/1.0 or later) + out.writeBytes("HTTP/1.0 200 OK\r\n"); + out.writeBytes("Content-Length: " + bytecodes.length + + "\r\n"); + out.writeBytes("Content-Type: text/html\r\n\r\n"); + out.write(bytecodes); + out.flush(); + } catch (Exception e) { + // write out error response + out.writeBytes("HTTP/1.0 400 " + e.getMessage() + "\r\n"); + out.writeBytes("Content-Type: text/html\r\n\r\n"); + out.flush(); + } + }) + .setClientPeer(test -> { + doClientSide(test); + }) + .runTest(); + } + + private static void doClientSide(SSLTest test) throws Exception { + + // Wait for server to get started. + // + // The server side takes care of the issue if the server cannot + // get started in 90 seconds. The client side would just ignore + // the test case if the serer is not ready. + if (!test.waitForServerSignal()) { + System.out.print("The server is not ready yet in 90 seconds. " + + "Ignore in client side."); + return; } - } - static void doClientSide() throws Exception { /* * setup up a proxy with authentication information */ @@ -155,27 +140,28 @@ * we want to avoid URLspoofCheck failures in cases where the cert * DN name does not match the hostname in the URL. */ - HttpsURLConnection.setDefaultHostnameVerifier( - new NameVerifier()); - URL url = new URL("https://" + "localhost:" + serverPort - + "/index.html"); - BufferedReader in = null; - try { - in = new BufferedReader(new InputStreamReader( - url.openStream())); + HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier()); + + URL url = new URL("https://" + "localhost:" + test.getServerPort() + + "/index.html"); + + // Signal the server, the client is ready to communicate. + test.signalClientReady(); + + try (BufferedReader in = new BufferedReader( + new InputStreamReader(url.openStream()))) { + String inputLine; System.out.print("Client recieved from the server: "); - while ((inputLine = in.readLine()) != null) + while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); - in.close(); - } catch (SSLException e) { - if (in != null) - in.close(); - throw e; + } } } static class NameVerifier implements HostnameVerifier { + + @Override public boolean verify(String hostname, SSLSession session) { return true; } @@ -195,15 +181,15 @@ pserver.start(); System.setProperty("https.proxyHost", "localhost"); - System.setProperty("https.proxyPort", String.valueOf( - pserver.getPort())); + System.setProperty("https.proxyPort", + String.valueOf(pserver.getPort())); } public static class TestAuthenticator extends Authenticator { + @Override public PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication("Test", - "test123".toCharArray()); + return new PasswordAuthentication("Test", "test123".toCharArray()); } } }