Skip to content

Commit 03db37c

Browse files
committed
fix: Write resources using the charset defined in a Content-Type header
If a resource is returned using "application/javascript; charset=UTF-8" it should not be written as ISO-8859-1
1 parent be15cfd commit 03db37c

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,11 @@ public void addDateHeader(String s, long l) {
213213
@Override
214214
public void setHeader(String s, String s1) {
215215
if (!canSetHeader()) return;
216-
setHeader(s, s1, true);
216+
if ("Content-Type".equalsIgnoreCase(s)) {
217+
setContentType(s1);
218+
} else {
219+
setHeader(s, s1, true);
220+
}
217221
}
218222

219223

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import java.io.IOException;
1414
import java.io.PrintWriter;
15+
import java.nio.charset.StandardCharsets;
1516
import java.text.ParseException;
1617
import java.text.SimpleDateFormat;
1718
import java.time.Instant;
@@ -38,6 +39,7 @@ public class AwsHttpServletResponseTest {
3839
private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=(.*)$");
3940

4041
private static final String CONTENT_TYPE_WITH_CHARSET = "application/json; charset=UTF-8";
42+
private static final String JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET = "application/javascript; charset=UTF-8";
4143

4244
@Test
4345
void cookie_addCookie_verifyPath() {
@@ -325,6 +327,18 @@ void characterEncoding_setCharacterEncodingInContentType_overridesDefault() {
325327
assertEquals("UTF-8", resp.getCharacterEncoding());
326328
}
327329

330+
@Test
331+
void characterEncoding_encodingInContentTypeHeader_writesCorrectData() throws IOException {
332+
AwsHttpServletResponse resp = new AwsHttpServletResponse(null, new CountDownLatch(1));
333+
resp.setHeader("Content-Type", JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET);
334+
resp.getOutputStream().write("ü".getBytes(StandardCharsets.UTF_8));
335+
resp.flushBuffer();
336+
337+
assertEquals(JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET, resp.getContentType());
338+
assertEquals(JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET, resp.getHeader("Content-Type"));
339+
assertEquals("ü",resp.getAwsResponseBodyString());
340+
}
341+
328342
private int getMaxAge(String header) {
329343
Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header);
330344
assertTrue(ageMatcher.find());

0 commit comments

Comments
 (0)