From 87b83a121bfe3c73b6e7041539f3ae25ab4b7a73 Mon Sep 17 00:00:00 2001 From: Lars Mogren Date: Thu, 30 Aug 2018 12:16:58 +0200 Subject: [PATCH] Solves issue #188 setting the wrong HTTP header. - also solves Maven relativePath problem using a clean build env --- archetypes/jersey/pom.xml | 1 + archetypes/spark/pom.xml | 1 + archetypes/spring/pom.xml | 1 + archetypes/springboot/pom.xml | 1 + aws-serverless-java-container-core/pom.xml | 1 + .../servlet/AwsHttpServletResponse.java | 16 ++++--- .../servlet/AwsHttpServletResponseTest.java | 43 +++++++++++++++++++ aws-serverless-java-container-jersey/pom.xml | 1 + aws-serverless-java-container-spark/pom.xml | 1 + aws-serverless-java-container-spring/pom.xml | 1 + 10 files changed, 62 insertions(+), 5 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfacc..74dcea2cc 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42d..5396c6674 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b57280..ce0835f1c 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1c..e697e26c3 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a983..b5ad8d613 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index de0f58c23..32d5b814c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -265,14 +265,17 @@ public Collection getHeaderNames() { @Override public String getCharacterEncoding() { - return headers.getFirst(HttpHeaders.CONTENT_ENCODING); + final String contentType = Optional.ofNullable(getContentType()).orElse(""); + if (contentType.contains(";")) { + return contentType.split(";")[1].split("=")[1].trim().toLowerCase(Locale.getDefault()); + } else { + return ""; + } } @Override - public String getContentType() { - return headers.getFirst(HttpHeaders.CONTENT_TYPE); - } + public String getContentType() { return getHeader(HttpHeaders.CONTENT_TYPE); } @Override @@ -334,7 +337,10 @@ public PrintWriter getWriter() throws IOException { @Override public void setCharacterEncoding(String s) { - setHeader(HttpHeaders.CONTENT_ENCODING, s, true); + final String characterEncoding = Optional.ofNullable(s).orElse("").toLowerCase(Locale.getDefault()); + final String oldValue = Optional.ofNullable(getHeader(HttpHeaders.CONTENT_TYPE)).orElse(""); + String contentType = oldValue.contains(";") ? oldValue.split(";")[0].trim(): oldValue; + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", contentType, characterEncoding), true); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 553b7c619..ff8893257 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -140,6 +140,49 @@ public void cookie_addCookieWithoutMaxAge_expectNoExpires() { assertFalse(cookieHeader.contains("Expires")); } + @Test + public void characterEncoding_setCharacterEncoding() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json"); + resp.setCharacterEncoding("UTF-8"); + assertNotEquals("UTF-8", resp.getHeader("Content-Encoding")); + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + } + + @Test + public void characterEncoding_setContentType() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json; charset=utf-8"); + resp.setCharacterEncoding("UTF-8"); + + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + assertEquals("utf-8", resp.getCharacterEncoding()); + } + + @Test + public void characterEncoding_setContentTypeAndsetCharacterEncoding() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json"); + resp.setCharacterEncoding("UTF-8"); + + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + assertEquals("utf-8", resp.getCharacterEncoding()); + } + + @Test + public void characterEncoding_setCharacterEncodingAndsetContentType() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("application/json"); + + assertEquals("application/json", resp.getContentType()); + assertEquals("application/json", resp.getHeader("Content-Type")); + assertEquals("", resp.getCharacterEncoding()); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec5..025737752 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5aac26d26..ff52be35a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c877425c3..bac70d846 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ..