From 8229eb657e8e1a9f5c661ee751bd8c18da50f062 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Beaudet Date: Wed, 1 Jun 2016 17:38:06 -0400 Subject: [PATCH] Fixed the path encoding in ProxyRequestHelper when the character encoding was specifically set on HttpServletRequest. When the character encoding was set to UTF-8 for example, the path was correctly decoded in PreDecorationFilter but was reencoded in ProxyRequestHelper using the Servlet default ISO-8859-1. This commit uses the character encoding when set and fallback on default. --- .../zuul/filters/ProxyRequestHelperTests.java | 32 +++++++++++++++++++ .../filters/pre/PreDecorationFilterTests.java | 13 ++++++++ 2 files changed, 45 insertions(+) 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 db039bea..e2b4fb23 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 @@ -288,4 +288,36 @@ public class ProxyRequestHelperTests { assertThat(requestURI, equalTo(encodedURI)); } + @Test + public void getUTF8Url() { + String requestURI = "/oléדרעק"; + String encodedRequestURI = "/ol%C3%A9%D7%93%D7%A8%D7%A2%D7%A7"; + MockHttpServletRequest request = new MockHttpServletRequest("GET", requestURI); + request.setCharacterEncoding("UTF-8"); + + RequestContext context = RequestContext.getCurrentContext(); + context.set("requestURI", requestURI); + + ProxyRequestHelper helper = new ProxyRequestHelper(); + + String uri = helper.buildZuulRequestURI(request); + + assertThat(uri, is(encodedRequestURI)); + } + + @Test + public void getDefaultEncodingUrl() { + String requestURI = "/oléדרעק"; + String encodedRequestURI = "/ol%E9%3F%3F%3F%3F"; + MockHttpServletRequest request = new MockHttpServletRequest("GET", requestURI); + + RequestContext context = RequestContext.getCurrentContext(); + context.set("requestURI", requestURI); + + ProxyRequestHelper helper = new ProxyRequestHelper(); + + String uri = helper.buildZuulRequestURI(request); + + assertThat(uri, is(encodedRequestURI)); + } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java index cf9cfe6a..9b521676 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/pre/PreDecorationFilterTests.java @@ -377,6 +377,19 @@ public class PreDecorationFilterTests { assertTrue("sensitiveHeaders is wrong: " + sensitiveHeaders, sensitiveHeaders.containsAll(Arrays.asList("x-bar", "x-foo"))); } + + @Test + public void urlProperlyDecodedWhenCharacterEncodingIsSet() throws Exception { + this.request.setCharacterEncoding("UTF-8"); + this.properties.setPrefix("/api"); + this.properties.setStripPrefix(true); + this.request.setRequestURI("/api/foo/ol%C3%A9%D7%93%D7%A8%D7%A2%D7%A7"); + this.routeLocator.addRoute("/foo/**", "foo"); + RequestContext ctx = RequestContext.getCurrentContext(); + this.filter.run(); + String decodedRequestURI = (String) ctx.get("requestURI"); + assertTrue(decodedRequestURI.equals("/oléדרעק")); + } private Object getHeader(List> headers, String key) { String value = null;