From f54abf09da257ce440aa4e5b4ffde5124ac1ee68 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Sun, 27 Dec 2015 23:27:00 -0500 Subject: [PATCH] Add newBuilder overload for resolving directly to a builder. --- .../src/test/java/okhttp3/HttpUrlTest.java | 16 +++++++++++++++ okhttp/src/main/java/okhttp3/HttpUrl.java | 20 +++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/okhttp-tests/src/test/java/okhttp3/HttpUrlTest.java b/okhttp-tests/src/test/java/okhttp3/HttpUrlTest.java index 2cb7f8b92..a67dc380d 100644 --- a/okhttp-tests/src/test/java/okhttp3/HttpUrlTest.java +++ b/okhttp-tests/src/test/java/okhttp3/HttpUrlTest.java @@ -108,6 +108,22 @@ public final class HttpUrlTest { assertEquals(null, HttpUrl.parse("#fragment")); } + @Test public void newBuilderResolve() throws Exception { + // Non-exhaustive tests because implementation is the same as resolve. + HttpUrl base = HttpUrl.parse("http://host/a/b"); + assertEquals(HttpUrl.parse("https://host2/"), base.newBuilder("https://host2").build()); + assertEquals(HttpUrl.parse("http://host2/"), base.newBuilder("//host2").build()); + assertEquals(HttpUrl.parse("http://host/path"), base.newBuilder("/path").build()); + assertEquals(HttpUrl.parse("http://host/a/path"), base.newBuilder("path").build()); + assertEquals(HttpUrl.parse("http://host/a/b?query"), base.newBuilder("?query").build()); + assertEquals(HttpUrl.parse("http://host/a/b#fragment"), base.newBuilder("#fragment").build()); + assertEquals(HttpUrl.parse("http://host/a/b"), base.newBuilder("").build()); + assertEquals(null, base.newBuilder("ftp://b")); + assertEquals(null, base.newBuilder("ht+tp://b")); + assertEquals(null, base.newBuilder("ht-tp://b")); + assertEquals(null, base.newBuilder("ht.tp://b")); + } + @Test public void resolveNoScheme() throws Exception { HttpUrl base = HttpUrl.parse("http://host/a/b"); assertEquals(HttpUrl.parse("http://host2/"), base.resolve("//host2")); diff --git a/okhttp/src/main/java/okhttp3/HttpUrl.java b/okhttp/src/main/java/okhttp3/HttpUrl.java index 7259a9f01..1a5485218 100644 --- a/okhttp/src/main/java/okhttp3/HttpUrl.java +++ b/okhttp/src/main/java/okhttp3/HttpUrl.java @@ -597,11 +597,13 @@ public final class HttpUrl { return fragment; } - /** Returns the URL that would be retrieved by following {@code link} from this URL. */ + /** + * Returns the URL that would be retrieved by following {@code link} from this URL, or null if + * the resulting URL is not well-formed. + */ public HttpUrl resolve(String link) { - Builder builder = new Builder(); - Builder.ParseResult result = builder.parse(this, link); - return result == Builder.ParseResult.SUCCESS ? builder.build() : null; + Builder builder = newBuilder(link); + return builder != null ? builder.build() : null; } public Builder newBuilder() { @@ -619,6 +621,16 @@ public final class HttpUrl { return result; } + /** + * Returns a builder for the URL that would be retrieved by following {@code link} from this URL, + * or null if the resulting URL is not well-formed. + */ + public Builder newBuilder(String link) { + Builder builder = new Builder(); + Builder.ParseResult result = builder.parse(this, link); + return result == Builder.ParseResult.SUCCESS ? builder : null; + } + /** * Returns a new {@code HttpUrl} representing {@code url} if it is a well-formed HTTP or HTTPS * URL, or null if it isn't.