mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +02:00
8051627: Invariants about java.net.URI resolve and relativize are wrong
Reviewed-by: dfuchs
This commit is contained in:
parent
df6cf1e41d
commit
ab1f9ffa78
2 changed files with 57 additions and 5 deletions
|
@ -219,12 +219,20 @@ import sun.nio.cs.UTF_8;
|
||||||
* {@code demo/b/index.html}
|
* {@code demo/b/index.html}
|
||||||
* </blockquote>
|
* </blockquote>
|
||||||
*
|
*
|
||||||
* <p> <i>Relativization</i>, finally, is the inverse of resolution: For any
|
* <p> <i>Relativization</i>, finally, can be regarded as the inverse of resolution.
|
||||||
* two normalized URIs <i>u</i> and <i>v</i>,
|
* Let <i>u</i> be any normalized absolute URI ending with a slash character ({@code '/'})
|
||||||
|
* and <i>v</i> be any normalized relative URI not beginning with a period character ({@code '.'})
|
||||||
|
* or slash character ({@code '/'}). Then, the following statement is true:
|
||||||
*
|
*
|
||||||
* <blockquote>
|
* <blockquote>
|
||||||
* <i>u</i>{@code .relativize(}<i>u</i>{@code .resolve(}<i>v</i>{@code )).equals(}<i>v</i>{@code )} and<br>
|
* <i>u</i>{@code .relativize(}<i>u</i>{@code .resolve(}<i>v</i>{@code )).equals(}<i>v</i>{@code )}
|
||||||
* <i>u</i>{@code .resolve(}<i>u</i>{@code .relativize(}<i>v</i>{@code )).equals(}<i>v</i>{@code )} .<br>
|
* </blockquote>
|
||||||
|
*
|
||||||
|
* Let <i>u</i> be any normalized absolute URI ending with a slash character ({@code '/'})
|
||||||
|
* and <i>v</i> be any normalized absolute URI. Then, the following statement is true:
|
||||||
|
*
|
||||||
|
* <blockquote>
|
||||||
|
* <i>u</i>{@code .resolve(}<i>u</i>{@code .relativize(}<i>v</i>{@code )).equals(}<i>v</i>{@code )}
|
||||||
* </blockquote>
|
* </blockquote>
|
||||||
*
|
*
|
||||||
* This operation is often useful when constructing a document containing URIs
|
* This operation is often useful when constructing a document containing URIs
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
/* @test
|
/* @test
|
||||||
* @summary Unit test for java.net.URI
|
* @summary Unit test for java.net.URI
|
||||||
* @bug 4464135 4505046 4503239 4438319 4991359 4866303 7023363 7041800
|
* @bug 4464135 4505046 4503239 4438319 4991359 4866303 7023363 7041800
|
||||||
* 7171415 6339649 6933879 8037396 8272072
|
* 7171415 6339649 6933879 8037396 8272072 8051627
|
||||||
* @author Mark Reinhold
|
* @author Mark Reinhold
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1617,6 +1617,7 @@ public class Test {
|
||||||
b6339649();
|
b6339649();
|
||||||
b6933879();
|
b6933879();
|
||||||
b8037396();
|
b8037396();
|
||||||
|
b8051627();
|
||||||
b8272072();
|
b8272072();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1677,6 +1678,49 @@ public class Test {
|
||||||
eq("a%20b[c%20d]", u.getRawFragment());
|
eq("a%20b[c%20d]", u.getRawFragment());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 8051627 - Invariants about java.net.URI resolve and relativize are wrong
|
||||||
|
private static void b8051627() {
|
||||||
|
try {
|
||||||
|
// Let u be a normalized absolute URI u which ends with "/" and
|
||||||
|
// v be a normalized relative URI v which does not start with "." or "/", then
|
||||||
|
// u.relativize(u.resolve(v)).equals(v) should be true
|
||||||
|
reltivizeAfterResolveTest("http://a/b/", "c/d", "c/d");
|
||||||
|
reltivizeAfterResolveTest("http://a/b/", "g;x?y#s", "g;x?y#s");
|
||||||
|
|
||||||
|
// when the URI condition is not met, u.relativize(u.resolve(v)).equals(v) may be false
|
||||||
|
// In the following examples, that should be false
|
||||||
|
reltivizeAfterResolveTest("http://a/b", "c/d", "http://a/c/d");
|
||||||
|
reltivizeAfterResolveTest("http://a/b/", "../c/d", "http://a/c/d");
|
||||||
|
reltivizeAfterResolveTest("http://a/b/", "/c/d", "http://a/c/d");
|
||||||
|
reltivizeAfterResolveTest("http://a/b/", "http://a/b/c/d", "c/d");
|
||||||
|
|
||||||
|
// Let u be a normalized absolute URI u which ends with "/" and
|
||||||
|
// v be a normalized absolute URI v, then
|
||||||
|
// u.resolve(u.relativize(v)).equals(v) should be true
|
||||||
|
resolveAfterRelativizeTest("http://a/b/", "http://a/b/c/d", "http://a/b/c/d");
|
||||||
|
resolveAfterRelativizeTest("http://a/b/", "http://a/b/c/g;x?y#s", "http://a/b/c/g;x?y#s");
|
||||||
|
|
||||||
|
// when the URI condition is not met, u.resolve(u.relativize(v)).equals(v) may be false
|
||||||
|
// In the following examples, that should be false
|
||||||
|
resolveAfterRelativizeTest("http://a/b", "http://a/b/c/d", "http://a/c/d");
|
||||||
|
resolveAfterRelativizeTest("http://a/b/", "c/d", "http://a/b/c/d");
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
throw new AssertionError("shouldn't ever happen", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static void reltivizeAfterResolveTest(String base, String target, String expected)
|
||||||
|
throws URISyntaxException {
|
||||||
|
URI baseURI = URI.create(base);
|
||||||
|
URI targetURI = URI.create(target);
|
||||||
|
eq(URI.create(expected), baseURI.relativize(baseURI.resolve(targetURI)));
|
||||||
|
}
|
||||||
|
private static void resolveAfterRelativizeTest(String base, String target, String expected)
|
||||||
|
throws URISyntaxException {
|
||||||
|
URI baseURI = URI.create(base);
|
||||||
|
URI targetURI = URI.create(target);
|
||||||
|
eq(URI.create(expected), baseURI.resolve(baseURI.relativize(targetURI)));
|
||||||
|
}
|
||||||
|
|
||||||
// 8272072 - Resolving URI relative path with no "/" may lead to incorrect toString
|
// 8272072 - Resolving URI relative path with no "/" may lead to incorrect toString
|
||||||
private static void b8272072() {
|
private static void b8272072() {
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue