Hi, i investigated the problem described in JDK-8022748[1] i found that we need to rescue the parser for confusion while parsing relative URIs. A URI created through the relativize-method is schemaless and so it need to handle the special-case (a colon in the path-element). While there is another way to handle this (encode the colon as %3A) i think we should not choose that solution. First it would introduce another style of special-case handling of a colon in the path (see the method maybeAddLeadingDot which is used while normalizing) and when resolving it back we would need to decode it back or leave it the encoded way which is not suggest by RFC2396 section "1.5 URI Transcribability". Also in Section 5 of RFC2396 it is suggested to rescue a colon in the path-element in a relative URI through prepending a "./" just like in maybeAddLeadingDot.
As i am not an author, but i am a contributer who signed the OCA, and I learned in the last days that a patch must come through openjdk infrastructure, i am sorry that I need to embed my suggested patch below and does not come as a webrev hosted on my dropbox which i would normaly do. It would be nice if someone would sponsor this, by hosting this for further review on cr.openjdk.java.net or by doing the needed discussion/adaption work prio applying it. -- Sebastian [1] https://bugs.openjdk.java.net/browse/JDK-8022748 diff -r e26938360e58 src/java.base/share/classes/java/net/URI.java --- a/src/java.base/share/classes/java/net/URI.java Thu Sep 03 14:24:44 2015 -0700 +++ b/src/java.base/share/classes/java/net/URI.java Thu Sep 10 07:19:53 2015 +0200 @@ -2144,9 +2144,16 @@ } URI v = new URI(); - v.path = cp.substring(bp.length()); v.query = child.query; v.fragment = child.fragment; + + // While relativizing we loose the schema part of the URI. + // As mentioned in section 5 of RFC 2396 we must prepend + // relative URI containing a colon with a "./" to not + // confuse parsing. + v.path = (cp.indexOf(":") >= bp.length() ? "./" : "") + + cp.substring(bp.length()); + return v; } diff -r e26938360e58 test/java/net/URI/Relativize.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/URI/Relativize.java Thu Sep 10 07:33:44 2015 +0200 @@ -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. + */ +/** + * @test + * @bug 8022748 + * @summary new URI(u.toString()).equals(u) does not hold with paths containing colons + */ + +import java.net.URI; +import java.net.URISyntaxException; + +public class Relativize { + public static void main(String[] args) throws URISyntaxException { + URI orig = new URI(null, null, "/a:b" , null); + URI u = new URI( "." ).relativize(orig); + if (!new URI(u.toString()).equals(u)) { + throw new RuntimeException("Test failed"); + } + System.out.println("Test succeed"); + } +}