Skip to content

Commit 71bde0a

Browse files
committed
Resolving conflicts with merge
2 parents a318a11 + 7a16f04 commit 71bde0a

File tree

23 files changed

+342
-37
lines changed

23 files changed

+342
-37
lines changed

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to
1010
<dependency>
1111
<groupId>com.amazonaws.serverless</groupId>
1212
<artifactId>aws-serverless-java-container-jersey</artifactId>
13-
<version>0.2</version>
13+
<version>0.3</version>
1414
</dependency>
1515
```
1616

@@ -36,7 +36,7 @@ public class LambdaHandler implements RequestHandler<AwsProxyRequest, AwsProxyRe
3636
```
3737

3838
### Spring support
39-
The library supports Spring applications that are configured using annotations (in code) rather than in an XML file. The simplest possible configuration uses the `@ComponentScan` annotation to load all controller classes from a package. For example, our unit test application has the following configuuration class.
39+
The library supports Spring applications that are configured using annotations (in code) rather than in an XML file. The simplest possible configuration uses the `@ComponentScan` annotation to load all controller classes from a package. For example, our unit test application has the following configuration class.
4040

4141
```java
4242
@Configuration
@@ -48,15 +48,18 @@ public class EchoSpringAppConfig {
4848
Once you have declared a configuration class, you can initialize the library with the class name:
4949
```java
5050
public class LambdaHandler implements RequestHandler<AwsProxyRequest, AwsProxyResponse> {
51-
SpringLambdacontainerHandler<AwsProxyRequest, AwsProxyResponse> handler =
52-
SpringLambdacontainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class)
51+
SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler =
52+
SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class);
5353

5454
public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
5555
return handler.proxy(awsProxyRequest, context);
5656
}
5757
}
5858
```
5959

60+
#### Spring Profiles
61+
You can enable Spring Profiles (as defined with the `@Profile` annotation) by using the `SpringLambdaContainerHandler.activateSpringProfiles(String...)` method - common drivers of this might be the AWS Lambda stage that you're deployed under, or stage variables. See [@Profile documentation](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html) for details.
62+
6063
### Spark support
6164
The library also supports applications written with the [Spark framework](http://sparkjava.com/). When using the library with Spark, it's important to initialize the `SparkLambdaContainerHandler` before defining routes.
6265

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

Lines changed: 2 additions & 2 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>0.3-SNAPSHOT</version>
9+
<version>0.4-SNAPSHOT</version>
1010

1111
<parent>
1212
<groupId>com.amazonaws.serverless</groupId>
1313
<artifactId>aws-serverless-java-container</artifactId>
14-
<version>0.3-SNAPSHOT</version>
14+
<version>0.4-SNAPSHOT</version>
1515
</parent>
1616

1717
<dependencies>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ public class AwsProxyRequest {
4343

4444
@JsonIgnore
4545
public String getQueryString() {
46-
String params = "";
46+
StringBuilder params = new StringBuilder("");
4747

4848
if (this.getQueryStringParameters() != null && this.getQueryStringParameters().size() > 0) {
4949
for (String key : this.getQueryStringParameters().keySet()) {
50-
String separator = params.equals("") ? "?" : "&";
50+
String separator = params.length() == 0 ? "?" : "&";
5151

52-
params += separator + key + "=" + this.getQueryStringParameters().get(key);
52+
params.append(separator + key + "=" + this.getQueryStringParameters().get(key));
5353
}
5454
}
5555

56-
return params;
56+
return params.toString();
5757
}
5858

5959

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

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public String getPathTranslated() {
176176

177177
@Override
178178
public String getContextPath() {
179-
return "/";
179+
return request.getRequestContext().getStage();
180180
}
181181

182182

@@ -213,10 +213,15 @@ public String getRequestURI() {
213213
@Override
214214
public StringBuffer getRequestURL() {
215215
String url = "";
216-
url += getHeaderCaseInsensitive(HttpHeaders.HOST);
216+
url += getServerName();
217+
url += "/";
218+
url += getContextPath();
217219
url += "/";
218220
url += request.getPath();
219-
return new StringBuffer(url);
221+
222+
url = url.replaceAll("/+", "/");
223+
224+
return new StringBuffer(getScheme() + "://" + url);
220225
}
221226

222227

@@ -310,17 +315,17 @@ public void setCharacterEncoding(String s) throws UnsupportedEncodingException {
310315

311316
if (currentContentType.contains(HEADER_VALUE_SEPARATOR)) {
312317
String[] contentTypeValues = currentContentType.split(HEADER_VALUE_SEPARATOR);
313-
String contentType = contentTypeValues[0];
318+
StringBuilder contentType = new StringBuilder(contentTypeValues[0]);
314319

315320
for (String contentTypeValue : contentTypeValues) {
321+
String contentTypeString = HEADER_VALUE_SEPARATOR + " " + contentTypeValue;
316322
if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) {
317-
contentType += HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s;
318-
} else {
319-
contentType += HEADER_VALUE_SEPARATOR + " " + contentTypeValue;
323+
contentTypeString = HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s;
320324
}
325+
contentType.append(contentTypeString);
321326
}
322327

323-
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, contentType);
328+
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, contentType.toString());
324329
} else {
325330
request.getHeaders().put(
326331
HttpHeaders.CONTENT_TYPE,
@@ -419,7 +424,9 @@ public String getParameter(String s) {
419424
@Override
420425
public Enumeration<String> getParameterNames() {
421426
List<String> paramNames = new ArrayList<>();
422-
paramNames.addAll(request.getQueryStringParameters().keySet());
427+
if (request.getQueryStringParameters() != null) {
428+
paramNames.addAll(request.getQueryStringParameters().keySet());
429+
}
423430
paramNames.addAll(urlEncodedFormParameters.keySet());
424431
return Collections.enumeration(paramNames);
425432
}
@@ -457,13 +464,15 @@ public Map<String, String[]> getParameterMap() {
457464
params = new HashMap<>();
458465
}
459466

460-
for (Map.Entry<String, String> entry : request.getQueryStringParameters().entrySet()) {
461-
if (params.containsKey(entry.getKey())) {
462-
params.get(entry.getKey()).add(entry.getValue());
463-
} else {
464-
List<String> valueList = new ArrayList<>();
465-
valueList.add(entry.getValue());
466-
params.put(entry.getKey(), valueList);
467+
if (request.getQueryStringParameters() != null) {
468+
for (Map.Entry<String, String> entry : request.getQueryStringParameters().entrySet()) {
469+
if (params.containsKey(entry.getKey())) {
470+
params.get(entry.getKey()).add(entry.getValue());
471+
} else {
472+
List<String> valueList = new ArrayList<>();
473+
valueList.add(entry.getValue());
474+
params.put(entry.getKey(), valueList);
475+
}
467476
}
468477
}
469478

@@ -492,6 +501,16 @@ public String getScheme() {
492501
return headerValue;
493502
}
494503

504+
@Override
505+
public String getServerName() {
506+
String name = getHeaderCaseInsensitive(HttpHeaders.HOST);
507+
508+
if (name == null || name.length() == 0) {
509+
name = "lambda.amazonaws.com";
510+
}
511+
return name;
512+
}
513+
495514
@Override
496515
public BufferedReader getReader()
497516
throws IOException {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,4 +485,8 @@ public static ServletContext getInstance(Context lambdaContext) {
485485

486486
return instance;
487487
}
488+
489+
public static void clearServletContextCache() {
490+
instance = null;
491+
}
488492
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) {
5858
this.request.setPath(path);
5959
this.request.setQueryStringParameters(new HashMap<>());
6060
this.request.setRequestContext(new ApiGatewayRequestContext());
61+
this.request.getRequestContext().setStage("test");
6162
ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity();
6263
identity.setSourceIp("127.0.0.1");
6364
this.request.getRequestContext().setIdentity(identity);
@@ -190,6 +191,23 @@ public AwsProxyRequestBuilder cookie(String name, String value) {
190191
return this;
191192
}
192193

194+
public AwsProxyRequestBuilder scheme(String scheme) {
195+
if (request.getHeaders() == null) {
196+
request.setHeaders(new HashMap<>());
197+
}
198+
199+
request.getHeaders().put("CloudFront-Forwarded-Proto", scheme);
200+
return this;
201+
}
202+
203+
public AwsProxyRequestBuilder serverName(String serverName) {
204+
if (request.getHeaders() == null) {
205+
request.setHeaders(new HashMap<>());
206+
}
207+
208+
request.getHeaders().put("Host", serverName);
209+
return this;
210+
}
193211

194212
public AwsProxyRequest build() {
195213
return this.request;

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import javax.ws.rs.core.HttpHeaders;
99
import javax.ws.rs.core.MediaType;
1010

11+
import java.util.Collections;
12+
import java.util.Enumeration;
13+
import java.util.List;
14+
1115
import static org.junit.Assert.*;
1216

1317
public class AwsProxyHttpServletRequestTest {
@@ -39,6 +43,16 @@ public class AwsProxyHttpServletRequestTest {
3943
private static final AwsProxyRequest REQUEST_MALFORMED_COOKIE = new AwsProxyRequestBuilder("/hello", "GET")
4044
.header(HttpHeaders.COOKIE, QUERY_STRING_NAME_VALUE).build();
4145

46+
private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING;
47+
static {
48+
AwsProxyRequest awsProxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build();
49+
awsProxyRequest.setQueryStringParameters(null);
50+
REQUEST_NULL_QUERY_STRING = awsProxyRequest;
51+
}
52+
53+
private static final AwsProxyRequest REQUEST_QUERY = new AwsProxyRequestBuilder("/hello", "POST")
54+
.queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE).build();
55+
4256

4357
@Test
4458
public void headers_getHeader_validRequest() {
@@ -131,4 +145,36 @@ public void cookie_getCookies_emptyCookies() {
131145
assertNotNull(request.getCookies());
132146
assertEquals(0, request.getCookies().length);
133147
}
148+
149+
@Test
150+
public void queryParameters_getParameterMap_null() {
151+
HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_NULL_QUERY_STRING, null, null);
152+
assertNotNull(request);
153+
assertEquals(0, request.getParameterMap().size());
154+
}
155+
156+
@Test
157+
public void queryParameters_getParameterMap_nonNull() {
158+
HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_QUERY, null, null);
159+
assertNotNull(request);
160+
assertEquals(1, request.getParameterMap().size());
161+
assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(FORM_PARAM_NAME)[0]);
162+
}
163+
164+
@Test
165+
public void queryParameters_getParameterNames_null() {
166+
HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_NULL_QUERY_STRING, null, null);
167+
List<String> parameterNames = Collections.list(request.getParameterNames());
168+
assertNotNull(request);
169+
assertEquals(0, parameterNames.size());
170+
}
171+
172+
@Test
173+
public void queryParameters_getParameterNames_nonNull() {
174+
HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_QUERY, null, null);
175+
List<String> parameterNames = Collections.list(request.getParameterNames());
176+
assertNotNull(request);
177+
assertEquals(1, parameterNames.size());
178+
assertTrue(parameterNames.contains(FORM_PARAM_NAME));
179+
}
134180
}

aws-serverless-java-container-jersey/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 - Jersey implementation</name>
77
<description>Allows Java applications written for Jersey to run in AWS Lambda</description>
88
<url>https://aws.amazon.com/lambda</url>
9-
<version>0.3-SNAPSHOT</version>
9+
<version>0.4-SNAPSHOT</version>
1010

1111
<parent>
1212
<groupId>com.amazonaws.serverless</groupId>
1313
<artifactId>aws-serverless-java-container</artifactId>
14-
<version>0.3-SNAPSHOT</version>
14+
<version>0.4-SNAPSHOT</version>
1515
</parent>
1616

1717
<properties>
@@ -24,7 +24,7 @@
2424
<dependency>
2525
<groupId>com.amazonaws.serverless</groupId>
2626
<artifactId>aws-serverless-java-container-core</artifactId>
27-
<version>0.3-SNAPSHOT</version>
27+
<version>0.4-SNAPSHOT</version>
2828
</dependency>
2929

3030
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-server -->

aws-serverless-java-container-spark/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 - Spark implementation</name>
77
<description>Allows Java applications written for Spark to run in AWS Lambda</description>
88
<url>https://aws.amazon.com/lambda</url>
9-
<version>0.3-SNAPSHOT</version>
9+
<version>0.4-SNAPSHOT</version>
1010

1111
<parent>
1212
<groupId>com.amazonaws.serverless</groupId>
1313
<artifactId>aws-serverless-java-container</artifactId>
14-
<version>0.3-SNAPSHOT</version>
14+
<version>0.4-SNAPSHOT</version>
1515
</parent>
1616

1717
<properties>
@@ -24,7 +24,7 @@
2424
<dependency>
2525
<groupId>com.amazonaws.serverless</groupId>
2626
<artifactId>aws-serverless-java-container-core</artifactId>
27-
<version>0.3-SNAPSHOT</version>
27+
<version>0.4-SNAPSHOT</version>
2828
</dependency>
2929

3030
<!-- https://mvnrepository.com/artifact/com.sparkjava/spark-core -->

aws-serverless-java-container-spring/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 - Spring implementation</name>
77
<description>Allows Java applications written for the Spring framework to run in AWS Lambda</description>
88
<url>https://aws.amazon.com/lambda</url>
9-
<version>0.3-SNAPSHOT</version>
9+
<version>0.4-SNAPSHOT</version>
1010

1111
<parent>
1212
<groupId>com.amazonaws.serverless</groupId>
1313
<artifactId>aws-serverless-java-container</artifactId>
14-
<version>0.3-SNAPSHOT</version>
14+
<version>0.4-SNAPSHOT</version>
1515
</parent>
1616

1717
<properties>
@@ -24,7 +24,7 @@
2424
<dependency>
2525
<groupId>com.amazonaws.serverless</groupId>
2626
<artifactId>aws-serverless-java-container-core</artifactId>
27-
<version>0.3-SNAPSHOT</version>
27+
<version>0.4-SNAPSHOT</version>
2828
</dependency>
2929

3030
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->

0 commit comments

Comments
 (0)