diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java index e5db5a8a..b10fe14c 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelper.java @@ -52,6 +52,7 @@ import lombok.extern.apachecommons.CommonsLog; /** * @author Dave Syer + * @author Marcos Barbero */ @CommonsLog public class ProxyRequestHelper { @@ -98,8 +99,7 @@ public class ProxyRequestHelper { String contextURI = (String) context.get("requestURI"); if (contextURI != null) { try { - uri = UriUtils.encodePath(contextURI, - WebUtils.DEFAULT_CHARACTER_ENCODING); + uri = UriUtils.encodePath(contextURI, characterEncoding(request)); } catch (Exception e) { log.debug( @@ -110,6 +110,11 @@ public class ProxyRequestHelper { return uri; } + private String characterEncoding(HttpServletRequest request) { + return request.getCharacterEncoding() != null ? request.getCharacterEncoding() + : WebUtils.DEFAULT_CHARACTER_ENCODING; + } + public MultiValueMap buildZuulRequestQueryParams( HttpServletRequest request) { Map> map = HTTPRequestUtils.getInstance().getQueryParams(); @@ -267,7 +272,8 @@ public class ProxyRequestHelper { /* for tests */ boolean shouldDebugBody(RequestContext ctx) { HttpServletRequest request = ctx.getRequest(); - if (!this.traceRequestBody || ctx.isChunkedRequestBody() || RequestUtils.isZuulServletRequest()) { + if (!this.traceRequestBody || ctx.isChunkedRequestBody() + || RequestUtils.isZuulServletRequest()) { return false; } if (request == null || request.getContentType() == null) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java index b2c5539c..db039bea 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRequestHelperTests.java @@ -259,4 +259,33 @@ public class ProxyRequestHelperTests { assertThat(queryString, is("?wsdl")); } + @Test + public void buildZuulRequestURIWithUTF8() throws Exception { + String encodedURI = "/resource/esp%C3%A9cial-char"; + String decodedURI = "/resource/espécial-char"; + + MockHttpServletRequest request = new MockHttpServletRequest("GET", encodedURI); + request.setCharacterEncoding("UTF-8"); + final RequestContext context = RequestContext.getCurrentContext(); + context.setRequest(request); + context.set("requestURI", decodedURI); + + final String requestURI = new ProxyRequestHelper().buildZuulRequestURI(request); + assertThat(requestURI, equalTo(encodedURI)); + } + + @Test + public void buildZuulRequestURIWithDefaultEncoding() { + String encodedURI = "/resource/esp%E9cial-char"; + String decodedURI = "/resource/espécial-char"; + + MockHttpServletRequest request = new MockHttpServletRequest("GET", encodedURI); + final RequestContext context = RequestContext.getCurrentContext(); + context.setRequest(request); + context.set("requestURI", decodedURI); + + final String requestURI = new ProxyRequestHelper().buildZuulRequestURI(request); + assertThat(requestURI, equalTo(encodedURI)); + } + }