update to OpenJDK 11, bump to 2.0.0, add URL.parseQueryParams()
This commit is contained in:
parent
e154bb2cb7
commit
98470dc638
8 changed files with 71 additions and 45 deletions
|
@ -33,8 +33,8 @@ subprojects {
|
|||
}
|
||||
|
||||
compileJava {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
}
|
||||
|
||||
compileTestJava {
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
group = org.xbib
|
||||
name = net
|
||||
version = 1.3.4
|
||||
version = 2.0.0
|
||||
|
||||
# test
|
||||
jackson.version = 2.8.11
|
||||
junit.version = 5.4.2
|
||||
junit.version = 5.5.1
|
||||
hamcrest.version = 2.1
|
||||
jackson.version = 2.9.9
|
||||
|
||||
# doc
|
||||
asciidoclet.version = 1.5.4
|
||||
|
||||
org.gradle.warning.mode = all
|
||||
|
|
|
@ -5,7 +5,7 @@ package org.xbib.net;
|
|||
* @param <K> the key type parameter
|
||||
* @param <V> the value type parameter
|
||||
*/
|
||||
public class Pair<K, V> {
|
||||
public class Pair<K, V> implements Comparable<Pair<K, V>> {
|
||||
|
||||
private final K first;
|
||||
|
||||
|
@ -26,6 +26,11 @@ public class Pair<K, V> {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return first + ":" + second;
|
||||
return first + "=" + second;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Pair<K, V> pair) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import java.util.Comparator;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
|
@ -253,7 +254,7 @@ public class URL implements Comparable<URL> {
|
|||
|
||||
/**
|
||||
* Return a special URL denoting the fact that this URL should be considered as invalid.
|
||||
* The URL has a null scheme.
|
||||
* The URL has no scheme.
|
||||
* @return url
|
||||
*/
|
||||
public static URL nullUrl() {
|
||||
|
@ -317,10 +318,11 @@ public class URL implements Comparable<URL> {
|
|||
return sb.toString();
|
||||
}
|
||||
|
||||
public String decode(String input) {
|
||||
public static QueryParameters parseQueryString(String query) {
|
||||
Objects.requireNonNull(query);
|
||||
try {
|
||||
return builder.percentDecoder.decode(input);
|
||||
} catch (MalformedInputException | UnmappableCharacterException e) {
|
||||
return URL.parser().parse(query.charAt(0) == QUESTION_CHAR ? query : QUESTION_CHAR + query).getQueryParams();
|
||||
} catch (URLSyntaxException | MalformedInputException | UnmappableCharacterException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
}
|
||||
|
@ -333,6 +335,14 @@ public class URL implements Comparable<URL> {
|
|||
return new Builder();
|
||||
}
|
||||
|
||||
private String decode(String input) {
|
||||
try {
|
||||
return builder.percentDecoder.decode(input);
|
||||
} catch (MalformedInputException | UnmappableCharacterException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private String toString(boolean withFragment) {
|
||||
if (internalStringRepresentation != null) {
|
||||
return internalStringRepresentation;
|
||||
|
|
|
@ -33,7 +33,7 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testScheme() throws Exception {
|
||||
void testScheme() {
|
||||
URL url = URL.from("http://");
|
||||
assertEquals("http://", url.toExternalForm());
|
||||
assertEquals("http://", url.toString());
|
||||
|
@ -52,7 +52,7 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testOpaque() throws Exception {
|
||||
void testOpaque() {
|
||||
URL url = URL.from("a:b");
|
||||
assertEquals("a", url.getScheme());
|
||||
assertEquals("b", url.getSchemeSpecificPart());
|
||||
|
@ -68,7 +68,7 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testWithoutDoubleSlash() throws Exception {
|
||||
void testWithoutDoubleSlash() {
|
||||
URL url = URL.from("http:foo.com");
|
||||
assertEquals("http:foo.com", url.toExternalForm());
|
||||
assertEquals("http:foo.com", url.toString());
|
||||
|
@ -82,14 +82,14 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testSchemeHost() throws Exception {
|
||||
void testSchemeHost() {
|
||||
URL url = URL.from("http://foo.bar");
|
||||
assertEquals("http://foo.bar", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSchemeHostPort() throws Exception {
|
||||
void testSchemeHostPort() {
|
||||
URL url = URL.from("http://f:/c");
|
||||
assertEquals("http://f:/c", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
|
@ -103,28 +103,28 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testSchemeHostAuthInfo() throws Exception {
|
||||
void testSchemeHostAuthInfo() {
|
||||
URL url = URL.from("http://auth@foo.bar");
|
||||
assertEquals("http://auth@foo.bar", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSchemeHostAuthInfoPort() throws Exception {
|
||||
void testSchemeHostAuthInfoPort() {
|
||||
URL url = URL.from("http://auth@foo.bar:1");
|
||||
assertEquals("http://auth@foo.bar:1", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testSchemeHostAuthInfoPortPath() throws Exception {
|
||||
void testSchemeHostAuthInfoPortPath() {
|
||||
URL url = URL.from("http://auth@foo.bar:1/path");
|
||||
assertEquals("http://auth@foo.bar:1/path", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testTrailingSlash() throws Exception {
|
||||
void testTrailingSlash() {
|
||||
URL url = URL.from("http://foo.bar/path/");
|
||||
assertEquals("http://foo.bar/path/", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
|
@ -137,21 +137,21 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testQuery() throws Exception {
|
||||
void testQuery() {
|
||||
URL url = URL.from("http://auth@foo.bar:1/path?query");
|
||||
assertEquals("http://auth@foo.bar:1/path?query", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFragment() throws Exception {
|
||||
void testFragment() {
|
||||
URL url = URL.from("http://auth@foo.bar:1/path#fragment");
|
||||
assertEquals("http://auth@foo.bar:1/path#fragment", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testReservedChar() throws Exception {
|
||||
void testReservedChar() {
|
||||
URL url = URL.from("http://www.google.com/ig/calculator?q=1USD=?EUR");
|
||||
if ("false".equals(System.getProperty("java.net.preferIPv6Addresses"))) {
|
||||
assertEquals("http://www.google.com/ig/calculator?q=1USD%3D?EUR", url.toString());
|
||||
|
@ -160,7 +160,7 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testPassword() throws Exception {
|
||||
void testPassword() {
|
||||
URL url = URL.from("ftp://aaa:b%2B1@www.google.com");
|
||||
assertEquals("b+1", url.getPassword());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
|
@ -170,21 +170,21 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testPlus() throws Exception {
|
||||
void testPlus() {
|
||||
URL url = URL.from("http://foobar:8080/test/print?value=%EA%B0%80+%EB%82%98");
|
||||
assertEquals("http://foobar:8080/test/print?value=%EA%B0%80%2B%EB%82%98", url.toExternalForm());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIPv6() throws Exception {
|
||||
void testIPv6() {
|
||||
URL url = URL.from("http://[2001:db8:85a3::8a2e:370:7334]");
|
||||
assertEquals("http://[2001:db8:85a3:0:0:8a2e:370:7334]", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIPv6WithScope() throws Exception {
|
||||
void testIPv6WithScope() {
|
||||
// test scope ID. Must be a valid IPv6
|
||||
URL url = URL.from("http://[3002:0:0:0:20c:29ff:fe64:614a%2]:8080/resource");
|
||||
assertEquals("http://[3002:0:0:0:20c:29ff:fe64:614a%2]:8080/resource", url.toString());
|
||||
|
@ -192,7 +192,7 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testIPv6WithIPv4() throws Exception {
|
||||
void testIPv6WithIPv4() {
|
||||
URL url = URL.from("http://[::192.168.1.1]:8080/resource");
|
||||
assertEquals("http://[0:0:0:0:0:0:c0a8:101]:8080/resource", url.toString());
|
||||
assertRoundTrip(url.toExternalForm());
|
||||
|
@ -265,12 +265,12 @@ class URLParserTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testFromUrlMalformedQueryParamMultiValues() throws Exception {
|
||||
void testFromUrlMalformedQueryParamMultiValues() {
|
||||
assertRoundTrip("http://foo.com/foo?q1=v1=v2");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFromUrlQueryWithEscapedChars() throws Exception {
|
||||
void testFromUrlQueryWithEscapedChars() {
|
||||
assertRoundTrip("http://foo.com/foo?query==&%23");
|
||||
}
|
||||
|
||||
|
@ -338,12 +338,21 @@ class URLParserTest {
|
|||
|
||||
@Test
|
||||
void testRelative() throws Exception {
|
||||
URL url = URL.parser().parse("/foo/bar?foo=bar#fragment");
|
||||
URL url = URL.parser().parse("/some/path?foo=bar#fragment");
|
||||
assertNull(url.getScheme());
|
||||
assertEquals("", url.getHostInfo());
|
||||
assertEquals("/foo/bar", url.getPath());
|
||||
assertEquals("/some/path", url.getPath());
|
||||
assertEquals("foo=bar", url.getQuery());
|
||||
assertEquals("fragment", url.getFragment());
|
||||
assertEquals("[foo=bar]", url.getQueryParams().toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testQueryParams() throws Exception {
|
||||
URL url = URL.parser().parse("?foo=bar");
|
||||
assertEquals("foo=bar", url.getQuery());
|
||||
assertEquals("[foo=bar]", url.getQueryParams().toString());
|
||||
assertEquals("[k1=v1, k2=v2]", URL.parseQueryString("k1=v1&k2=v2").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -417,7 +426,7 @@ class URLParserTest {
|
|||
assertEquals(s, new java.net.URL(url).toExternalForm());
|
||||
}
|
||||
|
||||
private void assertRoundTrip(String url) throws Exception {
|
||||
private void assertRoundTrip(String url) {
|
||||
String s = URL.from(url).toExternalForm();
|
||||
assertEquals(s, URL.from(s).toExternalForm());
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||
class URLResolverTest {
|
||||
|
||||
@Test
|
||||
void testResolveURI() throws Exception {
|
||||
void testResolveURI() {
|
||||
URI base = URI.create("http://example.org/foo");
|
||||
assertEquals("http://example.org/", base.resolve("/").toString());
|
||||
assertEquals("http://example.org/foo", base.toString());
|
||||
|
@ -27,7 +27,7 @@ class URLResolverTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testResolveURL() throws Exception {
|
||||
void testResolveURL() {
|
||||
URL base = URL.create("http://example.org/foo");
|
||||
assertEquals("http://example.org/", base.resolve("/").toString());
|
||||
assertEquals("http://example.org/foobar", base.resolve("/foobar").toString());
|
||||
|
@ -39,7 +39,7 @@ class URLResolverTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testMultiResolve() throws Exception {
|
||||
void testMultiResolve() {
|
||||
URL base = URL.create("http://example:8080");
|
||||
String pathSpec = "foobar/";
|
||||
String index = "index.html";
|
||||
|
|
|
@ -25,7 +25,7 @@ class URLTest {
|
|||
}
|
||||
if (test.failure) {
|
||||
try {
|
||||
URL url = URL.base(base).resolve(input);
|
||||
URL.base(base).resolve(input);
|
||||
fail();
|
||||
} catch (Exception e) {
|
||||
// pass
|
||||
|
|
|
@ -301,21 +301,21 @@ class PathMatcherTest {
|
|||
@Test
|
||||
void extractUriTemplateVariables() throws Exception {
|
||||
QueryParameters result = pathMatcher.extractUriTemplateVariables("/hotels/{hotel}", "/hotels/1");
|
||||
assertEquals("[hotel:1]", result.toString());
|
||||
assertEquals("[hotel=1]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/h?tels/{hotel}", "/hotels/1");
|
||||
assertEquals("[hotel:1]", result.toString());
|
||||
assertEquals("[hotel=1]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/hotels/{hotel}/bookings/{booking}", "/hotels/1/bookings/2");
|
||||
assertEquals("[hotel:1, booking:2]", result.toString());
|
||||
assertEquals("[hotel=1, booking=2]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/**/hotels/**/{hotel}", "/foo/hotels/bar/1");
|
||||
assertEquals("[hotel:1]", result.toString());
|
||||
assertEquals("[hotel=1]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/{page}.html", "/42.html");
|
||||
assertEquals("[page:42]", result.toString());
|
||||
assertEquals("[page=42]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/{page}.*", "/42.html");
|
||||
assertEquals("[page:42]", result.toString());
|
||||
assertEquals("[page=42]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/A-{B}-C", "/A-b-C");
|
||||
assertEquals("[B:b]", result.toString());
|
||||
assertEquals("[B=b]", result.toString());
|
||||
result = pathMatcher.extractUriTemplateVariables("/{name}.{extension}", "/test.html");
|
||||
assertEquals("[name:test, extension:html]", result.toString());
|
||||
assertEquals("[name=test, extension=html]", result.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in a new issue