Skip to content

Commit e31002d

Browse files
authored
Merge pull request #244 from awslabs/core
Preparing for 1.3.1 patch release
2 parents c25060f + 96d5722 commit e31002d

File tree

40 files changed

+260
-118
lines changed

40 files changed

+260
-118
lines changed

aws-serverless-java-container-core/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
<name>AWS Serverless Java container support - Core</name>
77
<description>Allows Java applications written for a servlet container to run in AWS Lambda</description>
88
<url>https://aws.amazon.com/lambda</url>
9-
<version>1.4-SNAPSHOT</version>
9+
<version>1.3.1-SNAPSHOT</version>
1010

1111
<parent>
1212
<groupId>com.amazonaws.serverless</groupId>
1313
<artifactId>aws-serverless-java-container</artifactId>
14-
<version>1.4-SNAPSHOT</version>
14+
<version>1.3.1-SNAPSHOT</version>
1515
<relativePath>..</relativePath>
1616
</parent>
1717

@@ -62,7 +62,7 @@
6262
<dependency>
6363
<groupId>commons-fileupload</groupId>
6464
<artifactId>commons-fileupload</artifactId>
65-
<version>1.3.3</version>
65+
<version>1.4</version>
6666
</dependency>
6767

6868
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class AwsProxySecurityContextWriter implements SecurityContextWriter<AwsP
3535
// Implementation - SecurityContextWriter
3636
//-------------------------------------------------------------
3737

38+
@Override
3839
public SecurityContext writeSecurityContext(AwsProxyRequest event, Context lambdaContext) {
3940
currentContext = new AwsProxySecurityContext(lambdaContext, event);
4041

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,14 @@
1212
*/
1313
package com.amazonaws.serverless.proxy.internal.jaxrs;
1414

15-
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
1615
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
1716
import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims;
1817
import com.amazonaws.services.lambda.runtime.Context;
1918

20-
import com.fasterxml.jackson.core.type.TypeReference;
21-
2219
import javax.ws.rs.core.SecurityContext;
2320

24-
import java.io.IOException;
2521
import java.security.Principal;
26-
import java.util.Base64;
27-
import java.util.Map;
2822

29-
import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.*;
3023
import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.RequestSource.API_GATEWAY;
3124

3225

@@ -84,6 +77,7 @@ public AwsProxySecurityContext(final Context lambdaContext, final AwsProxyReques
8477
// Implementation - SecurityContext
8578
//-------------------------------------------------------------
8679

80+
@Override
8781
public Principal getUserPrincipal() {
8882
if (getAuthenticationScheme() == null) {
8983
return () -> null;
@@ -120,16 +114,19 @@ public Principal getUserPrincipal() {
120114
}
121115

122116

117+
@Override
123118
public boolean isUserInRole(String role) {
124119
return (role.equals(event.getRequestContext().getIdentity().getUserArn()));
125120
}
126121

127122

123+
@Override
128124
public boolean isSecure() {
129125
return getAuthenticationScheme() != null;
130126
}
131127

132128

129+
@Override
133130
public String getAuthenticationScheme() {
134131
switch (event.getRequestSource()) {
135132
case API_GATEWAY:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class AwsFilterChainManager extends FilterChainManager<AwsServletContext>
4040
* Returns the filter holders stored in the <code>AwsServletContext</code> object
4141
* @return The map of filter holders
4242
*/
43+
@Override
4344
protected Map<String, FilterHolder> getFilterHolders() {
4445
return servletContext.getFilterHolders();
4546
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import java.util.Collections;
6666
import java.util.Enumeration;
6767
import java.util.HashMap;
68-
import java.util.Iterator;
6968
import java.util.List;
7069
import java.util.Locale;
7170
import java.util.Map;
@@ -430,7 +429,7 @@ public ServletInputStream getInputStream()
430429
if (request.getBody() == null) {
431430
return new AwsServletInputStream(new NullInputStream(0, false, false));
432431
}
433-
byte[] bodyBytes = null;
432+
byte[] bodyBytes;
434433
if (request.isBase64Encoded()) {
435434
bodyBytes = Base64.getMimeDecoder().decode(request.getBody());
436435
} else {
@@ -567,6 +566,7 @@ public String getServerName() {
567566
.append(".amazonaws.com").toString();
568567
}
569568

569+
@Override
570570
public int getServerPort() {
571571
if (request.getMultiValueHeaders() == null) {
572572
return 443;

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* object and uses it to initialize a <code>AwsProxyHttpServletRequest</code> object.
2727
*/
2828
public class AwsProxyHttpServletRequestReader extends RequestReader<AwsProxyRequest, AwsProxyHttpServletRequest> {
29+
static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer";
2930

3031
//-------------------------------------------------------------
3132
// Methods - Implementation
@@ -34,9 +35,14 @@ public class AwsProxyHttpServletRequestReader extends RequestReader<AwsProxyRequ
3435
@Override
3536
public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config)
3637
throws InvalidRequestEventException {
38+
// Expect the HTTP method and context to be populated. If they are not, we are handling an
39+
// unsupported event type.
40+
if (request.getHttpMethod() == null || request.getHttpMethod().equals("") || request.getRequestContext() == null) {
41+
throw new InvalidRequestEventException(INVALID_REQUEST_ERROR);
42+
}
3743

3844
request.setPath(stripBasePath(request.getPath(), config));
39-
if (request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE) != null) {
45+
if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE) != null) {
4046
String contentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
4147
// put single as we always expect to have one and only one content type in a request.
4248
request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, getContentTypeWithCharset(contentType, config));

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,9 @@
2121
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
2222
import com.amazonaws.services.lambda.runtime.Context;
2323

24-
import org.apache.http.HttpStatus;
25-
2624
import javax.ws.rs.core.Response;
2725

2826
import java.util.Base64;
29-
import java.util.HashMap;
30-
import java.util.Map;
3127

3228

3329
/**

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1919

2020
import javax.servlet.http.Part;
21-
import javax.ws.rs.core.MultivaluedHashMap;
2221
import java.io.ByteArrayInputStream;
2322
import java.io.FileOutputStream;
2423
import java.io.IOException;
@@ -117,7 +116,7 @@ public String getHeader(String s) {
117116
@Override
118117
public Collection<String> getHeaders(String s) {
119118
if (headers == null) {
120-
return Collections.EMPTY_LIST;
119+
return Collections.emptyList();
121120
}
122121
return headers.get(s);
123122
}
@@ -126,7 +125,7 @@ public Collection<String> getHeaders(String s) {
126125
@Override
127126
public Collection<String> getHeaderNames() {
128127
if (headers == null) {
129-
return Collections.EMPTY_LIST;
128+
return Collections.emptyList();
130129
}
131130
return headers.keySet();
132131
}

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.apache.http.HttpEntity;
3030
import org.apache.http.entity.mime.MultipartEntityBuilder;
3131
import org.apache.http.entity.mime.content.ByteArrayBody;
32+
import org.apache.http.entity.mime.content.StringBody;
3233

3334
import javax.ws.rs.core.HttpHeaders;
3435
import javax.ws.rs.core.MediaType;
@@ -38,7 +39,6 @@
3839
import java.io.IOException;
3940
import java.io.InputStream;
4041
import java.io.UnsupportedEncodingException;
41-
import java.net.URLDecoder;
4242
import java.net.URLEncoder;
4343
import java.nio.charset.Charset;
4444
import java.nio.charset.StandardCharsets;
@@ -144,34 +144,40 @@ public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, by
144144
multipartBuilder = MultipartEntityBuilder.create();
145145
}
146146
multipartBuilder.addPart(fieldName, new ByteArrayBody(content, fileName));
147-
HttpEntity bodyEntity = multipartBuilder.build();
148-
InputStream bodyStream = bodyEntity.getContent();
149-
byte[] buffer = new byte[bodyStream.available()];
150-
IOUtils.readFully(bodyStream, buffer);
151-
request.setBody("\n\n" + new String(buffer, Charset.defaultCharset()));
152-
if (request.getMultiValueHeaders() == null) {
153-
request.setMultiValueHeaders(new Headers());
154-
}
155-
request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue());
156-
if (bodyEntity.getContentEncoding() != null) {
157-
request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_ENCODING, bodyEntity.getContentEncoding().getValue());
158-
}
159-
request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + "");
147+
buildMultipartBody();
160148
return this;
161149
}
162150

163-
public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) {
151+
public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue)
152+
throws IOException {
164153
if (request.getMultiValueHeaders() == null) {
165154
request.setMultiValueHeaders(new Headers());
166155
}
167-
request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA);
168156
if (multipartBuilder == null) {
169157
multipartBuilder = MultipartEntityBuilder.create();
170158
}
171-
// TODO: implement
159+
multipartBuilder.addPart(fieldName, new StringBody(fieldValue));
160+
buildMultipartBody();
172161
return this;
173162
}
174163

164+
private void buildMultipartBody()
165+
throws IOException {
166+
HttpEntity bodyEntity = multipartBuilder.build();
167+
InputStream bodyStream = bodyEntity.getContent();
168+
byte[] buffer = new byte[bodyStream.available()];
169+
IOUtils.readFully(bodyStream, buffer);
170+
byte[] finalBuffer = new byte[buffer.length + 1];
171+
byte[] newLineBytes = "\n\n".getBytes(LambdaContainerHandler.getContainerConfig().getDefaultContentCharset());
172+
System.arraycopy(newLineBytes, 0, finalBuffer, 0, newLineBytes.length);
173+
System.arraycopy(buffer, 0, finalBuffer, newLineBytes.length - 1, buffer.length);
174+
request.setBody(Base64.getMimeEncoder().encodeToString(finalBuffer));
175+
request.setIsBase64Encoded(true);
176+
this.request.setMultiValueHeaders(new Headers());
177+
header(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue());
178+
header(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + "");
179+
}
180+
175181

176182
public AwsProxyRequestBuilder header(String key, String value) {
177183
if (this.request.getMultiValueHeaders() == null) {

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
55

66
import java.util.ArrayList;
7+
import java.util.Arrays;
78
import java.util.HashSet;
89
import java.util.List;
910

@@ -237,9 +238,7 @@ public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) {
237238
*/
238239
public void addBinaryContentTypes(String... contentTypes) {
239240
if(contentTypes != null) {
240-
for(String type: contentTypes) {
241-
binaryContentTypes.add(type);
242-
}
241+
binaryContentTypes.addAll(Arrays.asList(contentTypes));
243242
}
244243
}
245244

0 commit comments

Comments
 (0)