/* * Copyright (c) 2013, 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. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.net.HttpURLPermission; /* * Run the tests once without security manager and once with * * @test * @bug 8010464 * @compile ../../../com/sun/net/httpserver/SimpleSSLContext.java * @run main/othervm/policy=policy.1 URLTest one * @run main/othervm URLTest one * @run main/othervm/policy=policy.2 URLTest two * @run main/othervm URLTest two * @run main/othervm/policy=policy.3 URLTest three * @run main/othervm URLTest three */ import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; import java.util.logging.*; import com.sun.net.httpserver.*; import javax.net.ssl.*; public class URLTest { static boolean failed = false; public static void main (String[] args) throws Exception { boolean no = false, yes = true; if (System.getSecurityManager() == null) { yes = false; } createServers(); InetSocketAddress addr1 = httpServer.getAddress(); int port1 = addr1.getPort(); InetSocketAddress addr2 = httpsServer.getAddress(); int port2 = addr2.getPort(); // each of the following cases is run with a different policy file switch (args[0]) { case "one": String url1 = "http://127.0.0.1:"+ port1 + "/foo.html"; String url2 = "https://127.0.0.1:"+ port2 + "/foo.html"; String url3 = "http://127.0.0.1:"+ port1 + "/bar.html"; String url4 = "https://127.0.0.1:"+ port2 + "/bar.html"; // simple positive test. Should succceed test(url1, "GET", "X-Foo", no); test(url1, "GET", "Z-Bar", "X-Foo", no); test(url1, "GET", "X-Foo", "Z-Bar", no); test(url1, "GET", "Z-Bar", no); test(url2, "POST", "X-Fob", no); // reverse the methods, should fail test(url1, "POST", "X-Foo", yes); test(url2, "GET", "X-Fob", yes); // different URLs, should fail test(url3, "GET", "X-Foo", yes); test(url4, "POST", "X-Fob", yes); break; case "two": url1 = "http://127.0.0.1:"+ port1 + "/foo.html"; url2 = "https://127.0.0.1:"+ port2 + "/foo.html"; url3 = "http://127.0.0.1:"+ port1 + "/bar.html"; url4 = "https://127.0.0.1:"+ port2 + "/bar.html"; // simple positive test. Should succceed test(url1, "GET", "X-Foo", no); test(url2, "POST", "X-Fob", no); test(url3, "GET", "X-Foo", no); test(url4, "POST", "X-Fob", no); break; case "three": url1 = "http://127.0.0.1:"+ port1 + "/foo.html"; url2 = "https://127.0.0.1:"+ port2 + "/a/c/d/e/foo.html"; url3 = "http://127.0.0.1:"+ port1 + "/a/b/c"; url4 = "https://127.0.0.1:"+ port2 + "/a/b/c"; test(url1, "GET", "X-Foo", yes); test(url2, "POST", "X-Zxc", no); test(url3, "DELETE", "Y-Foo", no); test(url4, "POST", "Y-Foo", yes); break; } shutdown(); if (failed) { throw new RuntimeException("Test failed"); } } public static void test ( String u, String method, String header, boolean exceptionExpected ) throws Exception { test(u, method, header, null, exceptionExpected); } public static void test ( String u, String method, String header1, String header2, boolean exceptionExpected ) throws Exception { URL url = new URL(u); System.out.println ("url=" + u + " method="+method + " header1="+header1 +" header2 = " + header2 +" exceptionExpected="+exceptionExpected); HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); if (urlc instanceof HttpsURLConnection) { HttpsURLConnection ssl = (HttpsURLConnection)urlc; ssl.setHostnameVerifier(new HostnameVerifier() { public boolean verify(String host, SSLSession sess) { return true; } }); ssl.setSSLSocketFactory (ctx.getSocketFactory()); } urlc.setRequestMethod(method); if (header1 != null) { urlc.addRequestProperty(header1, "foo"); } if (header2 != null) { urlc.addRequestProperty(header2, "bar"); } try { int g = urlc.getResponseCode(); if (exceptionExpected) { failed = true; System.out.println ("FAIL"); return; } if (g != 200) { String s = Integer.toString(g); throw new RuntimeException("unexpected response "+ s); } InputStream is = urlc.getInputStream(); int c,count=0; byte[] buf = new byte[1024]; while ((c=is.read(buf)) != -1) { count += c; } is.close(); } catch (RuntimeException e) { if (! (e instanceof SecurityException) && !(e.getCause() instanceof SecurityException) || !exceptionExpected) { System.out.println ("FAIL"); //e.printStackTrace(); failed = true; } } System.out.println ("OK"); } static HttpServer httpServer; static HttpsServer httpsServer; static HttpContext c, cs; static ExecutorService e, es; static SSLContext ctx; // These ports need to be hard-coded until we support port number // ranges in the permission class static final int PORT1 = 12567; static final int PORT2 = 12568; static void createServers() throws Exception { InetSocketAddress addr1 = new InetSocketAddress (PORT1); InetSocketAddress addr2 = new InetSocketAddress (PORT2); httpServer = HttpServer.create (addr1, 0); httpsServer = HttpsServer.create (addr2, 0); MyHandler h = new MyHandler(); c = httpServer.createContext ("/", h); cs = httpsServer.createContext ("/", h); e = Executors.newCachedThreadPool(); es = Executors.newCachedThreadPool(); httpServer.setExecutor (e); httpsServer.setExecutor (es); // take the keystore from elsewhere in test hierarchy String keysdir = System.getProperty("test.src") + "/../../../com/sun/net/httpserver/"; ctx = new SimpleSSLContext(keysdir).get(); httpsServer.setHttpsConfigurator(new HttpsConfigurator (ctx)); httpServer.start(); httpsServer.start(); } static void shutdown() { httpServer.stop(1); httpsServer.stop(1); e.shutdown(); es.shutdown(); } static class MyHandler implements HttpHandler { MyHandler() { } public void handle(HttpExchange x) throws IOException { x.sendResponseHeaders(200, -1); x.close(); } } }