Index: java/net/URL.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/net/URL.java,v retrieving revision 1.26 diff -u -r1.26 URL.java --- java/net/URL.java 8 Apr 2004 17:25:02 -0000 1.26 +++ java/net/URL.java 20 Apr 2004 06:27:29 -0000 @@ -141,6 +141,11 @@ private String host; /** + * The user information necessary to establish the connection. + */ + private String userInfo; + + /** * The port number of this protocol or -1 if the port number used is * the default for this protocol. */ @@ -276,7 +281,9 @@ this.host = host; this.port = port; - this.authority = null; + this.authority = (host != null) ? host : ""; + if (port >= 0) + this.authority += ":" + port; int hashAt = file.indexOf('#'); if (hashAt < 0) @@ -480,7 +487,7 @@ * * @since 1.3 */ - public Object getContent() throws IOException + public final Object getContent() throws IOException { return openConnection().getContent(); } @@ -494,7 +501,7 @@ * * @exception IOException If an error occurs */ - public Object getContent(Class[] classes) throws IOException + public final Object getContent(Class[] classes) throws IOException { // FIXME: implement this return getContent(); @@ -653,7 +660,7 @@ * * @exception IOException If an error occurs */ - public InputStream openStream() throws IOException + public final InputStream openStream() throws IOException { return openConnection().getInputStream(); } @@ -694,11 +701,17 @@ // be aware of this. this.ph = getURLStreamHandler(protocol); this.protocol = protocol.toLowerCase(); - this.authority = null; + this.authority = ""; this.port = port; this.host = host; this.file = file; this.ref = ref; + + if (host != null) + this.authority += host; + if (port >= 0) + this.authority += ":" + port; + hashCode = hashCode(); // Used for serialization. } @@ -727,15 +740,15 @@ // be aware of this. this.ph = getURLStreamHandler(protocol); this.protocol = protocol.toLowerCase(); - if (userInfo == null) - this.host = host; - else - this.host = userInfo + "@" + host; + this.host = host; + this.userInfo = userInfo; this.port = port; + this.file = path; + this.authority = authority; if (query == null) - this.file = path; + this.file = file; else - this.file = path + "?" + query; + this.file = file + "?" + query; this.ref = ref; hashCode = hashCode(); // Used for serialization. } Index: java/net/URLStreamHandler.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/net/URLStreamHandler.java,v retrieving revision 1.26 diff -u -r1.26 URLStreamHandler.java --- java/net/URLStreamHandler.java 8 Apr 2004 17:25:02 -0000 1.26 +++ java/net/URLStreamHandler.java 20 Apr 2004 06:27:29 -0000 @@ -126,6 +126,9 @@ int port = url.getPort(); String file = url.getFile(); String ref = url.getRef(); + String userInfo = url.getUserInfo(); + String authority = url.getAuthority(); + String query = null; if (spec.regionMatches(start, "//", 0, 2)) { @@ -141,14 +144,17 @@ else hostEnd = end; - host = spec.substring(start, hostEnd); + authority = host = spec.substring(start, hostEnd); // We first need a genuine host name (with userinfo). // So we check for '@': if it's present check the port in the // section after '@' in the other case check it in the full string. // P.S.: We don't care having '@' at the beginning of the string. if ((at_host = host.indexOf('@')) >= 0) - genuineHost = host.substring(at_host); + { + genuineHost = host.substring(at_host); + userInfo = host.substring(0, at_host); + } else genuineHost = host; @@ -238,10 +244,21 @@ } } + // We care about the query tag only if there is no reference at all. + if (ref == null) + { + int queryTag = file.indexOf('?'); + if (queryTag != -1) + { + query = file.substring(queryTag + 1); + file = file.substring(0, queryTag); + } + } + // XXX - Classpath used to call PlatformHelper.toCanonicalForm() on // the file part. It seems like overhead, but supposedly there is some // benefit in windows based systems (it also lowercased the string). - setURL(url, url.getProtocol(), host, port, file, ref); + setURL(url, url.getProtocol(), host, port, authority, userInfo, file, query, ref); } /* @@ -492,42 +509,31 @@ String file; String ref; String user; + String authority; int port; protocol = url.getProtocol(); - - // JDK 1.2 online doc infers that host could be null because it - // explicitly states that file cannot be null, but is silent on host. - host = url.getHost(); - if (host == null) - host = ""; - - port = url.getPort(); + authority = url.getAuthority(); + if (authority == null) + authority = ""; + file = url.getFile(); ref = url.getRef(); - user = url.getUserInfo(); // Guess a reasonable size for the string buffer so we have to resize // at most once. - int size = protocol.length() + host.length() + file.length() + 24; + int size = protocol.length() + authority.length() + file.length() + 24; StringBuffer sb = new StringBuffer(size); - if (protocol.length() != 0) + if (protocol != null && protocol.length() > 0) { sb.append(protocol); sb.append(":"); } - - if (host.length() != 0) + + if (authority.length() != 0) { - sb.append("//"); - if (user != null && ! "".equals(user)) - sb.append(user).append('@'); - sb.append(host); - - // Append port if port was in URL spec. - if (port >= 0) - sb.append(':').append(port); + sb.append("//").append(authority); } sb.append(file);