[java][resttemplate] using uriBuilderFactory to encode all template values (#11922)

* issue 11921 - encode all template values

* add test for url and query param encoding
This commit is contained in:
Oren Samuel
2022-03-21 17:42:56 +02:00
committed by GitHub
parent ba76ec9551
commit 5e32f0c366
5 changed files with 57 additions and 21 deletions
@@ -637,8 +637,7 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
queryBuilder.append(encodedName);
if (value != null) {
String templatizedKey = encodedName + valueItemCounter++;
final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8");
uriParams.put(templatizedKey, encodedValue);
uriParams.put(templatizedKey, value.toString());
queryBuilder.append('=').append("{").append(templatizedKey).append("}");
}
}
@@ -785,7 +784,7 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
// disable default URL encoding
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
restTemplate.setUriTemplateHandler(uriBuilderFactory);
return restTemplate;
}
@@ -597,8 +597,7 @@ public class ApiClient extends JavaTimeFormatter {
queryBuilder.append(encodedName);
if (value != null) {
String templatizedKey = encodedName + valueItemCounter++;
final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8");
uriParams.put(templatizedKey, encodedValue);
uriParams.put(templatizedKey, value.toString());
queryBuilder.append('=').append("{").append(templatizedKey).append("}");
}
}
@@ -743,7 +742,7 @@ public class ApiClient extends JavaTimeFormatter {
// disable default URL encoding
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
restTemplate.setUriTemplateHandler(uriBuilderFactory);
return restTemplate;
}
@@ -28,4 +28,23 @@ public class ApiClientTest {
assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams));
}
}
@Test
public void testPathParamEncoding() {
Map<String,Object> uriParams = new HashMap<>();
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<String, String>();
uriParams.put("username", "user_name,comma&amp space");
assertEquals("user/user_name%2Ccomma%26amp%20space", apiClient.expandPath("user/{username}", uriParams));
}
@Test
public void testPathAndQueryParamEncoding() {
Map<String, Object> uriParams = new HashMap<>();
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<String, String>();
queryParams.add("key", "val,comma?q-mark&amp");
uriParams.put("username", "user_name,comma&amp space");
String template = "user/{username}?" + apiClient.generateQueryUri(queryParams, uriParams);
assertEquals("user/user_name%2Ccomma%26amp%20space?key=val%2Ccomma%3Fq-mark%26amp",
apiClient.expandPath(template, uriParams));
}
}
@@ -592,8 +592,7 @@ public class ApiClient extends JavaTimeFormatter {
queryBuilder.append(encodedName);
if (value != null) {
String templatizedKey = encodedName + valueItemCounter++;
final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8");
uriParams.put(templatizedKey, encodedValue);
uriParams.put(templatizedKey, value.toString());
queryBuilder.append('=').append("{").append(templatizedKey).append("}");
}
}
@@ -730,7 +729,7 @@ public class ApiClient extends JavaTimeFormatter {
// disable default URL encoding
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory();
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
restTemplate.setUriTemplateHandler(uriBuilderFactory);
return restTemplate;
}
@@ -1,14 +1,16 @@
package org.openapitools.client;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import java.util.*;
import org.junit.*;
import org.springframework.util.MultiValueMap;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
public class ApiClientTest {
ApiClient apiClient;
@Before
@@ -21,11 +23,29 @@ public class ApiClientTest {
*/
@Test
public void testUriEncoderWithComma() {
Map<String,Object> uriParams = new HashMap<>();
Map<String, Object> uriParams = new HashMap<>();
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<String, String>();
queryParams.add("key", "val,comma");
apiClient.generateQueryUri(queryParams, uriParams);
assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams));
queryParams.add("ke,&y", "val,?&comma");
String queryTemplate = apiClient.generateQueryUri(queryParams, uriParams);
assertEquals("ke%2C%26y=val%2C%3F%26comma", apiClient.expandPath(queryTemplate, uriParams));
}
}
@Test
public void testPathParamEncoding() {
Map<String, Object> uriParams = new HashMap<>();
uriParams.put("username", "user_name,comma&amp space");
assertEquals("user/user_name%2Ccomma%26amp%20space", apiClient.expandPath("user/{username}", uriParams));
}
@Test
public void testPathAndQueryParamEncoding() {
Map<String, Object> uriParams = new HashMap<>();
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<String, String>();
queryParams.add("key", "val,comma?q-mark&amp");
uriParams.put("username", "user_name,comma&amp space");
String template = "user/{username}?" + apiClient.generateQueryUri(queryParams, uriParams);
assertEquals("user/user_name%2Ccomma%26amp%20space?key=val%2Ccomma%3Fq-mark%26amp",
apiClient.expandPath(template, uriParams));
}
}