Skip to content

Commit

Permalink
Ensure all brackes are decoded in JSON based Body Templates
Browse files Browse the repository at this point in the history
Fixes OpenFeign#1129

When JSON is detected in a Body Template, all start and end tokens
that may have been pct-encoded are decoded, ensuring that the
expanded result is valid JSON.
  • Loading branch information
kdavisk6 committed Dec 26, 2019
1 parent 9e23599 commit 3e99e23
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
11 changes: 3 additions & 8 deletions core/src/main/java/feign/template/BodyTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,9 @@ private BodyTemplate(String value, Charset charset) {
public String expand(Map<String, ?> variables) {
String expanded = super.expand(variables);
if (this.json) {
/* decode only the first and last character */
StringBuilder sb = new StringBuilder();
sb.append(JSON_TOKEN_START);
sb.append(expanded,
expanded.indexOf(JSON_TOKEN_START_ENCODED) + JSON_TOKEN_START_ENCODED.length(),
expanded.lastIndexOf(JSON_TOKEN_END_ENCODED));
sb.append(JSON_TOKEN_END);
return sb.toString();
/* restore all start and end tokens */
expanded = expanded.replaceAll(JSON_TOKEN_START_ENCODED, JSON_TOKEN_START);
expanded = expanded.replaceAll(JSON_TOKEN_END_ENCODED, JSON_TOKEN_END);
}
return expanded;
}
Expand Down
19 changes: 19 additions & 0 deletions core/src/test/java/feign/template/BodyTemplateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package feign.template;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Collections;
import org.junit.Test;

public class BodyTemplateTest {

@Test
public void bodyTemplatesSupportJsonOnlyWhenEncoded() {
String bodyTemplate = "%7B\"resize\": %7B\"method\": \"fit\",\"width\": {size},\"height\": {size}%7D%7D";
BodyTemplate template = BodyTemplate.create(bodyTemplate);
String expanded = template.expand(Collections.singletonMap("size", "100"));
assertThat(expanded)
.isEqualToIgnoringCase(
"{\"resize\": {\"method\": \"fit\",\"width\": 100,\"height\": 100}}");
}
}

0 comments on commit 3e99e23

Please sign in to comment.