From 9277ce2972403d36495b23532b722be2b7926859 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 16:56:05 -0700 Subject: [PATCH 01/31] fix: paging breaks with + sign on phone number --- src/main/java/com/twilio/http/Request.java | 8 ++++++++ src/test/java/com/twilio/http/RequestTest.java | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 400b0bbf2f..0c6e1e20f9 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -14,6 +14,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; +import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.*; @@ -136,6 +137,13 @@ public URL constructURL() { String stringUri = buildURL(); if (params.length() > 0) { + try { + System.out.println("Params pre-decode: " + params); + params = URLDecoder.decode(params, StandardCharsets.UTF_8.name()); + System.out.println("Params post-decode: " + params); + } catch (final UnsupportedEncodingException e) { + throw new ApiException("Could not decode param: " + params, e); + } stringUri += "?" + params; } diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index 139df989d4..72728d96ee 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -67,8 +67,9 @@ public void testConstructURLWithParams() throws MalformedURLException { Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); r.addQueryParam("baz", "quux"); r.addQueryParam("garply", "xyzzy"); + r.addQueryParam("To", "+18888888888"); URL url = r.constructURL(); - URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy"); + URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy?To=+18888888888"); assertUrlsEqual(expected, url); } From c4ace549d8f9924a0ffbccfd699ca87f2a0a08ab Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 16:58:31 -0700 Subject: [PATCH 02/31] remove logging --- src/main/java/com/twilio/http/Request.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 0c6e1e20f9..b5b5189661 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -138,9 +138,7 @@ public URL constructURL() { if (params.length() > 0) { try { - System.out.println("Params pre-decode: " + params); params = URLDecoder.decode(params, StandardCharsets.UTF_8.name()); - System.out.println("Params post-decode: " + params); } catch (final UnsupportedEncodingException e) { throw new ApiException("Could not decode param: " + params, e); } From cd465e722a8fb0914f576daa54336b70e35ba4cf Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 17:32:32 -0700 Subject: [PATCH 03/31] moved logic to correct function --- src/main/java/com/twilio/http/Request.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index b5b5189661..35e23a590d 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -137,11 +137,6 @@ public URL constructURL() { String stringUri = buildURL(); if (params.length() > 0) { - try { - params = URLDecoder.decode(params, StandardCharsets.UTF_8.name()); - } catch (final UnsupportedEncodingException e) { - throw new ApiException("Could not decode param: " + params, e); - } stringUri += "?" + params; } @@ -291,7 +286,12 @@ private static String encodeParameters(final Map> params) { continue; } - String encodedValue = URLEncoder.encode(value, "UTF-8"); + String encodedValue; + if (value.startsWith("+")) { + encodedValue = value; + } else { + encodedValue = URLEncoder.encode(value, "UTF-8"); + } parameters.add(encodedName + "=" + encodedValue); } } catch (final UnsupportedEncodingException e) { From d9e02fb47d2c90c6c2ea5ecdfcb94d16624c6ebd Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 17:33:39 -0700 Subject: [PATCH 04/31] decoder no longer needed --- src/main/java/com/twilio/http/Request.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 35e23a590d..408947890e 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -14,7 +14,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; -import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.*; From ef0ca3a3dd04657b63c367f645a88c960d58e5b4 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 18:02:37 -0700 Subject: [PATCH 05/31] fix test --- src/test/java/com/twilio/http/RequestTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index 72728d96ee..02322f0d3d 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -69,7 +69,7 @@ public void testConstructURLWithParams() throws MalformedURLException { r.addQueryParam("garply", "xyzzy"); r.addQueryParam("To", "+18888888888"); URL url = r.constructURL(); - URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy?To=+18888888888"); + URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy&To=+18888888888"); assertUrlsEqual(expected, url); } From 616f00bfdd1a810fc4e9ab18bcfc3ccb0e302947 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 18:43:24 -0700 Subject: [PATCH 06/31] fix test --- src/test/java/com/twilio/http/RequestTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index 02322f0d3d..b0037726f1 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -67,12 +67,20 @@ public void testConstructURLWithParams() throws MalformedURLException { Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); r.addQueryParam("baz", "quux"); r.addQueryParam("garply", "xyzzy"); - r.addQueryParam("To", "+18888888888"); URL url = r.constructURL(); - URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy&To=+18888888888"); + URL expected = new URL("https://api.twilio.com/2010-04-01/foobar?baz=quux&garply=xyzzy"); assertUrlsEqual(expected, url); } + @Test + public void testConstructURLWithPlusPrefix() { + Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); + r.addQueryParam("To", "+18888888888"); + URL url = r.constructURL(); + String expected = "https://api.twilio.com/2010-04-01/foobar?To=+18888888888"; + assertUrlsEqual(expected, url.toString()); + } + @Test public void testConstructURLWithMultivaluedParam() throws MalformedURLException { Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); From 0d000d44c11a75f33f8d556527819ef510daa777 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Wed, 26 Aug 2020 18:55:51 -0700 Subject: [PATCH 07/31] fix test --- src/test/java/com/twilio/http/RequestTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index b0037726f1..931fc2ea06 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -78,7 +78,7 @@ public void testConstructURLWithPlusPrefix() { r.addQueryParam("To", "+18888888888"); URL url = r.constructURL(); String expected = "https://api.twilio.com/2010-04-01/foobar?To=+18888888888"; - assertUrlsEqual(expected, url.toString()); + assertEquals(expected, url.toString()); } @Test From 0c772f7395bf046c23dfa952b9e805699a5ba3a5 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 27 Aug 2020 14:01:50 -0700 Subject: [PATCH 08/31] revert improper solution --- src/main/java/com/twilio/http/Request.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 408947890e..482312a7ae 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -175,6 +175,7 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } + return new URI(parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), parsedUrl.getPath(), parsedUrl.getQuery(), parsedUrl.getRef()).toURL().toString(); } catch (final MalformedURLException | URISyntaxException e) { @@ -285,13 +286,7 @@ private static String encodeParameters(final Map> params) { continue; } - String encodedValue; - if (value.startsWith("+")) { - encodedValue = value; - } else { - encodedValue = URLEncoder.encode(value, "UTF-8"); - } - parameters.add(encodedName + "=" + encodedValue); + String encodedValue = URLEncoder.encode(value, "UTF-8"); } } catch (final UnsupportedEncodingException e) { throw new InvalidRequestException("Couldn't encode params", entry.getKey(), e); From 4d4efb4623a7ecc61d5663238e9a219ddd339700 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 27 Aug 2020 14:51:51 -0700 Subject: [PATCH 09/31] do not re-encode --- src/main/java/com/twilio/http/Request.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 482312a7ae..73b955a495 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -14,6 +14,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; +import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.*; @@ -286,7 +287,9 @@ private static String encodeParameters(final Map> params) { continue; } - String encodedValue = URLEncoder.encode(value, "UTF-8"); + String decodedValue = URLDecoder.decode(value, "UTF-8"); + String encodedValue = URLEncoder.encode(decodedValue, "UTF-8"); + parameters.add(encodedName + "=" + encodedValue); } } catch (final UnsupportedEncodingException e) { throw new InvalidRequestException("Couldn't encode params", entry.getKey(), e); From bb6221e2788bfe45c4936acd54f0760414b16a0b Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 11:45:10 -0700 Subject: [PATCH 10/31] revert URL builder --- src/main/java/com/twilio/http/Request.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 73b955a495..73b2a80119 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -175,11 +175,8 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } - - - return new URI(parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), - parsedUrl.getPath(), parsedUrl.getQuery(), parsedUrl.getRef()).toURL().toString(); - } catch (final MalformedURLException | URISyntaxException e) { + return new URL(parsedUrl.getProtocol(), host, parsedUrl.getPort(), parsedUrl.getFile()).toString(); + } catch (final MalformedURLException e) { throw new ApiException("Bad URL: " + url, e); } } @@ -286,9 +283,7 @@ private static String encodeParameters(final Map> params) { if (value == null) { continue; } - - String decodedValue = URLDecoder.decode(value, "UTF-8"); - String encodedValue = URLEncoder.encode(decodedValue, "UTF-8"); + String encodedValue = URLEncoder.encode(value, "UTF-8"); parameters.add(encodedName + "=" + encodedValue); } } catch (final UnsupportedEncodingException e) { From 7ed30ad45b68e2469f1ad3979fabc5fab778f6e6 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 11:55:20 -0700 Subject: [PATCH 11/31] update test --- src/test/java/com/twilio/http/RequestTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index 931fc2ea06..e019a40e7a 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -77,7 +77,7 @@ public void testConstructURLWithPlusPrefix() { Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); r.addQueryParam("To", "+18888888888"); URL url = r.constructURL(); - String expected = "https://api.twilio.com/2010-04-01/foobar?To=+18888888888"; + String expected = "https://api.twilio.com/2010-04-01/foobar?To=%2B18888888888"; assertEquals(expected, url.toString()); } From f05dc8085f9e3bb7a077c93ea7decbd73cccb78e Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 14:50:07 -0700 Subject: [PATCH 12/31] avoid double encoding --- src/main/java/com/twilio/http/Request.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 73b2a80119..b431d97f55 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -152,6 +152,7 @@ public URL constructURL() { private String buildURL() { try { + //String decodedURL = URLDecoder.decode(url, "UTF-8"); final URL parsedUrl = new URL(url); String host = parsedUrl.getHost(); final String[] pieces = host.split("\\."); @@ -175,8 +176,15 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } - return new URL(parsedUrl.getProtocol(), host, parsedUrl.getPort(), parsedUrl.getFile()).toString(); - } catch (final MalformedURLException e) { + String getQuery = ""; + if( parsedUrl.getQuery() != null ) { + getQuery = "?" + parsedUrl.getQuery(); + } + String constructedURI = new URI( + parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), + parsedUrl.getPath(), null, parsedUrl.getRef()).toString() + getQuery; + return new URI(constructedURI).toString(); + } catch (final MalformedURLException | URISyntaxException e) { throw new ApiException("Bad URL: " + url, e); } } From b2737afd0198107e55f1f716f2178858cfa1a0ab Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 14:53:16 -0700 Subject: [PATCH 13/31] clean up --- src/main/java/com/twilio/http/Request.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index b431d97f55..94018d7904 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -14,7 +14,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; -import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.*; @@ -152,7 +151,6 @@ public URL constructURL() { private String buildURL() { try { - //String decodedURL = URLDecoder.decode(url, "UTF-8"); final URL parsedUrl = new URL(url); String host = parsedUrl.getHost(); final String[] pieces = host.split("\\."); From ca5d7c31772d4361cf10d807d9ada17afc88c259 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 15:09:28 -0700 Subject: [PATCH 14/31] add fragment --- src/main/java/com/twilio/http/Request.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 94018d7904..89415a6524 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -178,9 +178,15 @@ private String buildURL() { if( parsedUrl.getQuery() != null ) { getQuery = "?" + parsedUrl.getQuery(); } + String getFragment = ""; + if( parsedUrl.getRef() != null ) { + getFragment = "#" + parsedUrl.getRef(); + } + System.out.println("getQuery: " + getQuery + getFragment); String constructedURI = new URI( parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), - parsedUrl.getPath(), null, parsedUrl.getRef()).toString() + getQuery; + parsedUrl.getPath(), null,null).toString() + getQuery + getFragment; + System.out.println("constructedURI: " + constructedURI); return new URI(constructedURI).toString(); } catch (final MalformedURLException | URISyntaxException e) { throw new ApiException("Bad URL: " + url, e); From 5dfaebdebb31122ac77c3ecb90cb63dd34ae7e61 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Fri, 28 Aug 2020 15:17:48 -0700 Subject: [PATCH 15/31] remove logging --- src/main/java/com/twilio/http/Request.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 89415a6524..665c84adce 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -182,11 +182,9 @@ private String buildURL() { if( parsedUrl.getRef() != null ) { getFragment = "#" + parsedUrl.getRef(); } - System.out.println("getQuery: " + getQuery + getFragment); String constructedURI = new URI( parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), parsedUrl.getPath(), null,null).toString() + getQuery + getFragment; - System.out.println("constructedURI: " + constructedURI); return new URI(constructedURI).toString(); } catch (final MalformedURLException | URISyntaxException e) { throw new ApiException("Bad URL: " + url, e); From 4511139ed393b429815dd8ee2da6e66e62b6dcff Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 1 Sep 2020 11:38:09 -0700 Subject: [PATCH 16/31] build the URL --- src/main/java/com/twilio/http/Request.java | 28 +++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 665c84adce..3fbd926a24 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -174,19 +174,25 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } - String getQuery = ""; - if( parsedUrl.getQuery() != null ) { - getQuery = "?" + parsedUrl.getQuery(); + + int port = -1; + String urlPort = null; + if (parsedUrl.getPort() != -1) { + port = parsedUrl.getPort(); + urlPort = ":" + port; + } + String protocol = parsedUrl.getProtocol() + "://"; + String path = parsedUrl.getPath().replace("|", "%7C"); + String query = null; + if (parsedUrl.getQuery() != null ) { + query = "?" + parsedUrl.getQuery(); } - String getFragment = ""; - if( parsedUrl.getRef() != null ) { - getFragment = "#" + parsedUrl.getRef(); + String ref = null; + if (parsedUrl.getRef() != null) { + ref = "#" + parsedUrl.getRef(); } - String constructedURI = new URI( - parsedUrl.getProtocol(), parsedUrl.getUserInfo(), host, parsedUrl.getPort(), - parsedUrl.getPath(), null,null).toString() + getQuery + getFragment; - return new URI(constructedURI).toString(); - } catch (final MalformedURLException | URISyntaxException e) { + return joinIgnoreNull("", protocol, host, urlPort, path, query, ref); + } catch (final MalformedURLException e) { throw new ApiException("Bad URL: " + url, e); } } From 6d0e87c5a7d137b16e96d4126d2dcb7fbab32458 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 1 Sep 2020 11:40:31 -0700 Subject: [PATCH 17/31] formatting --- src/main/java/com/twilio/http/Request.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 3fbd926a24..ba162a1749 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -184,7 +184,7 @@ private String buildURL() { String protocol = parsedUrl.getProtocol() + "://"; String path = parsedUrl.getPath().replace("|", "%7C"); String query = null; - if (parsedUrl.getQuery() != null ) { + if (parsedUrl.getQuery() != null) { query = "?" + parsedUrl.getQuery(); } String ref = null; From ccc351781bb274bb0d832b1591cf12e651e52e17 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:11:00 -0700 Subject: [PATCH 18/31] add credentails, user proper encoder --- pom.xml | 2 +- src/main/java/com/twilio/http/Request.java | 15 ++++++++++----- src/test/java/com/twilio/http/RequestTest.java | 8 ++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 8f0f40f162..1108c033d6 100644 --- a/pom.xml +++ b/pom.xml @@ -372,4 +372,4 @@ oss-parent 7 - \ No newline at end of file + diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index ba162a1749..1ff02c84f5 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -175,13 +175,14 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } - int port = -1; String urlPort = null; if (parsedUrl.getPort() != -1) { - port = parsedUrl.getPort(); - urlPort = ":" + port; + urlPort = ":" + parsedUrl.getPort(); } String protocol = parsedUrl.getProtocol() + "://"; + String[] pathPieces = parsedUrl.getPath().split("/", 0); + pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); + String encodedPath = String.join("/", pathPieces); String path = parsedUrl.getPath().replace("|", "%7C"); String query = null; if (parsedUrl.getQuery() != null) { @@ -191,8 +192,12 @@ private String buildURL() { if (parsedUrl.getRef() != null) { ref = "#" + parsedUrl.getRef(); } - return joinIgnoreNull("", protocol, host, urlPort, path, query, ref); - } catch (final MalformedURLException e) { + String credentials = null; + if (parsedUrl.getUserInfo() != null) { + credentials = parsedUrl.getUserInfo() + "@"; + } + return joinIgnoreNull("", protocol, credentials ,host, urlPort, path, query, ref); + } catch (final MalformedURLException | UnsupportedEncodingException e) { throw new ApiException("Bad URL: " + url, e); } } diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index e019a40e7a..826ba52a1f 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -53,6 +53,14 @@ public void testConstructURLWithPipe() throws MalformedURLException { assertUrlsEqual(expected, url); } + @Test + public void testConstructURLWithCredentials() throws MalformedURLException { + Request r = new Request(HttpMethod.GET, "user:pass@" + Domains.API.toString(), "/2010-04-01/foobar"); + URL url = r.constructURL(); + URL expected = new URL("https://user:pass@api.twilio.com/2010-04-01/foobar"); + assertUrlsEqual(expected, url); + } + @Test public void testConstructURLWithParam() throws MalformedURLException { Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foobar"); From 1da78503519aa5427ee2efa07820ec8ff09b7f24 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:12:40 -0700 Subject: [PATCH 19/31] formatting --- src/main/java/com/twilio/http/Request.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 1ff02c84f5..ac96b4ab30 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -196,7 +196,7 @@ private String buildURL() { if (parsedUrl.getUserInfo() != null) { credentials = parsedUrl.getUserInfo() + "@"; } - return joinIgnoreNull("", protocol, credentials ,host, urlPort, path, query, ref); + return joinIgnoreNull("", protocol, credentials, host, urlPort, path, query, ref); } catch (final MalformedURLException | UnsupportedEncodingException e) { throw new ApiException("Bad URL: " + url, e); } From 36e94674b13366ed4272599b555e42c216ece26e Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:17:48 -0700 Subject: [PATCH 20/31] formatting --- src/main/java/com/twilio/http/Request.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index ac96b4ab30..6c7f2145df 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -287,7 +287,7 @@ public String encodeFormBody() { /** * Encode the query parameters. - * + * String encodeParameters( * @return url encoded query parameters */ public String encodeQueryParams() { @@ -304,6 +304,7 @@ private static String encodeParameters(final Map> params) { if (value == null) { continue; } + String encodedValue = URLEncoder.encode(value, "UTF-8"); parameters.add(encodedName + "=" + encodedValue); } From 14e2a314df79e3d1388e3bde760f8201f6a146ba Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:19:16 -0700 Subject: [PATCH 21/31] formatting --- src/main/java/com/twilio/http/Request.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 6c7f2145df..5965bc62e4 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -287,7 +287,7 @@ public String encodeFormBody() { /** * Encode the query parameters. - * String encodeParameters( + * * @return url encoded query parameters */ public String encodeQueryParams() { From 7a774590e3b09fdf8eb2d2b63ffa097bb91e2e6b Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:19:51 -0700 Subject: [PATCH 22/31] Update pom.xml From 92c7ee6034716bf3651fac24ce37391fe17f0f8c Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:39:35 -0700 Subject: [PATCH 23/31] revert to java 7 friendly joiner --- pom.xml | 5 +++++ src/main/java/com/twilio/http/Request.java | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 1108c033d6..f834e53025 100644 --- a/pom.xml +++ b/pom.xml @@ -228,6 +228,11 @@ 3.4.1 test + + org.apache.commons + commons-lang3 + 3.9 + diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 5965bc62e4..babfcc80df 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -6,6 +6,7 @@ import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; +import org.apache.commons.lang.StringUtils; import javax.xml.bind.DatatypeConverter; import java.io.UnsupportedEncodingException; @@ -182,8 +183,8 @@ private String buildURL() { String protocol = parsedUrl.getProtocol() + "://"; String[] pathPieces = parsedUrl.getPath().split("/", 0); pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); - String encodedPath = String.join("/", pathPieces); - String path = parsedUrl.getPath().replace("|", "%7C"); + // TODO: We can use String.join and drop the apache.commons dependency when we upgrade to Java 8 + String encodedPath = StringUtils.join(pathPieces, "/"); String query = null; if (parsedUrl.getQuery() != null) { query = "?" + parsedUrl.getQuery(); @@ -196,7 +197,7 @@ private String buildURL() { if (parsedUrl.getUserInfo() != null) { credentials = parsedUrl.getUserInfo() + "@"; } - return joinIgnoreNull("", protocol, credentials, host, urlPort, path, query, ref); + return joinIgnoreNull("", protocol, credentials, host, urlPort, encodedPath, query, ref); } catch (final MalformedURLException | UnsupportedEncodingException e) { throw new ApiException("Bad URL: " + url, e); } From d080a42ef502f9ba40a5c0ef6281beb7e4c443e7 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 8 Sep 2020 16:43:46 -0700 Subject: [PATCH 24/31] fix apache dependency --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index f834e53025..a450e8df72 100644 --- a/pom.xml +++ b/pom.xml @@ -229,9 +229,9 @@ test - org.apache.commons - commons-lang3 - 3.9 + commons-lang + commons-lang + 2.4 From 85283077c8cf9ca0ce45afad981ec62ede2163a7 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Mon, 14 Sep 2020 21:52:02 -0700 Subject: [PATCH 25/31] revert to guava joiner --- pom.xml | 5 ----- src/main/java/com/twilio/http/Request.java | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index a450e8df72..1108c033d6 100644 --- a/pom.xml +++ b/pom.xml @@ -228,11 +228,6 @@ 3.4.1 test - - commons-lang - commons-lang - 2.4 - diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index babfcc80df..95b1e1c58d 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -1,6 +1,7 @@ package com.twilio.http; import com.google.common.collect.Range; +import com.google.common.base.Joiner; import com.twilio.exception.ApiException; import com.twilio.exception.InvalidRequestException; import org.joda.time.DateTime; @@ -183,8 +184,7 @@ private String buildURL() { String protocol = parsedUrl.getProtocol() + "://"; String[] pathPieces = parsedUrl.getPath().split("/", 0); pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); - // TODO: We can use String.join and drop the apache.commons dependency when we upgrade to Java 8 - String encodedPath = StringUtils.join(pathPieces, "/"); + String encodedPath = Joiner.on("/").join(pathPieces); String query = null; if (parsedUrl.getQuery() != null) { query = "?" + parsedUrl.getQuery(); From b0bc241f52c7be29f0d5e43d35b9ffff87180938 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Mon, 14 Sep 2020 21:52:41 -0700 Subject: [PATCH 26/31] revert to guava joiner --- src/main/java/com/twilio/http/Request.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 95b1e1c58d..4cc65c9a08 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -7,7 +7,6 @@ import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; -import org.apache.commons.lang.StringUtils; import javax.xml.bind.DatatypeConverter; import java.io.UnsupportedEncodingException; From 380c84cf831a92765ab1182162dd0ce72b74f926 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Tue, 15 Sep 2020 22:28:32 -0700 Subject: [PATCH 27/31] simplifications --- src/main/java/com/twilio/http/Request.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 4cc65c9a08..2b206bca81 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -184,18 +184,9 @@ private String buildURL() { String[] pathPieces = parsedUrl.getPath().split("/", 0); pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); String encodedPath = Joiner.on("/").join(pathPieces); - String query = null; - if (parsedUrl.getQuery() != null) { - query = "?" + parsedUrl.getQuery(); - } - String ref = null; - if (parsedUrl.getRef() != null) { - ref = "#" + parsedUrl.getRef(); - } - String credentials = null; - if (parsedUrl.getUserInfo() != null) { - credentials = parsedUrl.getUserInfo() + "@"; - } + String query = parsedUrl.getQuery() != null ? "?" + parsedUrl.getQuery() : null; + String ref = parsedUrl.getRef() != null ? "#" + parsedUrl.getRef() : null; + String credentials = parsedUrl.getUserInfo() != null ? parsedUrl.getUserInfo() + "@" : null; return joinIgnoreNull("", protocol, credentials, host, urlPort, encodedPath, query, ref); } catch (final MalformedURLException | UnsupportedEncodingException e) { throw new ApiException("Bad URL: " + url, e); From 70770a86f5b8d6b51f68562c2e551004298031f4 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 17 Sep 2020 08:11:41 -0700 Subject: [PATCH 28/31] add comment, formatting --- src/main/java/com/twilio/http/Request.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 2b206bca81..112a3ca11d 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -182,11 +182,12 @@ private String buildURL() { } String protocol = parsedUrl.getProtocol() + "://"; String[] pathPieces = parsedUrl.getPath().split("/", 0); + // Encode only the file path of the URL pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); String encodedPath = Joiner.on("/").join(pathPieces); String query = parsedUrl.getQuery() != null ? "?" + parsedUrl.getQuery() : null; String ref = parsedUrl.getRef() != null ? "#" + parsedUrl.getRef() : null; - String credentials = parsedUrl.getUserInfo() != null ? parsedUrl.getUserInfo() + "@" : null; + String credentials = parsedUrl.getUserInfo() != null ? parsedUrl.getUserInfo() + "@" : null; return joinIgnoreNull("", protocol, credentials, host, urlPort, encodedPath, query, ref); } catch (final MalformedURLException | UnsupportedEncodingException e) { throw new ApiException("Bad URL: " + url, e); From 1b033626650c686922f3912f1f2fdd14563b1560 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 17 Sep 2020 12:36:34 -0700 Subject: [PATCH 29/31] remove uncessary param --- src/main/java/com/twilio/http/Request.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 112a3ca11d..02f0c9867a 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -181,7 +181,7 @@ private String buildURL() { urlPort = ":" + parsedUrl.getPort(); } String protocol = parsedUrl.getProtocol() + "://"; - String[] pathPieces = parsedUrl.getPath().split("/", 0); + String[] pathPieces = parsedUrl.getPath().split("/"); // Encode only the file path of the URL pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); String encodedPath = Joiner.on("/").join(pathPieces); From 908953b80ecdc7030fa7995229b21abc331b1d73 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 17 Sep 2020 12:47:07 -0700 Subject: [PATCH 30/31] encode all pieces of the path --- src/main/java/com/twilio/http/Request.java | 5 +++-- src/test/java/com/twilio/http/RequestTest.java | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 02f0c9867a..86d5c6fc83 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -182,8 +182,9 @@ private String buildURL() { } String protocol = parsedUrl.getProtocol() + "://"; String[] pathPieces = parsedUrl.getPath().split("/"); - // Encode only the file path of the URL - pathPieces[pathPieces.length-1] = URLEncoder.encode(pathPieces[pathPieces.length-1], "UTF-8"); + for (int i = 0; i < pathPieces.length; i++) { + pathPieces[i] = URLEncoder.encode(pathPieces[i], "UTF-8"); + } String encodedPath = Joiner.on("/").join(pathPieces); String query = parsedUrl.getQuery() != null ? "?" + parsedUrl.getQuery() : null; String ref = parsedUrl.getRef() != null ? "#" + parsedUrl.getRef() : null; diff --git a/src/test/java/com/twilio/http/RequestTest.java b/src/test/java/com/twilio/http/RequestTest.java index 826ba52a1f..60ddaba828 100644 --- a/src/test/java/com/twilio/http/RequestTest.java +++ b/src/test/java/com/twilio/http/RequestTest.java @@ -53,6 +53,14 @@ public void testConstructURLWithPipe() throws MalformedURLException { assertUrlsEqual(expected, url); } + @Test + public void testConstructURLWithMultipleSlashes() throws MalformedURLException { + Request r = new Request(HttpMethod.GET, Domains.API.toString(), "/2010-04-01/foo|bar/bar|foo"); + URL url = r.constructURL(); + URL expected = new URL("https://api.twilio.com/2010-04-01/foo%7Cbar/bar%7Cfoo"); + assertUrlsEqual(expected, url); + } + @Test public void testConstructURLWithCredentials() throws MalformedURLException { Request r = new Request(HttpMethod.GET, "user:pass@" + Domains.API.toString(), "/2010-04-01/foobar"); From 958a5588c12827e2d892cace357d7563d9e2bfc2 Mon Sep 17 00:00:00 2001 From: Elmer Thomas Date: Thu, 17 Sep 2020 14:03:04 -0700 Subject: [PATCH 31/31] simplification --- src/main/java/com/twilio/http/Request.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/twilio/http/Request.java b/src/main/java/com/twilio/http/Request.java index 86d5c6fc83..fdab6b9ad1 100644 --- a/src/main/java/com/twilio/http/Request.java +++ b/src/main/java/com/twilio/http/Request.java @@ -176,10 +176,7 @@ private String buildURL() { host = joinIgnoreNull(".", product, targetEdge, targetRegion, domain); } - String urlPort = null; - if (parsedUrl.getPort() != -1) { - urlPort = ":" + parsedUrl.getPort(); - } + String urlPort = parsedUrl.getPort() != -1 ? ":" + parsedUrl.getPort() : null; String protocol = parsedUrl.getProtocol() + "://"; String[] pathPieces = parsedUrl.getPath().split("/"); for (int i = 0; i < pathPieces.length; i++) {