diff --git a/jdk/src/java.base/share/classes/java/net/spi/URLStreamHandlerProvider.java b/jdk/src/java.base/share/classes/java/net/spi/URLStreamHandlerProvider.java
new file mode 100644
index 00000000000..bfd0de937af
--- /dev/null
+++ b/jdk/src/java.base/share/classes/java/net/spi/URLStreamHandlerProvider.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2015, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package java.net.spi;
+
+import java.net.URLStreamHandlerFactory;
+
+/**
+ * URL stream handler service-provider class.
+ *
+ * A URL stream handler provider is a concrete subclass of this class that
+ * has a zero-argument constructor. URL stream handler providers may be
+ * installed in an instance of the Java platform by adding them to the
+ * application class path.
+ *
+ *
A URL stream handler provider identifies itself with a
+ * provider-configuration file named java.net.spi.URLStreamHandlerProvider in
+ * the resource directory META-INF/services. The file should contain a list of
+ * fully-qualified concrete URL stream handler provider class names, one per
+ * line.
+ *
+ * @since 1.9
+ */
+public abstract class URLStreamHandlerProvider
+ implements URLStreamHandlerFactory
+{
+ private static Void checkPermission() {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPermission(new RuntimePermission("setFactory"));
+ return null;
+ }
+ private URLStreamHandlerProvider(Void ignore) { }
+
+ /**
+ * Initializes a new URL stream handler provider.
+ *
+ * @throws SecurityException
+ * If a security manager has been installed and it denies
+ * {@link RuntimePermission}{@code ("setFactory")}.
+ */
+ protected URLStreamHandlerProvider() {
+ this(checkPermission());
+ }
+}
diff --git a/jdk/src/java.base/share/classes/java/net/spi/package-info.java b/jdk/src/java.base/share/classes/java/net/spi/package-info.java
new file mode 100644
index 00000000000..3be4ac8231f
--- /dev/null
+++ b/jdk/src/java.base/share/classes/java/net/spi/package-info.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+/**
+ * Service-provider classes for the {@link java.net} package.
+ *
+ *
Only developers who are defining new URL stream handler providers
+ * should need to make direct use of this package.
+ *
+ * @since 1.9
+ */
+
+package java.net.spi;
diff --git a/jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java b/jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java
new file mode 100644
index 00000000000..3e7e0b6c130
--- /dev/null
+++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2015, 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.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+import jdk.testlibrary.FileUtils;
+import jdk.testlibrary.JDKToolFinder;
+import static java.lang.String.format;
+import static java.util.Arrays.asList;
+
+/*
+ * @test
+ * @bug 8064924
+ * @summary Basic test for URLStreamHandlerProvider
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.FileUtils jdk.testlibrary.JDKToolFinder
+ * @compile Basic.java Child.java
+ * @run main Basic
+ */
+
+public class Basic {
+
+ static final Path TEST_SRC = Paths.get(System.getProperty("test.src", "."));
+ static final Path TEST_CLASSES = Paths.get(System.getProperty("test.classes", "."));
+
+ public static void main(String[] args) throws Throwable {
+ unknownProtocol("foo", UNKNOWN);
+ unknownProtocol("bar", UNKNOWN);
+ viaProvider("baz", KNOWN);
+ viaProvider("bert", KNOWN);
+ viaProvider("ernie", UNKNOWN, "-Djava.security.manager");
+ viaProvider("curly", UNKNOWN, "-Djava.security.manager");
+ viaProvider("larry", KNOWN, "-Djava.security.manager",
+ "-Djava.security.policy=" + TEST_SRC + File.separator + "basic.policy");
+ viaProvider("moe", KNOWN, "-Djava.security.manager",
+ "-Djava.security.policy=" + TEST_SRC + File.separator + "basic.policy");
+ viaBadProvider("tom", SCE);
+ viaBadProvider("jerry", SCE);
+ }
+
+ static final Consumer KNOWN = r -> {
+ if (r.exitValue != 0 || !r.output.isEmpty())
+ throw new RuntimeException(r.output);
+ };
+ static final Consumer UNKNOWN = r -> {
+ if (r.exitValue == 0 ||
+ !r.output.contains("java.net.MalformedURLException: unknown protocol")) {
+ throw new RuntimeException("exitValue: "+ r.exitValue + ", output:[" +r.output +"]");
+ }
+ };
+ static final Consumer SCE = r -> {
+ if (r.exitValue == 0 ||
+ !r.output.contains("java.util.ServiceConfigurationError")) {
+ throw new RuntimeException("exitValue: "+ r.exitValue + ", output:[" +r.output +"]");
+ }
+ };
+
+ static void unknownProtocol(String protocol, Consumer resultChecker) {
+ System.out.println("\nTesting " + protocol);
+ Result r = java(Collections.emptyList(), asList(TEST_CLASSES),
+ "Child", protocol);
+ resultChecker.accept(r);
+ }
+
+ static void viaProvider(String protocol, Consumer resultChecker,
+ String... sysProps)
+ throws Exception
+ {
+ viaProviderWithTemplate(protocol, resultChecker,
+ TEST_SRC.resolve("provider.template"),
+ sysProps);
+ }
+
+ static void viaBadProvider(String protocol, Consumer resultChecker,
+ String... sysProps)
+ throws Exception
+ {
+ viaProviderWithTemplate(protocol, resultChecker,
+ TEST_SRC.resolve("bad.provider.template"),
+ sysProps);
+ }
+
+ static void viaProviderWithTemplate(String protocol,
+ Consumer resultChecker,
+ Path template, String... sysProps)
+ throws Exception
+ {
+ System.out.println("\nTesting " + protocol);
+ Path testRoot = Paths.get("URLStreamHandlerProvider-" + protocol);
+ if (Files.exists(testRoot))
+ FileUtils.deleteFileTreeWithRetry(testRoot);
+ Files.createDirectory(testRoot);
+
+ Path srcPath = Files.createDirectory(testRoot.resolve("src"));
+ Path srcClass = createProvider(protocol, template, srcPath);
+
+ Path build = Files.createDirectory(testRoot.resolve("build"));
+ javac(build, srcClass);
+ createServices(build, protocol);
+ Path testJar = testRoot.resolve("test.jar");
+ jar(testJar, build);
+
+ List props = new ArrayList<>();
+ for (String p : sysProps)
+ props.add(p);
+
+ Result r = java(props, asList(testJar, TEST_CLASSES),
+ "Child", protocol);
+
+ resultChecker.accept(r);
+ }
+
+ static String platformPath(String p) { return p.replace("/", File.separator); }
+ static String binaryName(String name) { return name.replace(".", "/"); }
+
+ static final String SERVICE_IMPL_PREFIX = "net.java.openjdk.test";
+
+ static void createServices(Path dst, String protocol) throws IOException {
+ Path services = Files.createDirectories(dst.resolve("META-INF")
+ .resolve("services"));
+
+ final String implName = SERVICE_IMPL_PREFIX + "." + protocol + ".Provider";
+ Path s = services.resolve("java.net.spi.URLStreamHandlerProvider");
+ FileWriter fw = new FileWriter(s.toFile());
+ try {
+ fw.write(implName);
+ } finally {
+ fw.close();
+ }
+ }
+
+ static Path createProvider(String protocol, Path srcTemplate, Path dst)
+ throws IOException
+ {
+ String pkg = SERVICE_IMPL_PREFIX + "." + protocol;
+ Path classDst = dst.resolve(platformPath(binaryName(pkg)));
+ Files.createDirectories(classDst);
+ Path classPath = classDst.resolve("Provider.java");
+
+ List lines = Files.lines(srcTemplate)
+ .map(s -> s.replaceAll("\\$package", pkg))
+ .map(s -> s.replaceAll("\\$protocol", protocol))
+ .collect(Collectors.toList());
+ Files.write(classPath, lines);
+
+ return classPath;
+ }
+
+ static void jar(Path jarName, Path jarRoot) { String jar = getJDKTool("jar");
+ ProcessBuilder p = new ProcessBuilder(jar, "cf", jarName.toString(),
+ "-C", jarRoot.toString(), ".");
+ quickFail(run(p));
+ }
+
+ static void javac(Path dest, Path... sourceFiles) throws IOException {
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ try (StandardJavaFileManager fileManager =
+ compiler.getStandardFileManager(null, null, null)) {
+
+ List files = Stream.of(sourceFiles)
+ .map(p -> p.toFile())
+ .collect(Collectors.toList());
+ List dests = Stream.of(dest)
+ .map(p -> p.toFile())
+ .collect(Collectors.toList());
+ Iterable extends JavaFileObject> compilationUnits =
+ fileManager.getJavaFileObjectsFromFiles(files);
+ fileManager.setLocation(StandardLocation.CLASS_OUTPUT, dests);
+ JavaCompiler.CompilationTask task =
+ compiler.getTask(null, fileManager, null, null, null, compilationUnits);
+ boolean passed = task.call();
+ if (!passed)
+ throw new RuntimeException("Error compiling " + files);
+ }
+ }
+
+ static void quickFail(Result r) {
+ if (r.exitValue != 0)
+ throw new RuntimeException(r.output);
+ }
+
+ static Result java(List sysProps, Collection classpath,
+ String classname, String arg) {
+ String java = getJDKTool("java");
+
+ List commands = new ArrayList<>();
+ commands.add(java);
+ for (String prop : sysProps)
+ commands.add(prop);
+
+ String cp = classpath.stream()
+ .map(Path::toString)
+ .collect(Collectors.joining(File.pathSeparator));
+ commands.add("-cp");
+ commands.add(cp);
+ commands.add(classname);
+ commands.add(arg);
+
+ return run(new ProcessBuilder(commands));
+ }
+
+ static Result run(ProcessBuilder pb) {
+ Process p = null;
+ System.out.println("running: " + pb.command());
+ try {
+ p = pb.start();
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't start process '%s'", pb.command()), e);
+ }
+
+ String output;
+ try {
+ output = toString(p.getInputStream(), p.getErrorStream());
+ } catch (IOException e) {
+ throw new RuntimeException(
+ format("Couldn't read process output '%s'", pb.command()), e);
+ }
+
+ try {
+ p.waitFor();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(
+ format("Process hasn't finished '%s'", pb.command()), e);
+ }
+
+ return new Result(p.exitValue(), output);
+ }
+
+ static final String DEFAULT_IMAGE_BIN = System.getProperty("java.home")
+ + File.separator + "bin" + File.separator;
+
+ static String getJDKTool(String name) {
+ try {
+ return JDKToolFinder.getJDKTool(name);
+ } catch (Exception x) {
+ return DEFAULT_IMAGE_BIN + name;
+ }
+ }
+
+ static String toString(InputStream... src) throws IOException {
+ StringWriter dst = new StringWriter();
+ Reader concatenated =
+ new InputStreamReader(
+ new SequenceInputStream(
+ Collections.enumeration(asList(src))));
+ copy(concatenated, dst);
+ return dst.toString();
+ }
+
+ static void copy(Reader src, Writer dst) throws IOException {
+ int len;
+ char[] buf = new char[1024];
+ try {
+ while ((len = src.read(buf)) != -1)
+ dst.write(buf, 0, len);
+ } finally {
+ try {
+ src.close();
+ } catch (IOException ignored1) {
+ } finally {
+ try {
+ dst.close();
+ } catch (IOException ignored2) {
+ }
+ }
+ }
+ }
+
+ static class Result {
+ final int exitValue;
+ final String output;
+
+ private Result(int exitValue, String output) {
+ this.exitValue = exitValue;
+ this.output = output;
+ }
+ }
+}
diff --git a/jdk/test/java/net/spi/URLStreamHandlerProvider/Child.java b/jdk/test/java/net/spi/URLStreamHandlerProvider/Child.java
new file mode 100644
index 00000000000..82293291d41
--- /dev/null
+++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/Child.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, 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.MalformedURLException;
+import java.net.URL;
+
+public class Child {
+
+ public static void main(String[] args) throws MalformedURLException {
+ if (args.length != 1) {
+ System.err.println("Usage: java Child ");
+ return;
+ }
+ String protocol = args[0];
+ URL url = new URL(protocol + "://");
+
+ // toExternalForm should return the protocol string
+ String s = url.toExternalForm();
+ if (!s.equals(protocol)) {
+ System.err.println("Expected url.toExternalForm to return "
+ + protocol + ", but got: " + s);
+ System.exit(1);
+ }
+ }
+}
diff --git a/jdk/test/java/net/spi/URLStreamHandlerProvider/bad.provider.template b/jdk/test/java/net/spi/URLStreamHandlerProvider/bad.provider.template
new file mode 100644
index 00000000000..0ea4628e8f9
--- /dev/null
+++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/bad.provider.template
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+package $package;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.net.spi.URLStreamHandlerProvider;
+
+public class Provider extends URLStreamHandlerProvider {
+
+ public Provider(String someRandomArg) { // No no-args constructor
+ super();
+ }
+
+ @Override
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ return null;
+ }
+}
diff --git a/jdk/test/java/net/spi/URLStreamHandlerProvider/basic.policy b/jdk/test/java/net/spi/URLStreamHandlerProvider/basic.policy
new file mode 100644
index 00000000000..fa84f5fe5d9
--- /dev/null
+++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/basic.policy
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+ grant {
+ permission java.lang.RuntimePermission "setFactory";
+};
+
diff --git a/jdk/test/java/net/spi/URLStreamHandlerProvider/provider.template b/jdk/test/java/net/spi/URLStreamHandlerProvider/provider.template
new file mode 100644
index 00000000000..1bd2c13bd46
--- /dev/null
+++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/provider.template
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+package $package;
+
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.net.spi.URLStreamHandlerProvider;
+
+public class Provider extends URLStreamHandlerProvider {
+
+ private static final String PROTOCOL = "$protocol";
+
+ @Override
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (!PROTOCOL.equals(protocol))
+ return null;
+
+ return new Handler();
+ }
+
+ static class Handler extends URLStreamHandler {
+ public URLConnection openConnection(URL u) throws java.io.IOException {
+ return null;
+ }
+
+ public String toExternalForm(URL u) { return PROTOCOL; }
+ }
+}
diff --git a/jdk/test/javax/net/ssl/FixingJavadocs/ComURLNulls.java b/jdk/test/javax/net/ssl/FixingJavadocs/ComURLNulls.java
index 497bb58e2ea..88aa92772c8 100644
--- a/jdk/test/javax/net/ssl/FixingJavadocs/ComURLNulls.java
+++ b/jdk/test/javax/net/ssl/FixingJavadocs/ComURLNulls.java
@@ -46,12 +46,23 @@ import com.sun.net.ssl.HostnameVerifier;
public class ComURLNulls {
+ private static class ComSunHTTPSHandlerFactory implements URLStreamHandlerFactory {
+ private static String SUPPORTED_PROTOCOL = "https";
+
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (!protocol.equalsIgnoreCase(SUPPORTED_PROTOCOL))
+ return null;
+
+ return new com.sun.net.ssl.internal.www.protocol.https.Handler();
+ }
+ }
+
public static void main(String[] args) throws Exception {
HostnameVerifier reservedHV =
HttpsURLConnection.getDefaultHostnameVerifier();
try {
- System.setProperty("java.protocol.handler.pkgs",
- "com.sun.net.ssl.internal.www.protocol");
+ URL.setURLStreamHandlerFactory(new ComSunHTTPSHandlerFactory());
+
/**
* This test does not establish any connection to the specified
* URL, hence a dummy URL is used.
diff --git a/jdk/test/sun/net/www/protocol/https/NewImpl/ComHTTPSConnection.java b/jdk/test/sun/net/www/protocol/https/NewImpl/ComHTTPSConnection.java
index ce6f59c8909..486d234003c 100644
--- a/jdk/test/sun/net/www/protocol/https/NewImpl/ComHTTPSConnection.java
+++ b/jdk/test/sun/net/www/protocol/https/NewImpl/ComHTTPSConnection.java
@@ -188,6 +188,17 @@ public class ComHTTPSConnection {
}
}
+ private static class ComSunHTTPSHandlerFactory implements URLStreamHandlerFactory {
+ private static String SUPPORTED_PROTOCOL = "https";
+
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (!protocol.equalsIgnoreCase(SUPPORTED_PROTOCOL))
+ return null;
+
+ return new com.sun.net.ssl.internal.www.protocol.https.Handler();
+ }
+ }
+
/*
* Define the client side of the test.
*
@@ -205,8 +216,7 @@ public class ComHTTPSConnection {
HostnameVerifier reservedHV =
HttpsURLConnection.getDefaultHostnameVerifier();
try {
- System.setProperty("java.protocol.handler.pkgs",
- "com.sun.net.ssl.internal.www.protocol");
+ URL.setURLStreamHandlerFactory(new ComSunHTTPSHandlerFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new NameVerifier());
URL url = new URL("https://" + "localhost:" + serverPort +
diff --git a/jdk/test/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java b/jdk/test/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java
index ed4cf6836e0..ba065f7c3e4 100644
--- a/jdk/test/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java
+++ b/jdk/test/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java
@@ -186,6 +186,17 @@ public class ComHostnameVerifier {
}
}
+ private static class ComSunHTTPSHandlerFactory implements URLStreamHandlerFactory {
+ private static String SUPPORTED_PROTOCOL = "https";
+
+ public URLStreamHandler createURLStreamHandler(String protocol) {
+ if (!protocol.equalsIgnoreCase(SUPPORTED_PROTOCOL))
+ return null;
+
+ return new com.sun.net.ssl.internal.www.protocol.https.Handler();
+ }
+ }
+
/*
* Define the client side of the test.
*
@@ -200,8 +211,7 @@ public class ComHostnameVerifier {
Thread.sleep(50);
}
- System.setProperty("java.protocol.handler.pkgs",
- "com.sun.net.ssl.internal.www.protocol");
+ URL.setURLStreamHandlerFactory(new ComSunHTTPSHandlerFactory());
System.setProperty("https.cipherSuites",
"SSL_DH_anon_WITH_3DES_EDE_CBC_SHA");