diff --git a/google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java b/google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java index e5c4a40cb..8cedf7e45 100644 --- a/google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java +++ b/google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java @@ -186,7 +186,7 @@ String getEncodedValue(String value) { String encodedValue; if (reservedExpansion) { // Reserved expansion allows pct-encoded triplets and characters in the reserved set. - encodedValue = CharEscapers.escapeUriPath(value); + encodedValue = CharEscapers.escapeUriPathWithoutReserved(value); } else { encodedValue = CharEscapers.escapeUri(value); } @@ -339,26 +339,14 @@ public static String expand(String pathUri, Object parameters, value = getListPropertyValue(varName, iterator, containsExplodeModifier, compositeOutput); } else if (value.getClass().isEnum()) { String name = FieldInfo.of((Enum) value).getName(); - if (name != null) { - if (compositeOutput.requiresVarAssignment()) { - value = String.format("%s=%s", varName, value); - } - value = CharEscapers.escapeUriPath(value.toString()); - } + value = getSimpleValue(varName, name != null ? name : value.toString(), compositeOutput); } else if (!Data.isValueOfPrimitiveType(value)) { // Parse the value as a key/value map. Map map = getMap(value); value = getMapPropertyValue(varName, map, containsExplodeModifier, compositeOutput); } else { // For everything else... - if (compositeOutput.requiresVarAssignment()) { - value = String.format("%s=%s", varName, value); - } - if (compositeOutput.getReservedExpansion()) { - value = CharEscapers.escapeUriPathWithoutReserved(value.toString()); - } else { - value = CharEscapers.escapeUriPath(value.toString()); - } + value = getSimpleValue(varName, value.toString(), compositeOutput); } pathBuf.append(value); } @@ -370,6 +358,13 @@ public static String expand(String pathUri, Object parameters, return pathBuf.toString(); } + private static String getSimpleValue(String name, String value, CompositeOutput compositeOutput) { + if (compositeOutput.requiresVarAssignment()) { + return String.format("%s=%s", name, compositeOutput.getEncodedValue(value.toString())); + } + return compositeOutput.getEncodedValue(value); + } + /** * Expand the template of a composite list property. * Eg: If d := ["red", "green", "blue"] diff --git a/google-http-client/src/test/java/com/google/api/client/http/UriTemplateTest.java b/google-http-client/src/test/java/com/google/api/client/http/UriTemplateTest.java index 2dfcc1f3d..fea7d8cbe 100644 --- a/google-http-client/src/test/java/com/google/api/client/http/UriTemplateTest.java +++ b/google-http-client/src/test/java/com/google/api/client/http/UriTemplateTest.java @@ -57,6 +57,13 @@ public void testExpandTemplates_basic() { assertTrue(requestMap.containsKey("unused")); } + public void testExpanTemplates_basicEncodeValue() { + SortedMap requestMap = Maps.newTreeMap(); + requestMap.put("abc", "xyz;def"); + assertEquals(";abc=xyz%3Bdef", UriTemplate.expand("{;abc}", requestMap, false)); + assertEquals("xyz;def", UriTemplate.expand("{+abc}", requestMap, false)); + } + public void testExpandTemplates_noExpansionsWithQueryParams() { SortedMap requestMap = Maps.newTreeMap(); requestMap.put("abc", "xyz");