8148626: URI.toURL needs to use protocol Handler to parse file URIs
Summary: Back out the parts of 8147462 that attempted to optimize file URI to URL conversions
Reviewed-by: darcy, chegar
--- a/jdk/src/java.base/share/classes/java/net/URL.java Fri Jan 29 17:03:17 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/net/URL.java Sun Jan 31 22:30:35 2016 +0100
@@ -669,13 +669,15 @@
throw new IllegalArgumentException("URI is not absolute");
}
String protocol = uri.getScheme();
- if (!uri.isOpaque() && uri.getRawFragment() == null &&
- !isOverrideable(protocol)) {
- // non-opaque URIs will have already validated the components,
- // so using the component-based URL constructor here is safe.
- //
- // All URL constructors will properly check if the scheme
- // maps to a valid protocol handler
+
+ // In general we need to go via Handler.parseURL, but for the jrt
+ // protocol we enforce that the Handler is not overrideable and can
+ // optimize URI to URL conversion.
+ //
+ // Case-sensitive comparison for performance; malformed protocols will
+ // be handled correctly by the slow path.
+ if (protocol.equals("jrt") && !uri.isOpaque()
+ && uri.getRawFragment() == null) {
String query = uri.getRawQuery();
String path = uri.getRawPath();
@@ -689,7 +691,7 @@
int port = uri.getPort();
- return new URL(protocol, host, port, file, null);
+ return new URL("jrt", host, port, file, null);
} else {
return new URL((URL)null, uri.toString(), null);
}