Skip to content

Commit c9baa8e

Browse files
author
Dennis Kieselhorst
authored
Merge pull request #501 from Artur-/response-charset
fix: Write resources using the charset defined in a Content-Type header
2 parents 3b99b53 + abae8e8 commit c9baa8e

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,24 @@ 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 (isContentTypeHeader(s)) {
217+
setContentType(s1);
218+
} else {
219+
setHeader(s, s1, true);
220+
}
221+
}
222+
223+
224+
private boolean isContentTypeHeader(String s) {
225+
return s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()));
217226
}
218227

219228

220229
@Override
221230
public void addHeader(String s, String s1) {
222231
if (!canSetHeader()) return;
223232
// TODO: We should probably have a list of headers that we are not allowed to have multiple values for
224-
if (s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))) {
233+
if (isContentTypeHeader(s)) {
225234
setContentType(s1);
226235
} else {
227236
setHeader(s, s1, false);

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)