Skip to content

Commit 5c4ca2b

Browse files
authored
Release 1.5.2 (#385)
* fix: Use single value headers for HTTP API response (#377) Parametrized the use of the single value headers for the response writer to support the v2 proxy schema for HTTP API * fix: Updated HTTP API handler constructor (#377) Changed default httpApiV2 constructor for the handler in all the framework implementations * fix: Switched to non-mime encoder for respponse (#339)
1 parent edf11fe commit 5c4ca2b

File tree

6 files changed

+47
-7
lines changed

6 files changed

+47
-7
lines changed

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

+28-1
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
2020
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
2121
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
22+
import com.amazonaws.serverless.proxy.model.Headers;
2223
import com.amazonaws.services.lambda.runtime.Context;
2324

2425
import javax.ws.rs.core.Response;
2526

2627
import java.util.Base64;
28+
import java.util.HashMap;
29+
import java.util.Map;
2730

2831

2932
/**
@@ -32,6 +35,16 @@
3235
*/
3336
public class AwsProxyHttpServletResponseWriter extends ResponseWriter<AwsHttpServletResponse, AwsProxyResponse> {
3437

38+
private boolean writeSingleValueHeaders;
39+
40+
public AwsProxyHttpServletResponseWriter() {
41+
this(false);
42+
}
43+
44+
public AwsProxyHttpServletResponseWriter(boolean singleValueHeaders) {
45+
writeSingleValueHeaders = singleValueHeaders;
46+
}
47+
3548
//-------------------------------------------------------------
3649
// Methods - Implementation
3750
//-------------------------------------------------------------
@@ -47,13 +60,16 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse,
4760
if (!isBinary(containerResponse.getContentType()) && isValidUtf8(containerResponse.getAwsResponseBodyBytes())) {
4861
responseString = containerResponse.getAwsResponseBodyString();
4962
} else {
50-
responseString = Base64.getMimeEncoder().encodeToString(containerResponse.getAwsResponseBodyBytes());
63+
responseString = Base64.getEncoder().encodeToString(containerResponse.getAwsResponseBodyBytes());
5164
awsProxyResponse.setBase64Encoded(true);
5265
}
5366

5467
awsProxyResponse.setBody(responseString);
5568
}
5669
awsProxyResponse.setMultiValueHeaders(containerResponse.getAwsResponseHeaders());
70+
if (writeSingleValueHeaders) {
71+
awsProxyResponse.setHeaders(toSingleValueHeaders(containerResponse.getAwsResponseHeaders()));
72+
}
5773

5874
awsProxyResponse.setStatusCode(containerResponse.getStatus());
5975

@@ -65,6 +81,17 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse,
6581
return awsProxyResponse;
6682
}
6783

84+
private Map<String, String> toSingleValueHeaders(Headers h) {
85+
Map<String, String> out = new HashMap<>();
86+
if (h == null || h.isEmpty()) {
87+
return out;
88+
}
89+
for (String k : h.keySet()) {
90+
out.put(k, h.getFirst(k));
91+
}
92+
return out;
93+
}
94+
6895
private boolean isBinary(String contentType) {
6996
if(contentType != null) {
7097
int semidx = contentType.indexOf(';');

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public Builder defaultProxy() {
110110
public Builder defaultHttpApiV2Proxy() {
111111
initializationWrapper(new InitializationWrapper())
112112
.requestReader((RequestReader<RequestType, ContainerRequestType>) new AwsHttpApiV2HttpServletRequestReader())
113-
.responseWriter((ResponseWriter<AwsHttpServletResponse, ResponseType>) new AwsProxyHttpServletResponseWriter())
113+
.responseWriter((ResponseWriter<AwsHttpServletResponse, ResponseType>) new AwsProxyHttpServletResponseWriter(true))
114114
.securityContextWriter((SecurityContextWriter<RequestType>) new AwsHttpApiV2SecurityContextWriter())
115115
.exceptionHandler((ExceptionHandler<ResponseType>) new AwsProxyExceptionHandler())
116116
.requestTypeClass((Class<RequestType>) HttpApiV2ProxyRequest.class)

aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public static JerseyLambdaContainerHandler<HttpApiV2ProxyRequest, AwsProxyRespon
116116
HttpApiV2ProxyRequest.class,
117117
AwsProxyResponse.class,
118118
new AwsHttpApiV2HttpServletRequestReader(),
119-
new AwsProxyHttpServletResponseWriter(),
119+
new AwsProxyHttpServletResponseWriter(true),
120120
new AwsHttpApiV2SecurityContextWriter(),
121121
new AwsProxyExceptionHandler(),
122122
jaxRsApplication);

aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public static SparkLambdaContainerHandler<HttpApiV2ProxyRequest, AwsProxyRespons
132132
SparkLambdaContainerHandler<HttpApiV2ProxyRequest, AwsProxyResponse> newHandler = new SparkLambdaContainerHandler<>(HttpApiV2ProxyRequest.class,
133133
AwsProxyResponse.class,
134134
new AwsHttpApiV2HttpServletRequestReader(),
135-
new AwsProxyHttpServletResponseWriter(),
135+
new AwsProxyHttpServletResponseWriter(true),
136136
new AwsHttpApiV2SecurityContextWriter(),
137137
new AwsProxyExceptionHandler(),
138138
new LambdaEmbeddedServerFactory());

aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
import java.util.Collection;
2424
import java.util.stream.Collectors;
2525

26-
import static org.junit.Assert.assertEquals;
27-
import static org.junit.Assert.assertNotNull;
26+
import static org.junit.Assert.*;
2827

2928
@RunWith(Parameterized.class)
3029
public class ServletAppTest {
@@ -192,4 +191,18 @@ public void springExceptionMapping_throw404Ex_expectMappedTo404() {
192191
assertNotNull(resp);
193192
assertEquals(404, resp.getStatusCode());
194193
}
194+
195+
@Test
196+
public void echoMessage_populatesSingleValueHeadersForHttpApiV2() {
197+
AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST")
198+
.header(HttpHeaders.CONTENT_TYPE, "application/json;v=1")
199+
.header(HttpHeaders.ACCEPT, "application/json;v=1")
200+
.body(new MessageData("test message"));
201+
AwsProxyResponse resp = handler.handleRequest(req, lambdaContext);
202+
if ("HTTP_API".equals(type)) {
203+
assertNotNull(resp.getHeaders());
204+
} else {
205+
assertNull(resp.getHeaders());
206+
}
207+
}
195208
}

aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public static Struts2LambdaContainerHandler<HttpApiV2ProxyRequest, AwsProxyRespo
6565
HttpApiV2ProxyRequest.class,
6666
AwsProxyResponse.class,
6767
new AwsHttpApiV2HttpServletRequestReader(),
68-
new AwsProxyHttpServletResponseWriter(),
68+
new AwsProxyHttpServletResponseWriter(true),
6969
new AwsHttpApiV2SecurityContextWriter(),
7070
new AwsProxyExceptionHandler());
7171
}

0 commit comments

Comments
 (0)