diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index e48370f1539..f868eaa6dbf 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -34,6 +34,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; {{#threetenbp}} import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; @@ -622,6 +623,12 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -632,27 +639,33 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + final String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java index 093e4897144..8e5e2933cec 100644 --- a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java @@ -30,6 +30,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; import org.springframework.http.converter.HttpMessageConverter; @@ -578,6 +579,12 @@ public class ApiClient extends JavaTimeFormatter { * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -588,27 +595,33 @@ public class ApiClient extends JavaTimeFormatter { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + final String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java b/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java new file mode 100644 index 00000000000..4b3a63c3e26 --- /dev/null +++ b/samples/client/petstore/java/resttemplate-withXml/src/test/java/org/openapitools/client/ApiClientTest.java @@ -0,0 +1,31 @@ +package org.openapitools.client; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.*; +import org.junit.*; +import org.springframework.util.MultiValueMap; +import org.springframework.util.LinkedMultiValueMap; + +public class ApiClientTest { + ApiClient apiClient; + + @Before + public void setup() { + apiClient = new ApiClient(); + } + + /** + * Test uri encoding when params contains comma + */ + @Test + public void testUriEncoderWithComma() { + Map uriParams = new HashMap<>(); + MultiValueMap queryParams = new LinkedMultiValueMap(); + queryParams.add("key", "val,comma"); + apiClient.generateQueryUri(queryParams, uriParams); + + assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams)); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java index 89f43f67cc1..42d81a59578 100644 --- a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java @@ -25,6 +25,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.DefaultUriBuilderFactory; import org.threeten.bp.*; import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule; import org.springframework.http.converter.HttpMessageConverter; @@ -573,6 +574,12 @@ public class ApiClient extends JavaTimeFormatter { * @return path with placeholders replaced by variables */ public String expandPath(String pathTemplate, Map variables) { + // disable default URL encoding + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(); + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate.getUriTemplateHandler().expand(pathTemplate, variables).toString(); } @@ -583,27 +590,33 @@ public class ApiClient extends JavaTimeFormatter { * @param uriParams The path parameters * return templatized query string */ - private String generateQueryUri(MultiValueMap queryParams, Map uriParams) { + public String generateQueryUri(MultiValueMap queryParams, Map uriParams) { StringBuilder queryBuilder = new StringBuilder(); queryParams.forEach((name, values) -> { - if (CollectionUtils.isEmpty(values)) { - if (queryBuilder.length() != 0) { - queryBuilder.append('&'); - } - queryBuilder.append(name); - } else { - int valueItemCounter = 0; - for (Object value : values) { + try { + final String encodedName = URLEncoder.encode(name.toString(), "UTF-8"); + if (CollectionUtils.isEmpty(values)) { if (queryBuilder.length() != 0) { queryBuilder.append('&'); } - queryBuilder.append(name); - if (value != null) { - String templatizedKey = name + valueItemCounter++; - uriParams.put(templatizedKey, value.toString()); - queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + queryBuilder.append(encodedName); + } else { + int valueItemCounter = 0; + for (Object value : values) { + if (queryBuilder.length() != 0) { + queryBuilder.append('&'); + } + queryBuilder.append(encodedName); + if (value != null) { + String templatizedKey = encodedName + valueItemCounter++; + final String encodedValue = URLEncoder.encode(value.toString(), "UTF-8"); + uriParams.put(templatizedKey, encodedValue); + queryBuilder.append('=').append("{").append(templatizedKey).append("}"); + } } } + } catch (UnsupportedEncodingException e) { + } }); return queryBuilder.toString(); diff --git a/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java b/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java new file mode 100644 index 00000000000..4b3a63c3e26 --- /dev/null +++ b/samples/client/petstore/java/resttemplate/src/test/java/org/openapitools/client/ApiClientTest.java @@ -0,0 +1,31 @@ +package org.openapitools.client; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.*; +import org.junit.*; +import org.springframework.util.MultiValueMap; +import org.springframework.util.LinkedMultiValueMap; + +public class ApiClientTest { + ApiClient apiClient; + + @Before + public void setup() { + apiClient = new ApiClient(); + } + + /** + * Test uri encoding when params contains comma + */ + @Test + public void testUriEncoderWithComma() { + Map uriParams = new HashMap<>(); + MultiValueMap queryParams = new LinkedMultiValueMap(); + queryParams.add("key", "val,comma"); + apiClient.generateQueryUri(queryParams, uriParams); + + assertEquals("/key=val%2Ccomma", apiClient.expandPath("/key={key0}", uriParams)); + } +} \ No newline at end of file