Skip to content

Commit d16ab5c

Browse files
ajaaymchingor13
authored andcommitted
Fix UriTemplate.expand to properly escape value (#534)
* Fix #351 UriTemplate.expand does not properly escape characters for path-style parameter expansion * remove unused import
1 parent ff93479 commit d16ab5c

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

google-http-client/src/main/java/com/google/api/client/http/UriTemplate.java

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ String getEncodedValue(String value) {
186186
String encodedValue;
187187
if (reservedExpansion) {
188188
// Reserved expansion allows pct-encoded triplets and characters in the reserved set.
189-
encodedValue = CharEscapers.escapeUriPath(value);
189+
encodedValue = CharEscapers.escapeUriPathWithoutReserved(value);
190190
} else {
191191
encodedValue = CharEscapers.escapeUri(value);
192192
}
@@ -339,26 +339,14 @@ public static String expand(String pathUri, Object parameters,
339339
value = getListPropertyValue(varName, iterator, containsExplodeModifier, compositeOutput);
340340
} else if (value.getClass().isEnum()) {
341341
String name = FieldInfo.of((Enum<?>) value).getName();
342-
if (name != null) {
343-
if (compositeOutput.requiresVarAssignment()) {
344-
value = String.format("%s=%s", varName, value);
345-
}
346-
value = CharEscapers.escapeUriPath(value.toString());
347-
}
342+
value = getSimpleValue(varName, name != null ? name : value.toString(), compositeOutput);
348343
} else if (!Data.isValueOfPrimitiveType(value)) {
349344
// Parse the value as a key/value map.
350345
Map<String, Object> map = getMap(value);
351346
value = getMapPropertyValue(varName, map, containsExplodeModifier, compositeOutput);
352347
} else {
353348
// For everything else...
354-
if (compositeOutput.requiresVarAssignment()) {
355-
value = String.format("%s=%s", varName, value);
356-
}
357-
if (compositeOutput.getReservedExpansion()) {
358-
value = CharEscapers.escapeUriPathWithoutReserved(value.toString());
359-
} else {
360-
value = CharEscapers.escapeUriPath(value.toString());
361-
}
349+
value = getSimpleValue(varName, value.toString(), compositeOutput);
362350
}
363351
pathBuf.append(value);
364352
}
@@ -370,6 +358,13 @@ public static String expand(String pathUri, Object parameters,
370358
return pathBuf.toString();
371359
}
372360

361+
private static String getSimpleValue(String name, String value, CompositeOutput compositeOutput) {
362+
if (compositeOutput.requiresVarAssignment()) {
363+
return String.format("%s=%s", name, compositeOutput.getEncodedValue(value.toString()));
364+
}
365+
return compositeOutput.getEncodedValue(value);
366+
}
367+
373368
/**
374369
* Expand the template of a composite list property.
375370
* Eg: If d := ["red", "green", "blue"]

google-http-client/src/test/java/com/google/api/client/http/UriTemplateTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public void testExpandTemplates_basic() {
5757
assertTrue(requestMap.containsKey("unused"));
5858
}
5959

60+
public void testExpanTemplates_basicEncodeValue() {
61+
SortedMap<String, Object> requestMap = Maps.newTreeMap();
62+
requestMap.put("abc", "xyz;def");
63+
assertEquals(";abc=xyz%3Bdef", UriTemplate.expand("{;abc}", requestMap, false));
64+
assertEquals("xyz;def", UriTemplate.expand("{+abc}", requestMap, false));
65+
}
66+
6067
public void testExpandTemplates_noExpansionsWithQueryParams() {
6168
SortedMap<String, Object> requestMap = Maps.newTreeMap();
6269
requestMap.put("abc", "xyz");

0 commit comments

Comments
 (0)