From 434f6ac5dcca2aa7392df46173fa53cee1eec204 Mon Sep 17 00:00:00 2001 From: fred-b Date: Fri, 5 May 2017 14:33:41 +0200 Subject: [PATCH 0001/1214] Take into account the new `path` field. Hi, ApiGateway provides an additional field. I believe it is related to x-ray but I can't be sure. It would be nice to expose it though, so lambda code can take advantage of it. --- .../proxy/internal/model/ApiGatewayRequestContext.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java index 406fbad0..b91305ac 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java @@ -35,6 +35,7 @@ public class ApiGatewayRequestContext { private ApiGatewayRequestIdentity identity; private ApiGatewayAuthorizerContext authorizer; private String stage; + private String path; //------------------------------------------------------------- @@ -119,6 +120,15 @@ public String getStage() { public void setStage(String stage) { this.stage = stage; } + + public String getPath() { + return path; + } + + + public void setPath(String path) { + this.path = path; + } public ApiGatewayAuthorizerContext getAuthorizer() { From b49b932ffc867b901cea131d8e1090e4f8235a14 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 19 Jun 2017 18:17:42 -0700 Subject: [PATCH 0002/1214] Addresses issues #35 and #37 * Basic implementation of RequestDispatcher for AwsProxyRequest type * More unit tests for multipart uploads and filters * Servlet Context as well as request injection for Jersey --- aws-serverless-java-container-core/pom.xml | 9 ++ .../internal/LambdaContainerHandler.java | 8 +- .../servlet/AwsHttpServletRequest.java | 30 ++++++- .../servlet/AwsHttpServletResponse.java | 1 + .../AwsLambdaServletContainerHandler.java | 88 +++++++++++++++---- .../servlet/AwsProxyHttpServletRequest.java | 11 ++- .../AwsProxyHttpServletRequestReader.java | 4 + .../servlet/AwsProxyRequestDispatcher.java | 88 +++++++++++++++++++ .../internal/servlet/AwsServletContext.java | 31 +++---- .../servlet/AwsFilterChainManagerTest.java | 13 +-- .../AwsProxyHttpServletRequestFormTest.java | 69 +++++++++++++++ .../AwsProxyHttpServletRequestTest.java | 8 +- .../internal/servlet/FilterHolderTest.java | 2 +- .../AwsProxyServletRequestFactory.java | 5 +- .../spring/SpringLambdaContainerHandler.java | 13 +-- .../spring/SpringServletContextTest.java | 3 + .../proxy/spring/StaticAppProxyTest.java | 32 +++++++ .../proxy/spring/echoapp/EchoResource.java | 2 +- .../spring/echoapp/EchoSpringAppConfig.java | 3 + .../proxy/spring/staticapp/LambdaHandler.java | 37 ++++++++ .../proxy/spring/staticapp/MyController.java | 16 ++++ .../src/test/resources/staticAppContext.xml | 39 ++++++++ .../src/test/resources/templates/sample.html | 5 ++ samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- .../sample/spring/LambdaHandler.java | 4 +- .../sample/spring/PetsController.java | 4 +- .../sample/spring/StreamLambdaHandler.java | 3 - 29 files changed, 464 insertions(+), 70 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java create mode 100755 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java create mode 100755 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java create mode 100755 aws-serverless-java-container-spring/src/test/resources/staticAppContext.xml create mode 100755 aws-serverless-java-container-spring/src/test/resources/templates/sample.html diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a2d09710..d5de7842 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -65,6 +65,15 @@ 1.10.19 test + + + + org.apache.httpcomponents + httpmime + 4.5.3 + test + + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index bff64b9a..aed34c08 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -46,6 +46,9 @@ public abstract class LambdaContainerHandler exceptionHandler; + protected Context lambdaContext; + + //------------------------------------------------------------- // Constructors //------------------------------------------------------------- @@ -85,6 +88,7 @@ protected abstract void handleRequest(ContainerRequestType containerRequest, Con * @return A valid response type */ public ResponseType proxy(RequestType request, Context context) { + lambdaContext = context; try { SecurityContext securityContext = securityContextWriter.writeSecurityContext(request, context); CountDownLatch latch = new CountDownLatch(1); @@ -98,10 +102,6 @@ public ResponseType proxy(RequestType request, Context context) { return responseWriter.writeResponse(containerResponse, context); } catch (Exception e) { context.getLogger().log("Error while handling request: " + e.getMessage()); - - /*for (StackTraceElement el : e.getStackTrace()) { - context.getLogger().log(el.toString()); - }*/ e.printStackTrace(); return exceptionHandler.handle(e); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 53106fd8..221c6483 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -23,7 +23,13 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; @@ -56,6 +62,9 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private Context lambdaContext; private Map attributes; + private ServletContext servletContext; + + protected DispatcherType dispatcherType; //------------------------------------------------------------- @@ -72,6 +81,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { attributes = new HashMap<>(); } + //------------------------------------------------------------- // Implementation - HttpServletRequest //------------------------------------------------------------- @@ -119,6 +129,7 @@ public boolean isRequestedSessionIdFromURL() { @Override + @Deprecated public boolean isRequestedSessionIdFromUrl() { return false; } @@ -185,7 +196,7 @@ public int getLocalPort() { @Override public ServletContext getServletContext() { - return AwsServletContext.getInstance(lambdaContext); + return servletContext; } @@ -213,6 +224,19 @@ public DispatcherType getDispatcherType() { } + //------------------------------------------------------------- + // Methods - Getter/Setter + //------------------------------------------------------------- + + public void setDispatcherType(DispatcherType type) { + dispatcherType = type; + } + + public void setServletContext(ServletContext context) { + servletContext = context; + } + + //------------------------------------------------------------- // Methods - Protected //------------------------------------------------------------- @@ -223,7 +247,6 @@ public DispatcherType getDispatcherType() { * @return An array of Cookie objects from the header */ protected Cookie[] parseCookieHeaderValue(String headerValue) { - List> parsedHeaders = this.parseHeaderValue(headerValue); return parsedHeaders.stream() @@ -232,6 +255,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { .toArray(Cookie[]::new); } + /** * Given a map of key/values query string parameters from API Gateway, creates a query string as it would have * been in the original url. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 871f7975..cbe5e2cb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -188,6 +188,7 @@ public void setStatus(int i) { @Override + @Deprecated public void setStatus(int i, String s) { statusCode = i; statusMessage = s; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 82d73b20..75db82f5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -17,9 +17,12 @@ import com.amazonaws.serverless.proxy.internal.RequestReader; import com.amazonaws.serverless.proxy.internal.ResponseWriter; import com.amazonaws.serverless.proxy.internal.SecurityContextWriter; +import com.amazonaws.services.lambda.runtime.Context; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -28,6 +31,8 @@ * Abstract extension of the code LambdaContainerHandler object that adds protected variables for the * ServletContext and FilterChainManager. This object should be extended by the framework-specific * implementations that want to support the servlet 3.1 specs. + * + * Because Lambda only allows one event per container at a time, this object also acts as the RequestDispatcher * @param * @param * @param @@ -42,14 +47,13 @@ public abstract class AwsLambdaServletContainerHandler filterChainManager; //------------------------------------------------------------- @@ -63,30 +67,43 @@ protected AwsLambdaServletContainerHandler(RequestReaderAwsProxyRequestDispatcher object + * @param servletRequest The modified request object with the new request path + * @param servletResponse The original servlet response + * @throws ServletException + * @throws IOException */ - public ServletContext getServletContext() { - return servletContext; + public void forward(ContainerRequestType servletRequest, ContainerResponseType servletResponse) + throws ServletException, IOException { + try { + handleRequest(servletRequest, servletResponse, lambdaContext); + } catch (Exception e) { + e.printStackTrace(); + throw new ServletException(e); + } } /** - * Sets the ServletContext in the handler and initialized a new FilterChainManager - * @param context An initialized ServletContext + * Includes a request to the existing framework container. This is called by the AwsProxyRequestDispatcher object + * @param servletRequest The modified request object with the new request path + * @param servletResponse The original servlet response + * @throws ServletException + * @throws IOException */ - protected void setServletContext(final ServletContext context) { - servletContext = context; - // We assume custom implementations of the RequestWriter for HttpServletRequest will reuse - // the existing AwsServletContext object since it has no dependencies other than the Lambda context - filterChainManager = new AwsFilterChainManager((AwsServletContext)context); + public void include(ContainerRequestType servletRequest, ContainerResponseType servletResponse) + throws ServletException, IOException { + try { + handleRequest(servletRequest, servletResponse, lambdaContext); + } catch (Exception e) { + e.printStackTrace(); + throw new ServletException(e); + } } @@ -111,6 +128,43 @@ public void onStartup(final StartupHandler h) { startupHandler = h; } + @Override + protected void handleRequest(ContainerRequestType containerRequest, ContainerResponseType containerResponse, Context lambdaContext) + throws Exception { + // The servlet context should not be linked to a specific request object, only to the Lambda + // context so we only set it once. + // TODO: In the future, if we decide to support multiple servlets/contexts in an instance we only need to modify this method + if (getServletContext() == null) { + setServletContext(new AwsServletContext(lambdaContext, this)); + } + } + + + //------------------------------------------------------------- + // Methods - Getter/Setter + //------------------------------------------------------------- + + /** + * Returns the current ServletContext. If the framework implementation does not set the value for + * servlet context this method will return null. + * @return The initialized servlet context if the framework-specific implementation requires one, otherwise null + */ + public ServletContext getServletContext() { + return servletContext; + } + + + /** + * Sets the ServletContext in the handler and initialized a new FilterChainManager + * @param context An initialized ServletContext + */ + protected void setServletContext(final ServletContext context) { + servletContext = context; + // We assume custom implementations of the RequestWriter for HttpServletRequest will reuse + // the existing AwsServletContext object since it has no dependencies other than the Lambda context + filterChainManager = new AwsFilterChainManager((AwsServletContext)context); + } + //------------------------------------------------------------- // Methods - Protected diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index c11111a7..22658f3d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -18,6 +18,7 @@ import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.AsyncContext; @@ -89,6 +90,10 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.multipartFormParameters = getMultipartFormParametersMap(); } + public AwsProxyRequest getAwsProxyRequest() { + return this.request; + } + //------------------------------------------------------------- // Implementation - HttpServletRequest @@ -579,11 +584,11 @@ public boolean isSecure() { @Override public RequestDispatcher getRequestDispatcher(String s) { - return null; + return getServletContext().getRequestDispatcher(s); } - @Override + @Deprecated public String getRealPath(String s) { // we are in an archive on a remote server return null; @@ -655,7 +660,7 @@ private Map getMultipartFormParametersMap() { Map output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - ServletFileUpload upload = new ServletFileUpload(); + ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); try { List items = upload.parseRequest(this); for (FileItem item : items) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 3358e270..e5e381b2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -36,9 +36,13 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext()); servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables()); servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext); + return servletRequest; } + //------------------------------------------------------------- + // Methods - Protected + //------------------------------------------------------------- @Override protected Class getRequestClass() { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java new file mode 100644 index 00000000..7e4b2299 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -0,0 +1,88 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; + +import javax.servlet.DispatcherType; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + + +/** + * Default RequestDispatcher implementation for the AwsProxyHttpServletRequest type. A new + * instance of this object is created each time a framework gets the RequestDispatcher from a servlet request. Behind + * the scenes, this object uses the AwsLambdaServletContainerHandler to send FORWARD and INCLUDE requests + * to the framework. + */ +public class AwsProxyRequestDispatcher implements RequestDispatcher { + + //------------------------------------------------------------- + // Variables - Private + //------------------------------------------------------------- + + private String dispatchPath; + private AwsLambdaServletContainerHandler lambdaContainerHandler; + + //------------------------------------------------------------- + // Constructors + //------------------------------------------------------------- + + + public AwsProxyRequestDispatcher(final String path, final AwsLambdaServletContainerHandler handler) { + if (!path.startsWith("/")) { + throw new UnsupportedOperationException("Only dispatchers with absolute paths are supported"); + } + + dispatchPath = path; + lambdaContainerHandler = handler; + } + + //------------------------------------------------------------- + // Implementation - RequestDispatcher + //------------------------------------------------------------- + + + @Override + @SuppressWarnings("unchecked") + public void forward(ServletRequest servletRequest, ServletResponse servletResponse) + throws ServletException, IOException { + if (!(servletRequest instanceof AwsProxyHttpServletRequest)) { + throw new IOException("Invalid request type: " + servletRequest.getClass().getSimpleName() + ". Only AwsProxyHttpServletRequest is supported"); + } + + if (lambdaContainerHandler == null) { + throw new IOException("Null container handler in dispatcher"); + } + + ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.FORWARD); + ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath); + + lambdaContainerHandler.forward((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse); + } + + + @Override + @SuppressWarnings("unchecked") + public void include(ServletRequest servletRequest, ServletResponse servletResponse) + throws ServletException, IOException { + if (!(servletRequest instanceof AwsProxyHttpServletRequest)) { + throw new IOException("Invalid request type: " + servletRequest.getClass().getSimpleName() + ". Only AwsProxyHttpServletRequest is supported"); + } + + if (lambdaContainerHandler == null) { + throw new IOException("Null container handler in dispatcher"); + } + + ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.INCLUDE); + ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath); + + lambdaContainerHandler.include((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse); + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index fdadce13..76c4b2eb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -67,6 +67,7 @@ public class AwsServletContext private Context lambdaContext; private Map attributes; private Map initParameters; + private AwsLambdaServletContainerHandler containerHandler; //------------------------------------------------------------- @@ -79,9 +80,9 @@ public class AwsServletContext // Constructors //------------------------------------------------------------- - private AwsServletContext(Context lambdaContext) { + public AwsServletContext(Context lambdaContext, AwsLambdaServletContainerHandler containerHandler) { this.lambdaContext = lambdaContext; - + this.containerHandler = containerHandler; this.attributes = new HashMap<>(); this.initParameters = new HashMap<>(); this.filters = new LinkedHashMap<>(); @@ -92,16 +93,6 @@ private AwsServletContext(Context lambdaContext) { // Implementation - ServletContext //------------------------------------------------------------- - - public static ServletContext getInstance(Context lambdaContext) { - if (instance == null) { - instance = new AwsServletContext(lambdaContext); - } - - return instance; - } - - public static void clearServletContextCache() { instance = null; } @@ -178,33 +169,34 @@ public InputStream getResourceAsStream(String s) { @Override public RequestDispatcher getRequestDispatcher(String s) { - // TODO: This should be part of the reader interface described in the getResourcePaths method - return null; + return new AwsProxyRequestDispatcher(s, containerHandler); } @Override public RequestDispatcher getNamedDispatcher(String s) { - // TODO: This should be part of the reader interface described in the getResourcePaths method - return null; + throw new UnsupportedOperationException(); } @Override + @Deprecated public Servlet getServlet(String s) throws ServletException { - return null; + throw new UnsupportedOperationException(); } @Override + @Deprecated public Enumeration getServlets() { - return null; + throw new UnsupportedOperationException(); } @Override + @Deprecated public Enumeration getServletNames() { - return null; + throw new UnsupportedOperationException(); } @@ -215,6 +207,7 @@ public void log(String s) { @Override + @Deprecated public void log(Exception e, String s) { lambdaContext.getLogger().log(s); lambdaContext.getLogger().log(e.getMessage()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index e0dad89a..102ba833 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -17,19 +17,20 @@ public class AwsFilterChainManagerTest { private static AwsFilterChainManager chainManager; private static Context lambdaContext = new MockLambdaContext(); + private static ServletContext servletContext; @BeforeClass public static void setUp() { - ServletContext context = AwsServletContext.getInstance(lambdaContext); + servletContext = new AwsServletContext(lambdaContext, null);//AwsServletContext.getInstance(lambdaContext, null); - FilterRegistration.Dynamic reg = context.addFilter("Filter1", new MockFilter()); + FilterRegistration.Dynamic reg = servletContext.addFilter("Filter1", new MockFilter()); reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/first/second"); - FilterRegistration.Dynamic reg2 = context.addFilter("Filter2", new MockFilter()); + FilterRegistration.Dynamic reg2 = servletContext.addFilter("Filter2", new MockFilter()); reg2.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/second/*"); - FilterRegistration.Dynamic reg3 = context.addFilter("Filter3", new MockFilter()); + FilterRegistration.Dynamic reg3 = servletContext.addFilter("Filter3", new MockFilter()); reg3.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/third/fourth/*"); - chainManager = new AwsFilterChainManager((AwsServletContext) context); + chainManager = new AwsFilterChainManager((AwsServletContext) servletContext); } @Test @@ -106,6 +107,7 @@ public void filterChain_getFilterChain_subsetOfFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); + req.setServletContext(servletContext); FilterChainHolder fcHolder = chainManager.getFilterChain(req); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); @@ -130,6 +132,7 @@ public void filterChain_getFilterChain_multipleFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/second/important", "GET").build(), lambdaContext, null ); + req.setServletContext(servletContext); FilterRegistration.Dynamic reg = req.getServletContext().addFilter("Filter4", new MockFilter()); reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/second/*"); FilterChainHolder fcHolder = chainManager.getFilterChain(req); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java new file mode 100644 index 00000000..8186de53 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; + +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.junit.Test; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + + +public class AwsProxyHttpServletRequestFormTest { + private static final String PART_KEY_1 = "test1"; + private static final String PART_VALUE_1 = "value1"; + private static final String PART_KEY_2 = "test2"; + private static final String PART_VALUE_2 = "value2"; + + private static final HttpEntity SIMPLE_FORM_DATA = MultipartEntityBuilder.create() + .addTextBody(PART_KEY_1, PART_VALUE_1) + .addTextBody(PART_KEY_2, PART_VALUE_2) + .build(); + @Test + public void postForm_getParts_parsing() { + try { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") + .header(SIMPLE_FORM_DATA.getContentType().getName(), SIMPLE_FORM_DATA.getContentType().getValue()) + //.header(formData.getContentEncoding().getName(), formData.getContentEncoding().getValue()) + .body(IOUtils.toString(SIMPLE_FORM_DATA.getContent())) + .build(); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + assertNotNull(request.getParts()); + assertEquals(2, request.getParts().size()); + assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream())); + assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream())); + } catch (IOException | ServletException e) { + fail(e.getMessage()); + } + } + + @Test + public void getForm_getParts_exception() { + try { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "GET") + .header(SIMPLE_FORM_DATA.getContentType().getName(), SIMPLE_FORM_DATA.getContentType().getValue()) + //.header(formData.getContentEncoding().getName(), formData.getContentEncoding().getValue()) + .body(IOUtils.toString(SIMPLE_FORM_DATA.getContent())) + .build(); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + assertNotNull(request.getParts()); + assertEquals(0, request.getParts().size()); + } catch (IOException | ServletException e) { + fail(e.getMessage()); + } + } + + // TODO: Multipart tests +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index d9ddc313..c7884a6e 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -2,12 +2,18 @@ import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; + +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.Test; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.List; @@ -170,7 +176,7 @@ public void queryParameters_getParameterNames_null() { } @Test - public void queryParameters_getParameterNames_nonNull() { + public void queryParameters_getParameterNames_notNull() { HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_QUERY, null, null); List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java index 31461d06..2403207a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java @@ -12,7 +12,7 @@ public class FilterHolderTest { @Test public void annotation_filterRegistration_pathValidator() { - FilterHolder holder = new FilterHolder(new UrlPathValidator(), AwsServletContext.getInstance(lambdaContext)); + FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(lambdaContext, null)); assertTrue(holder.isAnnotated()); assertNotEquals(UrlPathValidator.class.getName(), holder.getRegistration().getName()); diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java index 667d5326..d44ed313 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java @@ -17,6 +17,7 @@ import com.amazonaws.serverless.proxy.internal.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.jersey.JerseyAwsProxyRequestReader; import org.glassfish.hk2.api.Factory; @@ -62,9 +63,11 @@ public void dispose(HttpServletRequest httpServletRequest) { public static HttpServletRequest getRequest() { try { - return requestReader.readRequest(JerseyAwsProxyRequestReader.getCurrentRequest(), + AwsProxyHttpServletRequest req = requestReader.readRequest(JerseyAwsProxyRequestReader.getCurrentRequest(), AwsProxySecurityContextWriter.getCurrentContext(), JerseyAwsProxyRequestReader.getCurrentLambdaContext()); + req.setServletContext(new AwsServletContext(JerseyAwsProxyRequestReader.getCurrentLambdaContext(), null)); + return req; } catch (InvalidRequestEventException e) { e.printStackTrace(); return null; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 3a911d18..faacbd46 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -117,21 +117,24 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null); } + // this method of the AwsLambdaServletContainerHandler sets the request context + super.handleRequest(containerRequest, containerResponse, lambdaContext); + // wire up the application context on the first invocation if (!initialized) { - // The servlet context should not be linked to a specific request object, only to the Lambda - // context so we only set it once. - setServletContext(containerRequest.getServletContext()); - initializer.onStartup(this.servletContext); + + initializer.onStartup(getServletContext()); // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { - startupHandler.onStartup(this.servletContext); + startupHandler.onStartup(getServletContext()); } initialized = true; } + containerRequest.setServletContext(getServletContext()); + // process filters doFilter(containerRequest, containerResponse); // invoke servlet diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 942e2062..075db5bb 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -12,10 +12,13 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.ValidatedUserModel; import org.junit.BeforeClass; import org.junit.Test; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; +import javax.ws.rs.core.MediaType; + import java.util.EnumSet; import static org.junit.Assert.*; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java new file mode 100644 index 00000000..37cde971 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -0,0 +1,32 @@ +package com.amazonaws.serverless.proxy.spring; + + +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.spring.staticapp.LambdaHandler; + +import org.junit.Test; +import org.springframework.http.HttpHeaders; + +import javax.ws.rs.core.MediaType; + +import static org.junit.Assert.*; + + +public class StaticAppProxyTest { + + private LambdaHandler lambdaHandler = new LambdaHandler(); + + @Test + public void staticPage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/sample/page", "GET").build(); + AwsProxyResponse resp = lambdaHandler.handleRequest(req, new MockLambdaContext()); + + assertEquals(200, resp.getStatusCode()); + assertTrue(resp.getBody().startsWith("")); + assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.TEXT_HTML, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 486d67c2..553116cb 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -8,7 +8,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.context.ServletContextAware; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import javax.servlet.ServletContext; @@ -110,4 +109,5 @@ public SingleValueModel echoRequestURL(HttpServletRequest request) { return valueModel; } + } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index 230ec4bd..93134c1b 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -5,6 +5,7 @@ import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -12,6 +13,7 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.web.context.ConfigurableWebApplicationContext; + @Configuration @ComponentScan("com.amazonaws.serverless.proxy.spring.echoapp") @PropertySource("classpath:application.properties") @@ -24,6 +26,7 @@ public class EchoSpringAppConfig { public SpringLambdaContainerHandler springLambdaContainerHandler() throws ContainerInitializationException { SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext); handler.setRefreshContext(false); + return handler; } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java new file mode 100755 index 00000000..101c63fa --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java @@ -0,0 +1,37 @@ + package com.amazonaws.serverless.proxy.spring.staticapp; + + + import com.amazonaws.serverless.exceptions.ContainerInitializationException; + import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; + import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; + import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; + import com.amazonaws.services.lambda.runtime.Context; + import com.amazonaws.services.lambda.runtime.RequestHandler; + + import org.springframework.web.context.support.XmlWebApplicationContext; + + + public class LambdaHandler + implements RequestHandler + { + SpringLambdaContainerHandler handler; + boolean isinitialized = false; + + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) + { + if (!isinitialized) { + isinitialized = true; + try { + XmlWebApplicationContext wc = new XmlWebApplicationContext(); + wc.setConfigLocation("classpath:/staticAppContext.xml"); + handler = SpringLambdaContainerHandler.getAwsProxyHandler(wc); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + return null; + } + } + AwsProxyResponse res = handler.proxy(awsProxyRequest, context); + return res; + } + } + diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java new file mode 100755 index 00000000..d4dffc37 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java @@ -0,0 +1,16 @@ +package com.amazonaws.serverless.proxy.spring.staticapp; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + + +@EnableWebMvc +@Controller +public class MyController { + + @RequestMapping({ "/sample/page" }) + public String showPage() { + return "sample"; + } +} diff --git a/aws-serverless-java-container-spring/src/test/resources/staticAppContext.xml b/aws-serverless-java-container-spring/src/test/resources/staticAppContext.xml new file mode 100755 index 00000000..712f48c0 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/resources/staticAppContext.xml @@ -0,0 +1,39 @@ + + + + + + + classpath:application.properties + + + + + + + + + + + /templates/ + + + .html + + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-java-container-spring/src/test/resources/templates/sample.html b/aws-serverless-java-container-spring/src/test/resources/templates/sample.html new file mode 100755 index 00000000..cec03da0 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/resources/templates/sample.html @@ -0,0 +1,5 @@ + + +hello world + + \ No newline at end of file diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index f380e7bc..1080e3ca 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - LATEST + [0.1,) diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 25a91287..4d78fb9c 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - LATEST + [0.1,) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index b1253302..5f6db931 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - LATEST + [0.1,) diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java index f5cf4473..af0545fe 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java @@ -19,9 +19,7 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -/** - * Created by bulianis on 12/13/16. - */ + public class LambdaHandler implements RequestHandler { private SpringLambdaContainerHandler handler; diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java index 9d866041..df622b10 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import java.security.Principal; import java.util.Optional; import java.util.UUID; @@ -35,7 +36,8 @@ public Pet createPet(@RequestBody Pet newPet) { } @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit) { + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + System.out.println(principal.getName()); int queryLimit = 10; if (limit.isPresent()) { queryLimit = limit.get(); diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index c4bafd05..29647d9b 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -15,9 +15,6 @@ import java.io.OutputStream; -/** - * Created by bulianis on 5/2/17. - */ public class StreamLambdaHandler implements RequestStreamHandler { private SpringLambdaContainerHandler handler; private static ObjectMapper mapper = new ObjectMapper(); From 0c7e579d00f69ea27c3cf19d5189741481631dc4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Jun 2017 11:29:25 -0700 Subject: [PATCH 0003/1214] Added more unit tests and addressed issue #34 Added the `stripBasePath(String)` method to the LambdaContainerHandler object. --- .../internal/LambdaContainerHandler.java | 11 +++- .../proxy/internal/RequestReader.java | 30 +++++++++- .../proxy/internal/model/ContainerConfig.java | 56 +++++++++++++++++++ .../servlet/AwsProxyHttpServletRequest.java | 2 +- .../AwsProxyHttpServletRequestReader.java | 4 +- .../testutils/AwsProxyRequestBuilder.java | 9 +++ .../proxy/internal/RequestReaderTest.java | 56 +++++++++++++++++++ .../AwsProxyHttpServletRequestFormTest.java | 54 ++++++++++++++---- .../AwsProxyHttpServletRequestReaderTest.java | 3 +- .../jersey/JerseyAwsProxyRequestReader.java | 28 ++-------- 10 files changed, 213 insertions(+), 40 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/RequestReaderTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index aed34c08..db045a58 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal; +import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; @@ -45,9 +46,10 @@ public abstract class LambdaContainerHandler securityContextWriter; private ExceptionHandler exceptionHandler; - protected Context lambdaContext; + private ContainerConfig config = ContainerConfig.defaultConfig(); + //------------------------------------------------------------- // Constructors @@ -79,6 +81,11 @@ protected abstract void handleRequest(ContainerRequestType containerRequest, Con // Methods - Public //------------------------------------------------------------- + public void stripBasePath(String basePath) { + config.setStripBasePath(true); + config.setServiceBasePath(basePath); + } + /** * Proxies requests to the underlying container given the incoming Lambda request. This method returns a populated * return object for the Lambda function. @@ -93,7 +100,7 @@ public ResponseType proxy(RequestType request, Context context) { SecurityContext securityContext = securityContextWriter.writeSecurityContext(request, context); CountDownLatch latch = new CountDownLatch(1); ContainerResponseType containerResponse = getContainerResponse(latch); - ContainerRequestType containerRequest = requestReader.readRequest(request, securityContext, context); + ContainerRequestType containerRequest = requestReader.readRequest(request, securityContext, context, config); handleRequest(containerRequest, containerResponse, context); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java index 973f6f98..198e33e8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java @@ -14,6 +14,7 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; @@ -67,9 +68,36 @@ public abstract class RequestReader { * @return A valid request object for the underlying container * @throws InvalidRequestEventException This exception is thrown if anything goes wrong during the creation of the request object */ - protected abstract ContainerRequestType readRequest(RequestType request, SecurityContext securityContext, Context lambdaContext) + protected abstract ContainerRequestType readRequest(RequestType request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException; protected abstract Class getRequestClass(); + + + //------------------------------------------------------------- + // Methods - Protected + //------------------------------------------------------------- + + /** + * Strips the base path from the request path if the container configuration object requires it + * @param requestPath The incoming request path + * @param config The container configuration object + * @return The final request path + */ + protected String stripBasePath(String requestPath, ContainerConfig config) { + if (!config.isStripBasePath()) { + return requestPath; + } + + if (requestPath.startsWith(config.getServiceBasePath())) { + String newRequestPath = requestPath.replaceFirst(config.getServiceBasePath(), ""); + if (!newRequestPath.startsWith("/")) { + newRequestPath = "/" + newRequestPath; + } + return newRequestPath; + } + + return requestPath; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java new file mode 100644 index 00000000..54df45a6 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java @@ -0,0 +1,56 @@ +package com.amazonaws.serverless.proxy.internal.model; + + +/** + * Configuration paramters used by the RequestReader and ResponseWriter objects. + */ +public class ContainerConfig { + + public static ContainerConfig defaultConfig() { + ContainerConfig configuration = new ContainerConfig(); + configuration.setStripBasePath(false); + + return configuration; + } + + //------------------------------------------------------------- + // Variables - Private + //------------------------------------------------------------- + + private String serviceBasePath; + private boolean stripBasePath; + + + //------------------------------------------------------------- + // Methods - Getter/Setter + //------------------------------------------------------------- + + public String getServiceBasePath() { + return serviceBasePath; + } + + + public void setServiceBasePath(String serviceBasePath) { + // clean up base path before setting it, we want a "/" at the beginning but not at the end. + String finalBasePath = serviceBasePath; + if (!finalBasePath.startsWith("/")) { + finalBasePath = "/" + serviceBasePath; + } + if (finalBasePath.endsWith("/")) { + finalBasePath = finalBasePath.substring(0, finalBasePath.length() - 1); + } + this.serviceBasePath = finalBasePath; + } + + + public boolean isStripBasePath() { + return stripBasePath; + } + + + public void setStripBasePath(boolean stripBasePath) { + this.stripBasePath = stripBasePath; + } + + +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 22658f3d..5accb191 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -380,7 +380,7 @@ public String getContentType() { public ServletInputStream getInputStream() throws IOException { byte[] bodyBytes = request.getBody().getBytes(); if (request.isBase64Encoded()) { - bodyBytes = Base64.getDecoder().decode(request.getBody()); + bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); } ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); return new ServletInputStream() { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index e5e381b2..469c4ce6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -15,6 +15,7 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.internal.RequestReader; import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; @@ -30,8 +31,9 @@ public class AwsProxyHttpServletRequestReader extends RequestReader { - //------------------------------------------------------------- - // Variables - Private - //------------------------------------------------------------- - - private boolean useStageAsBasePath = false; - - //------------------------------------------------------------- // Variables - Private - Static //------------------------------------------------------------- @@ -69,14 +63,16 @@ public class JerseyAwsProxyRequestReader extends RequestReaderfalse - * @param useStageAsBasePath True if the stage name should be included in the request path, false otherwise - */ - public void setUseStageAsBasePath(boolean useStageAsBasePath) { - this.useStageAsBasePath = useStageAsBasePath; - } - - //------------------------------------------------------------- // Methods - Protected //------------------------------------------------------------- From 54104b499c69ec222bf891d896554de9000bdc7b Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Jun 2017 11:48:10 -0700 Subject: [PATCH 0004/1214] More unit tests and final fixes Changed the ContainerConfig property to be static --- .../internal/LambdaContainerHandler.java | 29 ++++++++++++++++++- .../proxy/internal/RequestReaderTest.java | 21 ++++++++++++++ .../AwsProxyHttpServletRequestReaderTest.java | 2 +- .../AwsProxyServletRequestFactory.java | 7 +++-- 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index db045a58..f924576d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -37,6 +37,7 @@ public abstract class LambdaContainerHandler Date: Tue, 20 Jun 2017 13:19:08 -0700 Subject: [PATCH 0005/1214] Minor Javadoc changes and fixes --- .../proxy/internal/LambdaContainerHandler.java | 2 +- .../serverless/proxy/internal/RequestReader.java | 1 + .../internal/model/ApiGatewayAuthorizerContext.java | 12 +++++------- .../internal/servlet/AwsHttpServletRequest.java | 2 +- .../servlet/AwsLambdaServletContainerHandler.java | 12 ++++++------ .../proxy/internal/servlet/FilterHolder.java | 6 +++--- .../proxy/jersey/JerseyAwsProxyRequestReader.java | 1 + .../proxy/jersey/JerseyLambdaContainerHandler.java | 6 +++++- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index f924576d..42edfaaf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -136,7 +136,7 @@ public ResponseType proxy(RequestType request, Context context) { /** * Returns the current container configuration object. - * @return + * @return The container configuration object */ public static ContainerConfig getContainerConfig() { return config; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java index 198e33e8..fcd7dacf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java @@ -65,6 +65,7 @@ public abstract class RequestReader { * @param request The incoming request object * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.internal.SecurityContextWriter) * @param lambdaContext The AWS Lambda context for the request + * @param config The container configuration object. This is passed in by the LambdaContainerHandler. * @return A valid request object for the underlying container * @throws InvalidRequestEventException This exception is thrown if anything goes wrong during the creation of the request object */ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java index 9cf189a7..e8d95de0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java @@ -21,13 +21,11 @@ /** * Context object used for custom authorizers and Cognito User Pool authorizers. - *

- * Custom authorizers populate the principalId field. All other custom values - * returned by the authorizer are accessible via the getContextValue method. - *

- *

- * Cognito User Pool authorizers populate the

claims
object. - *

+ * + * Custom authorizers populate the principalId field. All other custom values + * returned by the authorizer are accessible via the getContextValue method. + * + * Cognito User Pool authorizers populate the claims object. */ public class ApiGatewayAuthorizerContext { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 221c6483..32f2fcf7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -259,7 +259,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { /** * Given a map of key/values query string parameters from API Gateway, creates a query string as it would have * been in the original url. - * @param parameters A Map of query string parameters + * @param parameters A Map<String, String> of query string parameters * @return The generated query string for the URI */ protected String generateQueryString(Map parameters) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 75db82f5..14fb1b85 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -21,8 +21,6 @@ import javax.servlet.ServletContext; import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -33,10 +31,10 @@ * implementations that want to support the servlet 3.1 specs. * * Because Lambda only allows one event per container at a time, this object also acts as the RequestDispatcher - * @param - * @param - * @param - * @param + * @param The expected request object. This is the model class that the event JSON is de-serialized to + * @param The expected Lambda function response object. Responses from the container will be written to this model object + * @param The request type for the wrapped Java container + * @param The response or response writer type for the wrapped Java container */ public abstract class AwsLambdaServletContainerHandler getInitParameters() { return initParameters; @@ -153,7 +153,7 @@ public Map getInitParameters() { /** * The servlet context that initialized the filter - * @return + * @return The servlet context the filter was initialized on */ public ServletContext getServletContext() { return servletContext; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java index 6b70c65b..959c77c2 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java @@ -59,6 +59,7 @@ public class JerseyAwsProxyRequestReader extends RequestReader ge /** * Private constructor for a LambdaContainer. Sets the application object, sets the ApplicationHandler, * and initializes the application using the onStartup method. - * @param jaxRsApplication A Jersey application instance. + * @param requestReader A request reader instance + * @param responseWriter A response writer instance + * @param securityContextWriter A security context writer object + * @param exceptionHandler An exception handler + * @param jaxRsApplication The JaxRs application */ public JerseyLambdaContainerHandler(RequestReader requestReader, ResponseWriter responseWriter, From dc7ce26a8180aae3d188c3dbfc7c47f5a16761ad Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Jun 2017 13:22:28 -0700 Subject: [PATCH 0006/1214] [maven-release-plugin] prepare release aws-serverless-java-container-0.5 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index d5de7842..e940bf2b 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.5-SNAPSHOT + 0.5 com.amazonaws.serverless aws-serverless-java-container - 0.5-SNAPSHOT + 0.5 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 87853317..49f96f80 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.5-SNAPSHOT + 0.5 com.amazonaws.serverless aws-serverless-java-container - 0.5-SNAPSHOT + 0.5 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5-SNAPSHOT + 0.5 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9de3a875..5bf6aac0 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.5-SNAPSHOT + 0.5 com.amazonaws.serverless aws-serverless-java-container - 0.5-SNAPSHOT + 0.5 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5-SNAPSHOT + 0.5 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b435c5f9..1e7c3204 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.5-SNAPSHOT + 0.5 com.amazonaws.serverless aws-serverless-java-container - 0.5-SNAPSHOT + 0.5 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5-SNAPSHOT + 0.5 diff --git a/pom.xml b/pom.xml index 225d83d3..35b80579 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.5-SNAPSHOT + 0.5 AWS Serverless Java container From 8fe9a1a9a94282fa7e8d7bba03a458572d728a46 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Jun 2017 13:22:29 -0700 Subject: [PATCH 0007/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index e940bf2b..8f451768 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.5 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 49f96f80..f195791f 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.5 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5bf6aac0..a80a8b6f 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.5 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1e7c3204..3b919d3f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.5 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5 + 0.6-SNAPSHOT diff --git a/pom.xml b/pom.xml index 35b80579..2bd44b64 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.5 + 0.6-SNAPSHOT AWS Serverless Java container From 05a50583aa284f820b1de64aefa47dd9b607bd1a Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 21 Jun 2017 08:04:11 -0700 Subject: [PATCH 0008/1214] Bumped version in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a081b4d7..4f9801db 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to com.amazonaws.serverless aws-serverless-java-container-jersey - 0.4 + 0.5 ``` @@ -190,4 +190,4 @@ public class StreamLambdaHandler implements RequestStreamHandler { outputStream.close(); } } -``` \ No newline at end of file +``` From dfa668951f9e1c88187e35542ece616adf1ab679 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Jun 2017 08:39:11 -0700 Subject: [PATCH 0009/1214] Added JsonIgnore annotations for future proofing of request POJO This further addresses issue #39 --- .../proxy/internal/model/ApiGatewayAuthorizerContext.java | 2 ++ .../proxy/internal/model/ApiGatewayRequestContext.java | 5 +++++ .../proxy/internal/model/ApiGatewayRequestIdentity.java | 5 +++++ .../serverless/proxy/internal/model/AwsProxyRequest.java | 2 ++ .../proxy/internal/model/CognitoAuthorizerClaims.java | 2 ++ 5 files changed, 16 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java index e8d95de0..9b937bb9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.HashMap; import java.util.Map; @@ -27,6 +28,7 @@ * * Cognito User Pool authorizers populate the claims object. */ +@JsonIgnoreProperties(ignoreUnknown = true) public class ApiGatewayAuthorizerContext { //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java index b91305ac..a3ce1528 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java @@ -12,6 +12,10 @@ */ package com.amazonaws.serverless.proxy.internal.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + + /** * The API Gateway request context object. This is used by the default implementation of the AWS_PROXY integration type. * All of the values are part of the API Gateway $context variable so this object could be reused with custom request @@ -20,6 +24,7 @@ * @see AwsProxyRequest * @see com.amazonaws.serverless.proxy.internal.RequestReader */ +@JsonIgnoreProperties(ignoreUnknown = true) public class ApiGatewayRequestContext { //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java index 206b9439..436cd690 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java @@ -12,6 +12,10 @@ */ package com.amazonaws.serverless.proxy.internal.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + + /** * Identity model for the API Gateway request context. This is used in the default AwsProxyRequest object. Contains * all of the properties declared in the $context.identity API Gateway object so could be re-used for other implemnetations @@ -19,6 +23,7 @@ * @see AwsProxyRequest * @see com.amazonaws.serverless.proxy.internal.RequestReader */ +@JsonIgnoreProperties(ignoreUnknown = true) public class ApiGatewayRequestIdentity { //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java index 39ae6c58..e9b141ec 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java @@ -13,12 +13,14 @@ package com.amazonaws.serverless.proxy.internal.model; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.Map; /** * Default implementation of the request object from an API Gateway AWS_PROXY integration */ +@JsonIgnoreProperties(ignoreUnknown = true) public class AwsProxyRequest { //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java index 552644df..697bce4e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.time.format.DateTimeFormatter; @@ -36,6 +37,7 @@ * } * */ +@JsonIgnoreProperties(ignoreUnknown = true) public class CognitoAuthorizerClaims { //------------------------------------------------------------- From 0e762c6a886581131f55898d1caa1e9dba1137ee Mon Sep 17 00:00:00 2001 From: Buliani Date: Mon, 3 Jul 2017 12:34:38 -0700 Subject: [PATCH 0010/1214] Bug fixes and new tests for spark implementation - partly addressing #40 --- .../{test => }/jersey/EchoJerseyResource.java | 6 +- .../{test => }/jersey/JerseyAwsProxyTest.java | 9 ++- .../jersey/model/MapResponseModel.java | 2 +- .../jersey/model/SingleValueModel.java | 2 +- .../spark/SparkLambdaContainerHandler.java | 10 +-- .../embeddedserver/LambdaEmbeddedServer.java | 4 +- .../proxy/spark/HelloWorldSparkTest.java | 54 +++++++++++++++ .../SparkLambdaContainerHandlerTest.java | 66 +++++++++++++++++++ .../LambdaEmbeddedServerTest.java | 23 +++++++ .../spark/filter/CustomHeaderFilter.java | 38 +++++++++++ .../proxy/test/spark/HelloWorldSparkTest.java | 39 ----------- .../spring/SpringServletContextTest.java | 2 - .../spring/echoapp/CustomHeaderFilter.java | 11 +++- 13 files changed, 208 insertions(+), 58 deletions(-) rename aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/{test => }/jersey/EchoJerseyResource.java (96%) rename aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/{test => }/jersey/JerseyAwsProxyTest.java (96%) rename aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/{test => }/jersey/model/MapResponseModel.java (94%) rename aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/{test => }/jersey/model/SingleValueModel.java (93%) create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/test/spark/HelloWorldSparkTest.java diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java similarity index 96% rename from aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/EchoJerseyResource.java rename to aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 33d54392..c22277da 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -10,12 +10,12 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.test.jersey; +package com.amazonaws.serverless.proxy.jersey; import com.amazonaws.serverless.proxy.internal.RequestReader; import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; -import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel; -import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel; +import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; +import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java similarity index 96% rename from aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/JerseyAwsProxyTest.java rename to aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 781af55d..1df8e0b2 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.test.jersey; +package com.amazonaws.serverless.proxy.jersey; import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; @@ -18,9 +18,8 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; -import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; -import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel; -import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel; +import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; +import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.services.lambda.runtime.Context; @@ -51,7 +50,7 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); - private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.test.jersey") + private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") .register(new AbstractBinder() { @Override protected void configure() { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/MapResponseModel.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/MapResponseModel.java similarity index 94% rename from aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/MapResponseModel.java rename to aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/MapResponseModel.java index 48fb23fe..8e9c23ab 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/MapResponseModel.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/MapResponseModel.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.test.jersey.model; +package com.amazonaws.serverless.proxy.jersey.model; import java.util.HashMap; import java.util.Map; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/SingleValueModel.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/SingleValueModel.java similarity index 93% rename from aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/SingleValueModel.java rename to aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/SingleValueModel.java index 5ec0508f..512fe37c 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/test/jersey/model/SingleValueModel.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/model/SingleValueModel.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.test.jersey.model; +package com.amazonaws.serverless.proxy.jersey.model; /** * Request/response model diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 1dfce86a..2a49efc3 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -64,10 +64,10 @@ public class SparkLambdaContainerHandler extends AwsL //------------------------------------------------------------- - // Variables - Private - Static + // Variables - Private //------------------------------------------------------------- - private static LambdaEmbeddedServer embeddedServer; + private LambdaEmbeddedServer embeddedServer; //------------------------------------------------------------- @@ -145,13 +145,15 @@ protected AwsHttpServletResponse getContainerResponse(CountDownLatch latch) { @Override protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { + // this method of the AwsLambdaServletContainerHandler sets the request context + super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); + if (embeddedServer == null) { embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); - servletContext = httpServletRequest.getServletContext(); // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { - startupHandler.onStartup(this.servletContext); + startupHandler.onStartup(getServletContext()); } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index a5dfbbab..335e19a3 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -62,7 +62,9 @@ public int ignite(String host, public void configureWebSockets(Map webSocketHandlers, Optional webSocketIdleTimeoutMillis) { - throw new UnsupportedOperationException(); + // Swallowing this exception to prevent Spark from getting stuck + // throw new UnsupportedOperationException(); + System.out.println("Spark called configureWebSockets. However, web sockets are not supported"); } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java new file mode 100644 index 00000000..7c7e1c33 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -0,0 +1,54 @@ +package com.amazonaws.serverless.proxy.spark; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; + +import org.junit.Test; + +import static org.junit.Assert.*; +import static spark.Spark.get; + + +public class HelloWorldSparkTest { + private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; + private static final String CUSTOM_HEADER_VALUE = "My Header Value"; + private static final String BODY_TEXT_RESPONSE = "Hello World"; + + private static SparkLambdaContainerHandler handler; + + @Test + public void basicServer_initialize() { + try { + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + + configureRoutes(); + + } catch (RuntimeException | ContainerInitializationException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + public void basicServer_handleRequest_emptyFilters() { + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/hello").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + assertEquals(200, response.getStatusCode()); + assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY)); + assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY)); + assertEquals(BODY_TEXT_RESPONSE, response.getBody()); + } + + private void configureRoutes() { + get("/hello", (req, res) -> { + res.status(200); + res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + return BODY_TEXT_RESPONSE; + }); + } +} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java new file mode 100644 index 00000000..f5da3396 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -0,0 +1,66 @@ +package com.amazonaws.serverless.proxy.spark; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; + +import org.junit.Test; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + +import java.util.EnumSet; + +import static org.junit.Assert.*; +import static spark.Spark.get; + + +public class SparkLambdaContainerHandlerTest { + private static final String RESPONSE_BODY_TEXT = "hello"; + + @Test + public void filters_onStartupMethod_executeFilters() { + + SparkLambdaContainerHandler handler = null; + try { + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail(); + } + + handler.onStartup(c -> { + if (c == null) { + System.out.println("Null servlet context"); + fail(); + } + FilterRegistration.Dynamic registration = c.addFilter("CustomHeaderFilter", CustomHeaderFilter.class); + // update the registration to map to a path + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + // servlet name mappings are disabled and will throw an exception + }); + + configureRoutes(); + + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/header-filter").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + assertNotNull(response); + assertEquals(200, response.getStatusCode()); + assertTrue(response.getHeaders().containsKey(CustomHeaderFilter.HEADER_NAME)); + assertEquals(CustomHeaderFilter.HEADER_VALUE, response.getHeaders().get(CustomHeaderFilter.HEADER_NAME)); + assertEquals(RESPONSE_BODY_TEXT, response.getBody()); + + } + + private void configureRoutes() { + get("/header-filter", (req, res) -> { + res.status(200); + return RESPONSE_BODY_TEXT; + }); + } +} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java new file mode 100644 index 00000000..af4dc275 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java @@ -0,0 +1,23 @@ +package com.amazonaws.serverless.proxy.spark.embeddedserver; + + +import org.junit.Test; + +import java.util.Optional; + +import static org.junit.Assert.*; + + +public class LambdaEmbeddedServerTest { + private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, false); + + @Test + public void webSocket_configureWebSocket_noException() { + try { + server.configureWebSockets(null, Optional.of(0)); + } catch (Exception e) { + e.printStackTrace(); + fail(); + } + } +} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java new file mode 100644 index 00000000..34999445 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java @@ -0,0 +1,38 @@ +package com.amazonaws.serverless.proxy.spark.filter; + + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + + +public class CustomHeaderFilter implements Filter { + public static final String HEADER_NAME = "X-Filter-Header"; + public static final String HEADER_VALUE = "CustomHeaderFilter"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + System.out.println("Called init on filter"); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + System.out.println("Called doFilter"); + HttpServletResponse resp = (HttpServletResponse)servletResponse; + resp.addHeader(HEADER_NAME, HEADER_VALUE); + + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + System.out.println("Called destroy"); + } +} \ No newline at end of file diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/test/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/test/spark/HelloWorldSparkTest.java deleted file mode 100644 index 290330bb..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/test/spark/HelloWorldSparkTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.amazonaws.serverless.proxy.test.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import junit.framework.TestCase; - -import static spark.Spark.get; - -public class HelloWorldSparkTest extends TestCase { - private ObjectMapper objectMapper = new ObjectMapper(); - - public void testSparkStart() { - try { - SparkLambdaContainerHandler handler - = SparkLambdaContainerHandler.getAwsProxyHandler(); - - get("/hello", (req, res) -> { - res.status(200); - res.body("Hello World"); - res.header("X-Custom-Header", "My Header Value"); - return "Hello World"; - }); - - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/hello").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - System.out.println("Response: " + objectMapper.writeValueAsString(response)); - } catch (JsonProcessingException | ContainerInitializationException e) { - e.printStackTrace(); - } - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 075db5bb..4c5e80a7 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -12,12 +12,10 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.ValidatedUserModel; import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; -import javax.ws.rs.core.MediaType; import java.util.EnumSet; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java index 50256b1a..0d3eb903 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java @@ -1,7 +1,14 @@ package com.amazonaws.serverless.proxy.spring.echoapp; -import javax.servlet.*; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; + import java.io.IOException; @@ -28,4 +35,4 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo public void destroy() { System.out.println("Called destroy"); } -} +} \ No newline at end of file From 237a7c7470174a45e182b14f3607ce2686eef557 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 5 Jul 2017 08:49:46 -0700 Subject: [PATCH 0011/1214] Added code to handle Cognito Credentials and return the identity id instead of the user ARN. This fixes issue #43 --- .../proxy/internal/jaxrs/AwsProxySecurityContext.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index c6698d86..816cf8af 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -69,7 +69,12 @@ public Principal getUserPrincipal() { if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM)) { return event.getRequestContext().getAuthorizer().getPrincipalId(); } else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { - return event.getRequestContext().getIdentity().getUserArn(); + // if we received credentials from Cognito Federated Identities then we return the identity id + if (event.getRequestContext().getIdentity().getCognitoIdentityId() != null) { + return event.getRequestContext().getIdentity().getCognitoIdentityId(); + } else { // otherwise the user arn from the credentials + return event.getRequestContext().getIdentity().getUserArn(); + } } else if (getAuthenticationScheme().equals(AUTH_SCHEME_COGNITO_POOL)) { return event.getRequestContext().getAuthorizer().getClaims().getSubject(); } From a0f3bae53df2143a275ae1393ad529d36dccfa84 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 6 Jul 2017 09:39:40 -0700 Subject: [PATCH 0012/1214] Rolling version back to 0.5.1-SNAPSHOT to prepare for bug-fix release --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 8f451768..b10d2e98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f195791f..86ca3319 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index a80a8b6f..9b2932ab 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 3b919d3f..56f5e415 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 2bd44b64..3b30d380 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.6-SNAPSHOT + 0.5.1-SNAPSHOT AWS Serverless Java container From 6c39b4950ec9f164a7cc783797ece0481c2fb568 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 6 Jul 2017 09:50:28 -0700 Subject: [PATCH 0013/1214] [maven-release-plugin] prepare release aws-serverless-java-container-0.5.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b10d2e98..3538a203 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1-SNAPSHOT + 0.5.1 com.amazonaws.serverless aws-serverless-java-container - 0.5.1-SNAPSHOT + 0.5.1 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 86ca3319..7864af0c 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1-SNAPSHOT + 0.5.1 com.amazonaws.serverless aws-serverless-java-container - 0.5.1-SNAPSHOT + 0.5.1 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1-SNAPSHOT + 0.5.1 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9b2932ab..81449d36 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1-SNAPSHOT + 0.5.1 com.amazonaws.serverless aws-serverless-java-container - 0.5.1-SNAPSHOT + 0.5.1 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1-SNAPSHOT + 0.5.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 56f5e415..ad438451 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1-SNAPSHOT + 0.5.1 com.amazonaws.serverless aws-serverless-java-container - 0.5.1-SNAPSHOT + 0.5.1 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1-SNAPSHOT + 0.5.1 diff --git a/pom.xml b/pom.xml index 3b30d380..8b9acc96 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.5.1-SNAPSHOT + 0.5.1 AWS Serverless Java container From 63956fbf9daf1a34eee23544bb5ebf6dbe55925a Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 6 Jul 2017 09:50:28 -0700 Subject: [PATCH 0014/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3538a203..8f451768 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5.1 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 7864af0c..f195791f 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5.1 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 81449d36..a80a8b6f 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5.1 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1 + 0.6-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ad438451..3b919d3f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.5.1 + 0.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.5.1 + 0.6-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.5.1 + 0.6-SNAPSHOT diff --git a/pom.xml b/pom.xml index 8b9acc96..2bd44b64 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.5.1 + 0.6-SNAPSHOT AWS Serverless Java container From 23d06ca33ddc9b75b15e0d32c2ca67238a44712d Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 6 Jul 2017 10:05:11 -0700 Subject: [PATCH 0015/1214] Bumping version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f9801db..6cc3a4a2 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to com.amazonaws.serverless aws-serverless-java-container-jersey - 0.5 + 0.5.1 ``` From 88adfdfa222fe9b8c32670085a15b6e5ee7f99a4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 14 Jul 2017 11:42:21 -0700 Subject: [PATCH 0016/1214] Fixed title in README --- samples/spring/pet-store/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/spring/pet-store/README.md b/samples/spring/pet-store/README.md index 44db0eac..17592941 100644 --- a/samples/spring/pet-store/README.md +++ b/samples/spring/pet-store/README.md @@ -1,4 +1,4 @@ -# Serverless Jersey example +# Serverless Spring example A basic pet store written with the [Spring framework](https://projects.spring.io/spring-framework/). The `LambdaHandler` object is the main entry point for Lambda. The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition @@ -59,4 +59,4 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSpringSample ``` -Copy the `OutputValue` into a browser to test a first request. \ No newline at end of file +Copy the `OutputValue` into a browser to test a first request. From 6cab616fb34f0c028acb69945069b02b9bdd9a00 Mon Sep 17 00:00:00 2001 From: Eran Medan Date: Tue, 18 Jul 2017 18:53:31 -0400 Subject: [PATCH 0017/1214] Avoid a NullPointerException... If we don't do an early exit after line 30, line 36 (37 above) will throw an NPE... (Another way would be to throw new IOException(e) instead of printStacktrace) --- .../amazonaws/serverless/sample/spring/StreamLambdaHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 29647d9b..7ce5c63a 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -28,6 +28,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co } catch (ContainerInitializationException e) { e.printStackTrace(); outputStream.close(); + return; } } From ccdb65ca7cf38449184ffe5dfd2787684926caa5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 8 Aug 2017 09:59:43 -0700 Subject: [PATCH 0018/1214] Fixed addCookie method in AwsHttpServletResponse to address #51 and added unit tests --- .../internal/LambdaContainerHandler.java | 4 +- .../servlet/AwsHttpServletResponse.java | 32 +++- .../servlet/AwsHttpServletResponseTest.java | 156 ++++++++++++++++++ .../jersey/JerseyLambdaContainerHandler.java | 2 +- .../spark/SparkLambdaContainerHandler.java | 4 +- .../spring/SpringLambdaContainerHandler.java | 4 +- 6 files changed, 189 insertions(+), 13 deletions(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 42edfaaf..11c05282 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -76,7 +76,7 @@ protected LambdaContainerHandler(RequestReaderContainerHandler that we are done receiving the response data */ - public AwsHttpServletResponse(CountDownLatch latch) { + public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { writersCountDownLatch = latch; + request = req; } @@ -79,6 +80,25 @@ public void addCookie(Cookie cookie) { if (cookie.getPath() != null) { cookieData += "; Path=" + cookie.getPath(); } + if (cookie.getSecure()) { + cookieData += "; Secure"; + } + if (cookie.isHttpOnly()) { + cookieData += "; HttpOnly"; + } + if (cookie.getDomain() != null && !"".equals(cookie.getDomain().trim())) { + cookieData += "; Domain=" + cookie.getDomain(); + } + cookieData += "; Max-Age=" + cookie.getMaxAge(); + + // we always set the timezone to GMT + TimeZone gmtTimeZone = TimeZone.getTimeZone(COOKIE_DEFAULT_TIME_ZONE); + Calendar currentTimestamp = Calendar.getInstance(gmtTimeZone); + currentTimestamp.add(Calendar.SECOND, cookie.getMaxAge()); + SimpleDateFormat cookieDateFormatter = new SimpleDateFormat(HEADER_DATE_PATTERN); + cookieDateFormatter.setTimeZone(gmtTimeZone); + cookieData += "; Expires=" + cookieDateFormatter.format(currentTimestamp.getTime()); + setHeader(HttpHeaders.SET_COOKIE, cookieData, false); } @@ -141,7 +161,7 @@ public void sendRedirect(String s) throws IOException { @Override public void setDateHeader(String s, long l) { - SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_FORMAT); + SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_PATTERN); Date responseDate = new Date(); responseDate.setTime(l); setHeader(s, sdf.format(responseDate), true); @@ -150,7 +170,7 @@ public void setDateHeader(String s, long l) { @Override public void addDateHeader(String s, long l) { - SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_FORMAT); + SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_PATTERN); Date responseDate = new Date(); responseDate.setTime(l); setHeader(s, sdf.format(responseDate), false); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java new file mode 100644 index 00000000..34e9583e --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -0,0 +1,156 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import org.junit.Test; + +import javax.servlet.http.Cookie; +import javax.ws.rs.core.HttpHeaders; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.junit.Assert.*; + + +public class AwsHttpServletResponseTest { + private static final String COOKIE_NAME = "session_id"; + private static final String COOKIE_VALUE = "123"; + private static final String COOKIE_PATH = "/api"; + private static final String COOKIE_DOMAIN = "mydomain.com"; + private static final int MAX_AGE_VALUE = 300; + + private static final Pattern MAX_AGE_PATTERN = Pattern.compile("Max-Age=(-?[0-9]+)"); + private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=(.*)$"); + + @Test + public void cookie_addCookie_verifyPath() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie pathCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + pathCookie.setPath(COOKIE_PATH); + + resp.addCookie(pathCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("Path=" + COOKIE_PATH)); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + } + + @Test + public void cookie_addCookie_verifySecure() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie secureCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + secureCookie.setSecure(true); + + resp.addCookie(secureCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("; Secure")); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + } + + @Test + public void cookie_addCookie_verifyDomain() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie domainCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + domainCookie.setDomain(COOKIE_DOMAIN); + + resp.addCookie(domainCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("; Domain=" + COOKIE_DOMAIN)); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + } + + @Test + public void cookie_addCookie_defaultMaxAgeIsNegative() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + maxAgeCookie.setDomain(COOKIE_DOMAIN); + + resp.addCookie(maxAgeCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("; Max-Age=")); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + + int maxAge = getMaxAge(cookieHeader); + assertEquals(-1, maxAge); + } + + @Test + public void cookie_addCookie_positiveMaxAgeIsPresent() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + maxAgeCookie.setMaxAge(MAX_AGE_VALUE); + + resp.addCookie(maxAgeCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("; Max-Age=")); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + + int maxAge = getMaxAge(cookieHeader); + assertEquals(MAX_AGE_VALUE, maxAge); + } + + @Test + public void cookie_addCookie_positiveMaxAgeExpiresDate() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + maxAgeCookie.setMaxAge(MAX_AGE_VALUE); + + resp.addCookie(maxAgeCookie); + Calendar testExpiration = Calendar.getInstance(); + testExpiration.add(Calendar.SECOND, MAX_AGE_VALUE); + testExpiration.setTimeZone(TimeZone.getTimeZone(AwsHttpServletResponse.COOKIE_DEFAULT_TIME_ZONE)); + + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + System.out.println("Cookie string: " + cookieHeader); + assertNotNull(cookieHeader); + assertTrue(cookieHeader.contains("; Max-Age=")); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + + SimpleDateFormat dateFormat = new SimpleDateFormat(AwsHttpServletResponse.HEADER_DATE_PATTERN); + + Calendar expiration = getExpires(cookieHeader); + System.out.println("Cookie date: " + dateFormat.format(expiration.getTime())); + System.out.println("Test date: " + dateFormat.format(testExpiration.getTime())); + // we need to compare strings because the millis time will be off + assertEquals(dateFormat.format(testExpiration.getTime()), dateFormat.format(expiration.getTime())); + } + + private int getMaxAge(String header) { + Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); + assertTrue(ageMatcher.find()); + assertTrue(ageMatcher.groupCount() >= 1); + String ageString = ageMatcher.group(1); + System.out.println("Age string: " + ageString); + return Integer.parseInt(ageString); + } + + private Calendar getExpires(String header) { + Matcher ageMatcher = EXPIRES_PATTERN.matcher(header); + assertTrue(ageMatcher.find()); + assertTrue(ageMatcher.groupCount() >= 1); + String expiresString = ageMatcher.group(1); + SimpleDateFormat sdf = new SimpleDateFormat(AwsHttpServletResponse.HEADER_DATE_PATTERN); + Calendar cal = Calendar.getInstance(); + try { + cal.setTime(sdf.parse(expiresString)); + } catch (ParseException e) { + e.printStackTrace(); + fail("Could not parse expire date"); + } + + return cal; + } +} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index ba9c778c..b57c6c6d 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -180,7 +180,7 @@ public void reload(ResourceConfig resourceConfig) { //------------------------------------------------------------- @Override - protected JerseyResponseWriter getContainerResponse(CountDownLatch latch) { + protected JerseyResponseWriter getContainerResponse(ContainerRequest request, CountDownLatch latch) { return new JerseyResponseWriter(latch); } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 2a49efc3..6ed15a06 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -137,8 +137,8 @@ public SparkLambdaContainerHandler(RequestReader Date: Tue, 8 Aug 2017 11:07:02 -0700 Subject: [PATCH 0019/1214] Cleaned up dependencies to address issues #50. Also added maven-enforcer-plugin to root pom.xml to avoid dependency convergence in the future --- aws-serverless-java-container-core/pom.xml | 4 +- aws-serverless-java-container-jersey/pom.xml | 41 +++++--------------- aws-serverless-java-container-spark/pom.xml | 22 ----------- aws-serverless-java-container-spring/pom.xml | 15 ------- pom.xml | 22 +++++++++++ samples/jersey/pet-store/pom.xml | 2 +- 6 files changed, 34 insertions(+), 72 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 8f451768..83a2b5a1 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -33,14 +33,14 @@ javax.ws.rs javax.ws.rs-api - 2.1-m01 + 2.0.1 com.fasterxml.jackson.core jackson-databind - 2.8.4 + ${jackson.version} diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f195791f..549a8b78 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -15,8 +15,7 @@ - 2.8.4 - 2.24 + 2.25.1 @@ -34,27 +33,6 @@ ${jersey.version}
- - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - junit @@ -71,20 +49,19 @@ test - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - 2.8.4 - test - - org.glassfish.jersey.media jersey-media-json-jackson - 2.24 + ${jersey.version} test + + + + com.fasterxml.jackson.core + jackson-annotations + + diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index a80a8b6f..c45acdb3 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -15,7 +15,6 @@ - 2.8.4 2.5.3 @@ -34,27 +33,6 @@ ${spark.version}
- - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - junit diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 3b919d3f..f8f6437b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,6 @@ 4.3.4.RELEASE - 2.8.4 @@ -58,20 +57,6 @@ test - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - test - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - test - - com.fasterxml.jackson.core jackson-databind diff --git a/pom.xml b/pom.xml index 2bd44b64..694f809e 100644 --- a/pom.xml +++ b/pom.xml @@ -35,9 +35,31 @@ + + 2.8.4 + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.0.0-M1 + + + enforce + + + + + + + enforce + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 1080e3ca..e286263a 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.24 + 2.25.1 2.8.5 From 1da7013d21a013b2c5ad5ba02e8cf64078161e07 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 8 Aug 2017 11:57:50 -0700 Subject: [PATCH 0020/1214] Moved away from Lambda context logger to slf4j-api. This addresses issues #21. Also removed Lambda context as a dependency from AwsServletContext to address #44. --- .../internal/AwsProxyExceptionHandler.java | 6 ++++- .../internal/LambdaContainerHandler.java | 10 +++++-- .../servlet/AwsHttpServletRequest.java | 8 ++++-- .../servlet/AwsHttpServletResponse.java | 8 +++++- .../AwsLambdaServletContainerHandler.java | 10 ++++--- .../servlet/AwsProxyHttpServletRequest.java | 12 +++++---- .../internal/servlet/AwsServletContext.java | 26 +++++++++---------- .../servlet/filters/UrlPathValidator.java | 6 ++++- .../servlet/AwsFilterChainManagerTest.java | 2 +- .../internal/servlet/FilterHolderTest.java | 2 +- .../AwsProxyServletRequestFactory.java | 7 +++-- .../spark/SparkLambdaContainerHandler.java | 8 +++--- .../LambdaSpringApplicationInitializer.java | 6 ++++- pom.xml | 9 +++++++ samples/jersey/pet-store/pom.xml | 11 ++++++++ samples/spark/pet-store/pom.xml | 5 ++++ .../sample/spark/JsonTransformer.java | 4 +++ .../sample/spark/LambdaHandler.java | 7 ++--- samples/spring/pet-store/pom.xml | 11 ++++++++ .../sample/spring/LambdaHandler.java | 6 ++++- .../sample/spring/StreamLambdaHandler.java | 5 +++- 21 files changed, 127 insertions(+), 42 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java index 5a2afef3..424ea56c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java @@ -17,6 +17,8 @@ import com.amazonaws.serverless.proxy.internal.model.ErrorModel; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -37,6 +39,8 @@ public class AwsProxyExceptionHandler implements ExceptionHandler { + private Logger log = LoggerFactory.getLogger(AwsProxyExceptionHandler.class); + //------------------------------------------------------------- // Constants //------------------------------------------------------------- @@ -93,7 +97,7 @@ String getErrorJson(String message) { try { return objectMapper.writeValueAsString(new ErrorModel(message)); } catch (JsonProcessingException e) { - e.printStackTrace(); + log.error("Could not produce error JSON", e); return "{ \"message\": \"" + message + "\" }"; } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 11c05282..521168a8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -16,6 +16,9 @@ import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.ws.rs.core.SecurityContext; import java.util.concurrent.CountDownLatch; @@ -49,6 +52,8 @@ public abstract class LambdaContainerHandler responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler) { + log.info("Starting Lambda Container Handler"); this.requestReader = requestReader; this.responseWriter = responseWriter; this.securityContextWriter = securityContextWriter; @@ -95,6 +101,7 @@ protected abstract void handleRequest(ContainerRequestType containerRequest, Con * @param basePath The base path to be stripped from the request */ public void stripBasePath(String basePath) { + log.debug("Setting framework to strip base path: " + basePath); config.setStripBasePath(true); config.setServiceBasePath(basePath); } @@ -122,8 +129,7 @@ public ResponseType proxy(RequestType request, Context context) { return responseWriter.writeResponse(containerResponse, context); } catch (Exception e) { - context.getLogger().log("Error while handling request: " + e.getMessage()); - e.printStackTrace(); + log.error("Error while handling request", e); return exceptionHandler.handle(e); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 32f2fcf7..81dc21ff 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -14,6 +14,9 @@ import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; @@ -66,6 +69,8 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { protected DispatcherType dispatcherType; + private Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class); + //------------------------------------------------------------- // Constructors @@ -280,8 +285,7 @@ protected String generateQueryString(Map parameters) { newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name()); } } catch (UnsupportedEncodingException e) { - lambdaContext.getLogger().log("Could not URLEncode: " + newKey + "\n" + e.getLocalizedMessage()); - e.printStackTrace(); + log.error("Could not URLEncode: " + newKey, e); } return newKey + "=" + newValue; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index f8352770..af99fd3e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -12,6 +12,9 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.Cookie; @@ -53,6 +56,8 @@ public class AwsHttpServletResponse private AwsHttpServletRequest request; private boolean isCommitted = false; + private Logger log = LoggerFactory.getLogger(AwsHttpServletResponse.class); + //------------------------------------------------------------- // Constructors @@ -275,7 +280,7 @@ public void setWriteListener(WriteListener writeListener) { try { writeListener.onWritePossible(); } catch (IOException e) { - e.printStackTrace(); + log.error("Output stream is not writable", e); } listener = writeListener; @@ -288,6 +293,7 @@ public void write(int b) throws IOException { try { bodyOutputStream.write(b); } catch (Exception e) { + log.error("Cannot write to output stream", e); listener.onError(e); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 14fb1b85..39d7806e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -19,6 +19,9 @@ import com.amazonaws.serverless.proxy.internal.SecurityContextWriter; import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -46,6 +49,7 @@ public abstract class AwsLambdaServletContainerHandler> urlEncodedFormParameters; private Map multipartFormParameters; + private Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); //------------------------------------------------------------- @@ -125,7 +128,7 @@ public long getDateHeader(String s) { try { return dateFormatter.parse(dateString).getTime(); } catch (ParseException e) { - e.printStackTrace(); + log.error("Could not parse date header", e); return new Date().getTime(); } } @@ -405,7 +408,7 @@ public void setReadListener(ReadListener readListener) { try { listener.onDataAvailable(); } catch (IOException e) { - e.printStackTrace(); + log.error("Data not available on input stream", e); } } @@ -682,8 +685,7 @@ private Map getMultipartFormParametersMap() { output.put(item.getFieldName(), newPart); } } catch (FileUploadException e) { - // TODO: Should we swallaw this? - e.printStackTrace(); + log.error("Could not read multipart upload file", e); } return output; } @@ -701,7 +703,7 @@ private Map> getFormUrlEncodedParametersMap() { try { rawBodyContent = URLDecoder.decode(request.getBody(), DEFAULT_CHARACTER_ENCODING); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + log.warn("Could not decode body content - proceeding as if it was already decoded", e); rawBodyContent = request.getBody(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 76c4b2eb..fcdbcb5e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -16,6 +16,9 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; @@ -64,10 +67,10 @@ public class AwsServletContext // Variables - Private //------------------------------------------------------------- private Map filters; - private Context lambdaContext; private Map attributes; private Map initParameters; private AwsLambdaServletContainerHandler containerHandler; + private Logger log = LoggerFactory.getLogger(AwsServletContext.class); //------------------------------------------------------------- @@ -80,8 +83,7 @@ public class AwsServletContext // Constructors //------------------------------------------------------------- - public AwsServletContext(Context lambdaContext, AwsLambdaServletContainerHandler containerHandler) { - this.lambdaContext = lambdaContext; + public AwsServletContext(AwsLambdaServletContainerHandler containerHandler) { this.containerHandler = containerHandler; this.attributes = new HashMap<>(); this.initParameters = new HashMap<>(); @@ -141,7 +143,7 @@ public String getMimeType(String s) { try { return Files.probeContentType(Paths.get(s)); } catch (IOException e) { - e.printStackTrace(); + log.warn("Could not find content type for filter", e); return null; } } @@ -202,22 +204,20 @@ public Enumeration getServletNames() { @Override public void log(String s) { - lambdaContext.getLogger().log(s); + log.info(s); } @Override @Deprecated public void log(Exception e, String s) { - lambdaContext.getLogger().log(s); - lambdaContext.getLogger().log(e.getMessage()); + log.error(s, e); } @Override public void log(String s, Throwable throwable) { - lambdaContext.getLogger().log(s); - lambdaContext.getLogger().log(throwable.getMessage()); + log.error(s, throwable); } @@ -229,7 +229,7 @@ public String getRealPath(String s) { try { absPath = new File(fileUrl.toURI()).getAbsolutePath(); } catch (URISyntaxException e) { - lambdaContext.getLogger().log("Error while looking for real path: " + s + "\n" + e.getMessage()); + log.error("Error while looking for real path: " + s, e); } } return absPath; @@ -350,7 +350,7 @@ public FilterRegistration.Dynamic addFilter(String name, String filterClass) { return addFilter(name, filterCastClass); } catch (ClassNotFoundException e) { - e.printStackTrace(); + log.error("Could not find filter class", e); throw new IllegalStateException("Filter class " + filterClass + " not found"); } } @@ -381,7 +381,7 @@ public FilterRegistration.Dynamic addFilter(String name, Class } catch (ServletException e) { // TODO: There is no clear indication in the servlet specs on whether we should throw an exception here. // See JavaDoc here: http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContext.html#addFilter-java.lang.String-java.lang.Class- - lambdaContext.getLogger().log("Could not register filter: " + e.getMessage()); + log.error("Could not register filter: ", e); } return null; } @@ -392,7 +392,7 @@ public T createFilter(Class aClass) throws ServletExceptio try { return aClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { - lambdaContext.getLogger().log("Could not initialize filter class " + aClass.getName() + "\n" + e.getMessage()); + log.error("Could not initialize filter class " + aClass.getName(), e); throw new ServletException(); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index a488ce9a..f9523158 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -12,6 +12,9 @@ */ package com.amazonaws.serverless.proxy.internal.servlet.filters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; @@ -40,6 +43,7 @@ public class UrlPathValidator implements Filter { //------------------------------------------------------------- private int invalidStatusCode; + private Logger log = LoggerFactory.getLogger(UrlPathValidator.class); //------------------------------------------------------------- @@ -54,7 +58,7 @@ public void init(FilterConfig filterConfig) throws ServletException { try { invalidStatusCode = Integer.parseInt(statusCode); } catch (NumberFormatException e) { - // TODO: Log + log.error("Could not parse status code from filter config", e); invalidStatusCode = DEFAULT_ERROR_CODE; } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 102ba833..5b2a1aa4 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -21,7 +21,7 @@ public class AwsFilterChainManagerTest { @BeforeClass public static void setUp() { - servletContext = new AwsServletContext(lambdaContext, null);//AwsServletContext.getInstance(lambdaContext, null); + servletContext = new AwsServletContext( null);//AwsServletContext.getInstance(lambdaContext, null); FilterRegistration.Dynamic reg = servletContext.addFilter("Filter1", new MockFilter()); reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/first/second"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java index 2403207a..6c39c8d8 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java @@ -12,7 +12,7 @@ public class FilterHolderTest { @Test public void annotation_filterRegistration_pathValidator() { - FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(lambdaContext, null)); + FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(null)); assertTrue(holder.isAnnotated()); assertNotEquals(UrlPathValidator.class.getName(), holder.getRegistration().getName()); diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java index 436bee97..748585e4 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java @@ -23,6 +23,8 @@ import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import org.glassfish.hk2.api.Factory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; @@ -48,6 +50,7 @@ public class AwsProxyServletRequestFactory implements Factory { private static AwsProxyHttpServletRequestReader requestReader = new AwsProxyHttpServletRequestReader(); + private static Logger log = LoggerFactory.getLogger(AwsProxyServletRequestFactory.class); //------------------------------------------------------------- // Implementation - Factory @@ -69,10 +72,10 @@ public static HttpServletRequest getRequest() { AwsProxySecurityContextWriter.getCurrentContext(), JerseyAwsProxyRequestReader.getCurrentLambdaContext(), JerseyLambdaContainerHandler.getContainerConfig()); - req.setServletContext(new AwsServletContext(JerseyAwsProxyRequestReader.getCurrentLambdaContext(), null)); + req.setServletContext(new AwsServletContext(null)); return req; } catch (InvalidRequestEventException e) { - e.printStackTrace(); + log.error("Invalid request event", e); return null; } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 6ed15a06..c601474a 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -21,6 +21,9 @@ import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import spark.Service; import spark.Spark; import spark.embeddedserver.EmbeddedServers; @@ -68,6 +71,7 @@ public class SparkLambdaContainerHandler extends AwsL //------------------------------------------------------------- private LambdaEmbeddedServer embeddedServer; + private Logger log = LoggerFactory.getLogger(SparkLambdaContainerHandler.class); //------------------------------------------------------------- @@ -117,16 +121,12 @@ public SparkLambdaContainerHandler(RequestReader2.8.4 + + + + org.slf4j + slf4j-api + 1.7.13 + + + diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index e286263a..2c3cb9c8 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -48,6 +48,17 @@ jersey-media-json-jackson ${jersey.version} + + + com.amazonaws + aws-lambda-java-log4j + 1.0.0 + + + org.slf4j + slf4j-log4j12 + 1.7.21 + diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 4d78fb9c..a4e82436 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -77,6 +77,11 @@ ${jackson.version}
+ + com.amazonaws + aws-lambda-java-log4j + 1.0.0 + org.slf4j slf4j-log4j12 diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java index 55e5e5be..bc1692af 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java @@ -14,17 +14,21 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import spark.ResponseTransformer; public class JsonTransformer implements ResponseTransformer { private ObjectMapper mapper = new ObjectMapper(); + private Logger log = LoggerFactory.getLogger(JsonTransformer.class); @Override public String render(Object model) { try { return mapper.writeValueAsString(model); } catch (JsonProcessingException e) { + log.error("Cannot serialize object", e); return null; } } diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java index 08ecc151..efd481ff 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java @@ -22,7 +22,8 @@ import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.log4j.LambdaAppender; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.core.Response; import java.util.UUID; @@ -35,17 +36,17 @@ public class LambdaHandler implements RequestHandler handler; + private Logger log = LoggerFactory.getLogger(LambdaHandler.class); @Override public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { if (!isInitialized) { isInitialized = true; try { - Logger.getRootLogger().addAppender(new LambdaAppender()); handler = SparkLambdaContainerHandler.getAwsProxyHandler(); defineResources(); } catch (ContainerInitializationException e) { - e.printStackTrace(); + log.error("Cannot initialize Spark application", e); return null; } } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 5f6db931..902f7f14 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -65,6 +65,17 @@ jackson-databind ${jackson.version} + + + com.amazonaws + aws-lambda-java-log4j + 1.0.0 + + + org.slf4j + slf4j-log4j12 + 1.7.21 + diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java index af0545fe..515178ee 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java @@ -19,16 +19,20 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class LambdaHandler implements RequestHandler { private SpringLambdaContainerHandler handler; + private Logger log = LoggerFactory.getLogger(LambdaHandler.class); public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { if (handler == null) { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); } catch (ContainerInitializationException e) { - e.printStackTrace(); + log.error("Cannot initialize spring handler", e); return null; } } diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 29647d9b..42643074 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -9,6 +9,8 @@ import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -18,6 +20,7 @@ public class StreamLambdaHandler implements RequestStreamHandler { private SpringLambdaContainerHandler handler; private static ObjectMapper mapper = new ObjectMapper(); + private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) @@ -26,7 +29,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); } catch (ContainerInitializationException e) { - e.printStackTrace(); + log.error("Cannot initialize Spring container", e); outputStream.close(); } } From fc469d1abc3d4e7535e8330995d9bc781524da60 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 10 Aug 2017 08:18:21 -0700 Subject: [PATCH 0021/1214] Added Spring Boot sample in the readme --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 6cc3a4a2..f235c256 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,25 @@ public class LambdaHandler implements RequestHandler handler = + SpringLambdaContainerHandler.getAwsProxyHandler(wrappingContext); +``` + +When using Spring Boot, make sure to configure the shade plugin in your pom file to exclude the embedded container and all unnecessary libraries to reduce the size of your built jar. + ### Spark support 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. From 316a155e64b99386a2527164a2c0d6c204e40a8b Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 10 Aug 2017 17:12:56 -0700 Subject: [PATCH 0022/1214] Removed the last System.out.println to address #21 --- .../proxy/spark/embeddedserver/LambdaEmbeddedServer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index 335e19a3..73502fa3 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -1,5 +1,7 @@ package com.amazonaws.serverless.proxy.spark.embeddedserver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import spark.embeddedserver.EmbeddedServer; import spark.embeddedserver.jetty.websocket.WebSocketHandlerWrapper; import spark.http.matching.MatcherFilter; @@ -26,6 +28,7 @@ public class LambdaEmbeddedServer private MatcherFilter sparkFilter; private StaticFilesConfiguration staticFilesConfiguration; private boolean hasMultipleHandler; + private Logger log = LoggerFactory.getLogger(LambdaEmbeddedServer.class); //------------------------------------------------------------- @@ -64,7 +67,7 @@ public void configureWebSockets(Map webSocketHa Optional webSocketIdleTimeoutMillis) { // Swallowing this exception to prevent Spark from getting stuck // throw new UnsupportedOperationException(); - System.out.println("Spark called configureWebSockets. However, web sockets are not supported"); + log.info("Spark called configureWebSockets. However, web sockets are not supported"); } From 91471f43d55ef44687549133c50c870a226294e5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 11 Aug 2017 10:34:48 -0700 Subject: [PATCH 0023/1214] [maven-release-plugin] prepare release aws-serverless-java-container-0.6 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 83a2b5a1..b2777353 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.6 com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.6 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 549a8b78..8b9e3c3e 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.6 com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.6 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.6 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c45acdb3..05d7ca9a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.6 com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.6 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.6 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f8f6437b..f6ab93ed 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.6-SNAPSHOT + 0.6 com.amazonaws.serverless aws-serverless-java-container - 0.6-SNAPSHOT + 0.6 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6-SNAPSHOT + 0.6 diff --git a/pom.xml b/pom.xml index 1712a70b..28c8a371 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.6-SNAPSHOT + 0.6 AWS Serverless Java container @@ -60,7 +60,7 @@ enforce - + From 54aca70d2fa0dbb35bb4c0385ca662692fdf8a68 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 11 Aug 2017 10:34:49 -0700 Subject: [PATCH 0024/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b2777353..0a3cd0de 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.6 + 0.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6 + 0.7-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 8b9e3c3e..b61b2dd0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.6 + 0.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6 + 0.7-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6 + 0.7-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 05d7ca9a..9663e776 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.6 + 0.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6 + 0.7-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6 + 0.7-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f6ab93ed..1e93db81 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.6 + 0.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.6 + 0.7-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.6 + 0.7-SNAPSHOT diff --git a/pom.xml b/pom.xml index 28c8a371..fae8cf98 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.6 + 0.7-SNAPSHOT AWS Serverless Java container From c72f07ce03a31222f8febb68356673bdff512daf Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 11 Aug 2017 12:12:03 -0700 Subject: [PATCH 0025/1214] Bumped library version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f235c256..f1a83111 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to com.amazonaws.serverless aws-serverless-java-container-jersey - 0.5.1 + 0.6 ``` From 4571953d496efdd19b3f3669af6bae909010c940 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 14 Aug 2017 09:44:25 -0700 Subject: [PATCH 0026/1214] changed the filter chain cache to only store FilterHolder object and return a new FilterChainHolder each time. This addresses issue #56 --- aws-serverless-java-container-core/pom.xml | 7 ++ .../internal/servlet/FilterChainHolder.java | 41 ++++++++-- .../internal/servlet/FilterChainManager.java | 50 ++++++------ .../servlet/AwsFilterChainManagerTest.java | 78 +++++++++++++++++++ aws-serverless-java-container-spark/pom.xml | 6 ++ pom.xml | 2 +- 6 files changed, 148 insertions(+), 36 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0a3cd0de..f70b8836 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -74,6 +74,13 @@ test + + + org.slf4j + slf4j-simple + 1.7.25 + test + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index caa460bf..47c5ebe6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -12,6 +12,9 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -33,7 +36,9 @@ public class FilterChainHolder implements FilterChain { //------------------------------------------------------------- private List filters; - private int currentFilter; + int currentFilter; + + private Logger log = LoggerFactory.getLogger(FilterChainHolder.class); //------------------------------------------------------------- @@ -43,7 +48,7 @@ public class FilterChainHolder implements FilterChain { /** * Creates a new empty FilterChainHolder */ - public FilterChainHolder() { + FilterChainHolder() { this(new ArrayList<>()); } @@ -52,9 +57,9 @@ public FilterChainHolder() { * Creates a new instance of a filter chain holder * @param allFilters A populated list of FilterHolder objects */ - public FilterChainHolder(List allFilters) { + FilterChainHolder(List allFilters) { filters = allFilters; - currentFilter = -1; + resetHolder(); } @@ -66,16 +71,20 @@ public FilterChainHolder(List allFilters) { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { currentFilter++; if (filters == null || filters.size() == 0 || currentFilter > filters.size() - 1) { + log.debug("Could not find filters to execute, returning"); return; } // TODO: We do not check for async filters here FilterHolder holder = filters.get(currentFilter); + // lazily initialize filters when they are needed if (!holder.isFilterInitialized()) { holder.init(); } + log.debug("Starting filter " + holder.getFilterName()); holder.getFilter().doFilter(servletRequest, servletResponse, this); + log.debug("Executed filter " + holder.getFilterName()); } @@ -87,7 +96,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo * Add a filter to the chain. * @param newFilter The filter to be added at the end of the chain */ - public void addFilter(FilterHolder newFilter) { + void addFilter(FilterHolder newFilter) { filters.add(newFilter); } @@ -96,7 +105,7 @@ public void addFilter(FilterHolder newFilter) { * Returns the number of filters loaded in the chain holder * @return The number of filters in the chain holder. If the filter chain is null then this will return 0 */ - public int filterCount() { + int filterCount() { if (filters == null) { return 0; } else { @@ -110,11 +119,29 @@ public int filterCount() { * @param idx The index in the chain. Use the filterCount method to get the filter count * @return A populated FilterHolder object */ - public FilterHolder getFilter(int idx) { + FilterHolder getFilter(int idx) { if (filters == null) { return null; } else { return filters.get(idx); } } + + + /** + * Returns the list of filters in this chain. + * @return The list of filters + */ + public List getFilters() { + return filters; + } + + + /** + * Resets the chain holder to the beginning of the filter chain. This method is used from the constructor as well as when + * the {@link FilterChainManager} return a holder from the cache. + */ + private void resetHolder() { + currentFilter = -1; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 2cffe10a..79bbbc75 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -13,9 +13,12 @@ package com.amazonaws.serverless.proxy.internal.servlet; import javax.servlet.DispatcherType; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; + import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -26,13 +29,13 @@ * For example, the Spring implementation creates the ServletContext when the application is initialized the first time * and creates a FitlerChainManager to execute its filters for each request. */ -public abstract class FilterChainManager { +public abstract class FilterChainManager { //------------------------------------------------------------- // Variables - Protected //------------------------------------------------------------- - protected static final String PATH_PART_SEPARATOR = "/"; + static final String PATH_PART_SEPARATOR = "/"; //------------------------------------------------------------- @@ -41,7 +44,7 @@ public abstract class FilterChainManager { // we use the synchronizedMap because we do not expect high concurrency on this object. Lambda only allows one // event at a time per container - private Map filterCache = Collections.synchronizedMap(new HashMap()); + private Map> filterCache = Collections.synchronizedMap(new HashMap>()); private int filtersSize = -1; protected ServletContextType servletContext; @@ -50,7 +53,7 @@ public abstract class FilterChainManager { // Constructors //------------------------------------------------------------- - protected FilterChainManager(ServletContextType context) { + FilterChainManager(ServletContextType context) { servletContext = context; } @@ -80,7 +83,7 @@ protected FilterChainManager(ServletContextType context) { * @param request The incoming servlet request * @return A FilterChainHolder object that can be used to apply the filters to the request */ - public FilterChainHolder getFilterChain(final HttpServletRequest request) { + FilterChainHolder getFilterChain(final HttpServletRequest request) { String targetPath = request.getServletPath(); DispatcherType type = request.getDispatcherType(); @@ -127,17 +130,22 @@ public FilterChainHolder getFilterChain(final HttpServletRequest request) { /** * Retrieves a filter chain from the cache. The cache is lazily loaded as filter chains are requested. If the chain - * is not available in the cache, the method returns null. + * is not available in the cache, the method returns null. This method returns a new instance of FilterChainHolder + * initialized with the cached list of {@link FilterHolder} objects * @param type The dispatcher type for the incoming request * @param targetPath The request path - this is extracted with the getPath method of the request object * @return A populated FilterChainHolder */ - protected FilterChainHolder getFilterChainCache(final DispatcherType type, final String targetPath) { + private FilterChainHolder getFilterChainCache(final DispatcherType type, final String targetPath) { TargetCacheKey key = new TargetCacheKey(); key.setDispatcherType(type); key.setTargetPath(targetPath); - return filterCache.get(key); + if (!filterCache.containsKey(key)) { + return null; + } + + return new FilterChainHolder(filterCache.get(key)); } @@ -150,7 +158,7 @@ protected FilterChainHolder getFilterChainCache(final DispatcherType type, final * @param targetPath The target path in the API * @param holder The FilterChainHolder object to save in the cache */ - protected void putFilterChainCache(final DispatcherType type, final String targetPath, final FilterChainHolder holder) { + private void putFilterChainCache(final DispatcherType type, final String targetPath, final FilterChainHolder holder) { TargetCacheKey key = new TargetCacheKey(); key.setDispatcherType(type); key.setTargetPath(targetPath); @@ -159,8 +167,8 @@ protected void putFilterChainCache(final DispatcherType type, final String targe if (key.hashCode() == -1) { return; } + filterCache.put(key, holder.getFilters()); - filterCache.put(key, holder); } @@ -171,7 +179,7 @@ protected void putFilterChainCache(final DispatcherType type, final String targe * @param mapping The mapping path stored in the filter registration * @return true if the given mapping path can apply to the target, false otherwise. */ - protected boolean pathMatches(final String target, final String mapping) { + boolean pathMatches(final String target, final String mapping) { // easiest case, they are exactly the same if (target.toLowerCase().equals(mapping.toLowerCase())) { return true; @@ -275,11 +283,7 @@ public int hashCode() { @Override public boolean equals(Object key) { - if (!key.getClass().isAssignableFrom(TargetCacheKey.class)) { - return false; - } else { - return hashCode() == key.hashCode(); - } + return key.getClass().isAssignableFrom(TargetCacheKey.class) && hashCode() == key.hashCode(); } @@ -287,22 +291,12 @@ public boolean equals(Object key) { // Methods - Getter/Setter //------------------------------------------------------------- - public String getTargetPath() { - return targetPath; - } - - - public void setTargetPath(String targetPath) { + void setTargetPath(String targetPath) { this.targetPath = targetPath; } - public DispatcherType getDispatcherType() { - return dispatcherType; - } - - - public void setDispatcherType(DispatcherType dispatcherType) { + void setDispatcherType(DispatcherType dispatcherType) { this.dispatcherType = dispatcherType; } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 5b2a1aa4..84f320b9 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -5,20 +5,27 @@ import com.amazonaws.services.lambda.runtime.Context; import org.junit.BeforeClass; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.servlet.*; import java.io.IOException; import java.util.EnumSet; +import java.util.concurrent.CountDownLatch; import static org.junit.Assert.*; public class AwsFilterChainManagerTest { + private static final String REQUEST_CUSTOM_ATTRIBUTE_NAME = "X-Custom-Attribute"; + private static final String REQUEST_CUSTOM_ATTRIBUTE_VALUE = "CustomAttrValue"; private static AwsFilterChainManager chainManager; private static Context lambdaContext = new MockLambdaContext(); private static ServletContext servletContext; + private Logger log = LoggerFactory.getLogger(AwsFilterChainManagerTest.class); + @BeforeClass public static void setUp() { servletContext = new AwsServletContext( null);//AwsServletContext.getInstance(lambdaContext, null); @@ -127,6 +134,76 @@ public void filterChain_getFilterChain_subsetOfFilters() { assertEquals("Filter2", fcHolder.getFilter(0).getFilterName()); } + @Test + public void filterChain_matchMultipleTimes_expectSameMatch() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + ); + req.setServletContext(servletContext); + FilterChainHolder fcHolder = chainManager.getFilterChain(req); + assertEquals(1, fcHolder.filterCount()); + assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); + + AwsProxyHttpServletRequest req2 = new AwsProxyHttpServletRequest( + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + ); + req.setServletContext(servletContext); + FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2); + assertEquals(1, fcHolder2.filterCount()); + assertEquals("Filter1", fcHolder2.getFilter(0).getFilterName()); + } + + @Test + public void filerChain_executeMultipleFilters_expectRunEachTime() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + ); + req.setServletContext(servletContext); + FilterChainHolder fcHolder = chainManager.getFilterChain(req); + assertEquals(1, fcHolder.filterCount()); + assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); + AwsHttpServletResponse resp = new AwsHttpServletResponse(req, new CountDownLatch(1)); + + try { + fcHolder.doFilter(req, resp); + } catch (IOException e) { + fail("IO Exception while executing filters"); + e.printStackTrace(); + } catch (ServletException e) { + fail("Servlet exception while executing filters"); + e.printStackTrace(); + } + + assertTrue(req.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME) != null); + assertEquals(REQUEST_CUSTOM_ATTRIBUTE_VALUE, req.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME)); + + log.debug("Starting second request"); + + AwsProxyHttpServletRequest req2 = new AwsProxyHttpServletRequest( + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + ); + req2.setServletContext(servletContext); + FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2); + assertEquals(1, fcHolder2.filterCount()); + assertEquals("Filter1", fcHolder2.getFilter(0).getFilterName()); + assertEquals(-1, fcHolder2.currentFilter); + + AwsHttpServletResponse resp2 = new AwsHttpServletResponse(req, new CountDownLatch(1)); + + try { + fcHolder2.doFilter(req2, resp2); + } catch (IOException e) { + fail("IO Exception while executing filters"); + e.printStackTrace(); + } catch (ServletException e) { + fail("Servlet exception while executing filters"); + e.printStackTrace(); + } + + assertTrue(req2.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME) != null); + assertEquals(REQUEST_CUSTOM_ATTRIBUTE_VALUE, req2.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME)); + } + @Test public void filterChain_getFilterChain_multipleFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( @@ -159,6 +236,7 @@ public void init(FilterConfig filterConfig) throws ServletException { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("DoFilter"); + servletRequest.setAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME, REQUEST_CUSTOM_ATTRIBUTE_VALUE); filterChain.doFilter(servletRequest, servletResponse); } diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9663e776..d93fc032 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -31,6 +31,12 @@ com.sparkjava spark-core ${spark.version} + + + org.slf4j + slf4j-api + + diff --git a/pom.xml b/pom.xml index fae8cf98..a2228500 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ org.slf4j slf4j-api - 1.7.13 + 1.7.25 From 0dcfa36aae20c3d7940f73342003fb60121ab937 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 14 Aug 2017 10:59:44 -0700 Subject: [PATCH 0027/1214] Added encoding charset to container config and changed and to return a decoded uri as per the servlet specs. This addresses issue #53 --- .../proxy/internal/model/ContainerConfig.java | 11 +++++++++++ .../internal/servlet/AwsHttpServletRequest.java | 13 +++++++++++++ .../servlet/AwsProxyHttpServletRequest.java | 5 +++-- .../AwsProxyHttpServletRequestReaderTest.java | 17 +++++++++++++++++ .../proxy/spring/SpringAwsProxyTest.java | 15 +++++++++++++++ .../proxy/spring/echoapp/EchoResource.java | 8 ++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java index 54df45a6..3efddde3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java @@ -5,10 +5,12 @@ * Configuration paramters used by the RequestReader and ResponseWriter objects. */ public class ContainerConfig { + public static final String DEFAULT_URI_ENCODING = "UTF-8"; public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); configuration.setStripBasePath(false); + configuration.setUriEncoding(DEFAULT_URI_ENCODING); return configuration; } @@ -19,6 +21,7 @@ public static ContainerConfig defaultConfig() { private String serviceBasePath; private boolean stripBasePath; + private String uriEncoding; //------------------------------------------------------------- @@ -53,4 +56,12 @@ public void setStripBasePath(boolean stripBasePath) { } + public String getUriEncoding() { + return uriEncoding; + } + + + public void setUriEncoding(String uriEncoding) { + this.uriEncoding = uriEncoding; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 81dc21ff..15ad74da 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; @@ -24,6 +25,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.AbstractMap; @@ -320,4 +322,15 @@ protected List> parseHeaderValue(String headerValue) { } return values; } + + protected String decodeRequestPath(String requestPath, ContainerConfig config) { + try { + return URLDecoder.decode(requestPath, config.getUriEncoding()); + } catch (UnsupportedEncodingException ex) { + log.error("Could not URL decode the request path, configured encoding not supported: " + config.getUriEncoding(), ex); + // we do not fail at this. + return requestPath; + } + + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index d4a5b345..5f836ef1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; @@ -184,7 +185,7 @@ public String getPathInfo() { if (!pathInfo.startsWith("/")) { pathInfo = "/" + pathInfo; } - return pathInfo; + return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); } @@ -248,7 +249,7 @@ public StringBuffer getRequestURL() { @Override public String getServletPath() { - return request.getPath(); + return decodeRequestPath(request.getPath(), LambdaContainerHandler.getContainerConfig()); } @Override diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 38c4ad0c..fa883856 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -20,6 +20,8 @@ public class AwsProxyHttpServletRequestReaderTest { private static final String TEST_HEADER_KEY = "x-test"; private static final String TEST_HEADER_VALUE = "header"; + private static final String ENCODED_REQUEST_PATH = "/foo/bar/Some%20Thing"; + private static final String DECODED_REQUEST_PATH = "/foo/bar/Some Thing"; @Test public void readRequest_reflection_returnType() throws NoSuchMethodException { @@ -40,4 +42,19 @@ public void readRequest_validAwsProxy_populatedRequest() { fail("Could not read request"); } } + + @Test + public void readRequest_urlDecode_expectDecodedPath() { + AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").build(); + try { + HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); + assertNotNull(servletRequest); + assertEquals(DECODED_REQUEST_PATH, servletRequest.getPathInfo()); + assertEquals(ENCODED_REQUEST_PATH, servletRequest.getRequestURI()); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Could not read request"); + } + + } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index a60ce9cd..9d6ee9e1 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -221,6 +221,21 @@ public void request_requestURL() { validateSingleValueModel(output, "https://api.myserver.com/prod/echo/request-Url"); } + @Test + public void request_encodedPath_returnsDecodedPath() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-request-uri/Some%20Thing", "GET") + .scheme("https") + .serverName("api.myserver.com") + .stage("prod") + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + + validateSingleValueModel(output, "Some Thing"); + + } + private void validateMapResponseModel(AwsProxyResponse output) { try { MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 553116cb..55deb7ed 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -110,4 +110,12 @@ public SingleValueModel echoRequestURL(HttpServletRequest request) { return valueModel; } + @RequestMapping(path = "/encoded-request-uri/{encoded-var}", method = RequestMethod.GET) + public SingleValueModel echoEncodedRequestUri(@PathVariable("encoded-var") String encodedVar) { + SingleValueModel valueModel = new SingleValueModel(); + valueModel.setValue(encodedVar); + + return valueModel; + } + } From 8ee206e347f7e9b28a632f13b16208cc02ae53ab Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 14 Aug 2017 14:15:23 -0700 Subject: [PATCH 0028/1214] Switched jersey request reader to use a instead of instantiating a new URI directly. This addresses issue #59 --- aws-serverless-java-container-core/pom.xml | 8 ---- .../internal/AwsProxyExceptionHandler.java | 1 + .../jersey/JerseyAwsProxyRequestReader.java | 20 ++++++++-- .../proxy/jersey/JerseyAwsProxyTest.java | 39 ++++++++++++++++++- pom.xml | 8 ++++ 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f70b8836..9bcc77c2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -73,14 +73,6 @@ 4.5.3 test - - - - org.slf4j - slf4j-simple - 1.7.25 - test - diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java index 424ea56c..886b1dd9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java @@ -73,6 +73,7 @@ public class AwsProxyExceptionHandler @Override public AwsProxyResponse handle(Throwable ex) { + log.error("Called exception handler for:", ex); if (ex instanceof InvalidRequestEventException) { return new AwsProxyResponse(500, headers, getErrorJson(INTERNAL_SERVER_ERROR)); } else { diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java index 959c77c2..143236af 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java @@ -21,8 +21,12 @@ import org.glassfish.jersey.internal.MapPropertiesDelegate; import org.glassfish.jersey.internal.PropertiesDelegate; import org.glassfish.jersey.server.ContainerRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriBuilder; + import java.io.ByteArrayInputStream; import java.net.URI; import java.net.URISyntaxException; @@ -47,6 +51,8 @@ public class JerseyAwsProxyRequestReader extends RequestReaderslf4j-api 1.7.25 + + + + org.slf4j + slf4j-simple + 1.7.25 + test + From ee246174bf11a506be528ec23e94f8d729739dd3 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 14 Aug 2017 15:26:31 -0700 Subject: [PATCH 0029/1214] Additional unit tests. Also added a configuration parameter to specify whether multiple Set-Cookie headers should be consolidated into a single header - RFC2109 is not support in all clients but API Gateway can only return a single header per key. These changes try to address concerns in issue #51 --- .../proxy/internal/model/ContainerConfig.java | 37 ++++++- .../servlet/AwsHttpServletResponse.java | 19 +++- .../proxy/jersey/JerseyResponseWriter.java | 17 +++- .../proxy/spark/HelloWorldSparkTest.java | 64 +++++++++++- .../spring/SpringServletContextTest.java | 32 ++++++ .../proxy/spring/echoapp/ContextResource.java | 97 ++++++++++++++++++- 6 files changed, 258 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java index 3efddde3..452dac0c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java @@ -2,7 +2,7 @@ /** - * Configuration paramters used by the RequestReader and ResponseWriter objects. + * Configuration parameters for the framework */ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; @@ -11,6 +11,7 @@ public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); configuration.setStripBasePath(false); configuration.setUriEncoding(DEFAULT_URI_ENCODING); + configuration.setConsolidateSetCookieHeaders(true); return configuration; } @@ -22,6 +23,7 @@ public static ContainerConfig defaultConfig() { private String serviceBasePath; private boolean stripBasePath; private String uriEncoding; + private boolean consolidateSetCookieHeaders; //------------------------------------------------------------- @@ -33,6 +35,11 @@ public String getServiceBasePath() { } + /** + * Configures a base path that can be strippped from the request path before passing it to the frameowkr-specific implementation. This can be used to + * remove API Gateway's base path mappings from the request. + * @param serviceBasePath The base path mapping to be removed. + */ public void setServiceBasePath(String serviceBasePath) { // clean up base path before setting it, we want a "/" at the beginning but not at the end. String finalBasePath = serviceBasePath; @@ -51,6 +58,11 @@ public boolean isStripBasePath() { } + /** + * Whether this framework should strip the base path mapping specified with the {@link #setServiceBasePath(String)} method from a request before + * passing it to the framework-specific implementations + * @param stripBasePath + */ public void setStripBasePath(boolean stripBasePath) { this.stripBasePath = stripBasePath; } @@ -61,7 +73,30 @@ public String getUriEncoding() { } + /** + * Sets the charset used to URLEncode and Decode request paths. + * @param uriEncoding The charset. By default this is set to UTF-8 + */ public void setUriEncoding(String uriEncoding) { this.uriEncoding = uriEncoding; } + + + public boolean isConsolidateSetCookieHeaders() { + return consolidateSetCookieHeaders; + } + + + /** + * Tells the library to consolidate multiple Set-Cookie headers into a single Set-Cookie header with multiple, comma-separated values. This is allowed + * by the RFC 2109 (https://tools.ietf.org/html/rfc2109). However, since not all clients support this, we consider it optional. When this value is set + * to true the framework will consolidate all Set-Cookie headers into a single header, when it's set to false, the framework will only return the first + * Set-Cookie header specified in a response. + * + * Because API Gateway needs header keys to be unique, we give an option to configure this. + * @param consolidateSetCookieHeaders Whether to consolidate the cookie headers or not. + */ + public void setConsolidateSetCookieHeaders(boolean consolidateSetCookieHeaders) { + this.consolidateSetCookieHeaders = consolidateSetCookieHeaders; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index af99fd3e..126f7adb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -12,6 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -410,7 +412,22 @@ byte[] getAwsResponseBodyBytes() { Map getAwsResponseHeaders() { Map responseHeaders = new HashMap<>(); for (String header : getHeaderNames()) { - responseHeaders.put(header, headers.getFirst(header)); + // special behavior for set cookie + // RFC 2109 allows for a comma separated list of cookies in one Set-Cookie header: https://tools.ietf.org/html/rfc2109 + if (header.equals(HttpHeaders.SET_COOKIE) && LambdaContainerHandler.getContainerConfig().isConsolidateSetCookieHeaders()) { + StringBuilder cookieHeader = new StringBuilder(); + for (String cookieValue : headers.get(header)) { + if (cookieHeader.length() > 0) { + cookieHeader.append(","); + } + + cookieHeader.append(" ").append(cookieValue); + } + + responseHeaders.put(header, cookieHeader.toString()); + } else { + responseHeaders.put(header, headers.getFirst(header)); + } } return responseHeaders; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java index 78c0ae93..89a038b1 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java @@ -13,10 +13,14 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; + import org.glassfish.jersey.server.ContainerException; import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.spi.ContainerResponseWriter; +import javax.ws.rs.core.HttpHeaders; + import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.HashMap; @@ -79,7 +83,18 @@ public OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerR for (final Map.Entry> e : containerResponse.getStringHeaders().entrySet()) { for (final String value : e.getValue()) { - headers.put(e.getKey(), value); + // special case for set cookies + // RFC 2109 allows for a comma separated list of cookies in one Set-Cookie header: https://tools.ietf.org/html/rfc2109 + if (e.getKey().equals(HttpHeaders.SET_COOKIE)) { + if (headers.containsKey(e.getKey()) && LambdaContainerHandler.getContainerConfig().isConsolidateSetCookieHeaders()) { + headers.put(e.getKey(), headers.get(e.getKey()) + ", " + value); + } else { + headers.put(e.getKey(), containerResponse.getStringHeaders().getFirst(e.getKey())); + break; + } + } else { + headers.put(e.getKey(), value); + } } } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 7c7e1c33..40314051 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -7,8 +7,12 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import org.junit.BeforeClass; import org.junit.Test; +import javax.servlet.http.Cookie; +import javax.ws.rs.core.HttpHeaders; + import static org.junit.Assert.*; import static spark.Spark.get; @@ -18,10 +22,15 @@ public class HelloWorldSparkTest { private static final String CUSTOM_HEADER_VALUE = "My Header Value"; private static final String BODY_TEXT_RESPONSE = "Hello World"; + public static final String COOKIE_NAME = "MyCookie"; + public static final String COOKIE_VALUE = "CookieValue"; + public static final String COOKIE_DOMAIN = "mydomain.com"; + public static final String COOKIE_PATH = "/"; + private static SparkLambdaContainerHandler handler; - @Test - public void basicServer_initialize() { + @BeforeClass + public static void initializeServer() { try { handler = SparkLambdaContainerHandler.getAwsProxyHandler(); @@ -44,11 +53,60 @@ public void basicServer_handleRequest_emptyFilters() { assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } - private void configureRoutes() { + @Test + public void addCookie_setCookieOnResponse_validCustomCookie() { + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/cookie").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + assertEquals(200, response.getStatusCode()); + assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); + } + + @Test + public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/multi-cookie").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + System.out.println("Cookie: " + response.getHeaders().get(HttpHeaders.SET_COOKIE)); + + assertEquals(200, response.getStatusCode()); + assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); + // we compare against 4 because the expiration date of the cookies will also contain a string + assertEquals(4, response.getHeaders().get(HttpHeaders.SET_COOKIE).split(",").length); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "2=" + COOKIE_VALUE + "2")); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); + assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); + } + + private static void configureRoutes() { get("/hello", (req, res) -> { res.status(200); res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); return BODY_TEXT_RESPONSE; }); + + get("/cookie", (req, res) -> { + Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + testCookie.setDomain(COOKIE_DOMAIN); + testCookie.setPath(COOKIE_PATH); + res.raw().addCookie(testCookie); + return BODY_TEXT_RESPONSE; + }); + + get("/multi-cookie", (req, res) -> { + Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + testCookie.setDomain(COOKIE_DOMAIN); + testCookie.setPath(COOKIE_PATH); + Cookie testCookie2 = new Cookie(COOKIE_NAME + "2", COOKIE_VALUE + "2"); + testCookie2.setDomain(COOKIE_DOMAIN); + testCookie2.setPath(COOKIE_PATH); + res.raw().addCookie(testCookie); + res.raw().addCookie(testCookie2); + return BODY_TEXT_RESPONSE; + }); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 4c5e80a7..ca676b3a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -7,12 +7,15 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.spring.echoapp.ContextResource; import com.amazonaws.serverless.proxy.spring.echoapp.CustomHeaderFilter; import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; import com.amazonaws.serverless.proxy.spring.echoapp.model.ValidatedUserModel; import org.junit.BeforeClass; import org.junit.Test; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; @@ -97,5 +100,34 @@ public void filter_validationFilter_emptyName() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(HttpStatus.BAD_REQUEST.value(), output.getStatusCode()); } + + @Test + public void exception_populatedException_annotationValuesMappedCorrectly() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/context/exception", "GET") + .stage(STAGE) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + + assertEquals(409, output.getStatusCode()); + assertTrue(output.getBody().contains(ContextResource.EXCEPTION_REASON)); + } + + @Test + public void cookie_injectInResponse_expectCustomSetCookie() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/context/cookie", "GET") + .stage(STAGE) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + + + assertEquals(200, output.getStatusCode()); + assertTrue(output.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); + assertTrue(output.getHeaders().get(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_NAME + "=" + ContextResource.COOKIE_VALUE)); + assertTrue(output.getHeaders().get(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_DOMAIN)); + } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java index 02ec3cf0..59e74ad3 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java @@ -1,24 +1,41 @@ package com.amazonaws.serverless.proxy.spring.echoapp; +import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.ValidatedUserModel; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.ServletContextAware; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import javax.servlet.ServletContext; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import javax.ws.rs.core.MediaType; + +import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation; + @RestController @EnableWebMvc @RequestMapping("/context") public class ContextResource implements ServletContextAware { + public static final String COOKIE_DOMAIN = "mydomain.com"; + public static final String COOKIE_NAME = "CustomCookie"; + public static final String COOKIE_VALUE = "CookieValue"; + public static final String EXCEPTION_REASON = "There was a conflict"; private ServletContext context; @RequestMapping(path = "/echo", method= RequestMethod.GET) @@ -26,7 +43,7 @@ public ResponseEntity getContext() { return new ResponseEntity(this.context.getServerInfo(), HttpStatus.OK); } - @RequestMapping(path = "/user", method=RequestMethod.POST, consumes = MediaType.APPLICATION_JSON) + @RequestMapping(path = "/user", method=RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity createUser(@Valid @RequestBody ValidatedUserModel newUser, BindingResult results) { if (results.hasErrors()) { @@ -36,8 +53,84 @@ public ResponseEntity createUser(@Valid @RequestBody Validat return new ResponseEntity(newUser, HttpStatus.OK); } + @RequestMapping(path = "/cookie", method=RequestMethod.GET) + public SingleValueModel setCookie(ServletRequest request, ServletResponse response) { + setCookie(request, response, COOKIE_NAME, COOKIE_VALUE, true, false, true, null, false); + return new SingleValueModel(); + } + + @RequestMapping(path = "/exception", method=RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public SingleValueModel handleException() { + throw new SpringConflictException(); + } + + public static void setCookie(ServletRequest request, ServletResponse response, String name, String value, + boolean set, boolean global, boolean bSecureCookie, Integer maxAge, boolean httpOnly) { + Cookie ck = new Cookie(name, value); + + HttpServletRequest httpRequest = (HttpServletRequest) request; + + if (httpOnly) { + ck.setHttpOnly(true); + } + + if (set) { + if (maxAge != null) { + ck.setMaxAge(maxAge.intValue()); + } else { + ck.setMaxAge(-1); + } + } else { + ck.setMaxAge(0); + } + ck.setPath("/"); + + // for local and fngn envs., we should not set cookie as a secure cookie + if (bSecureCookie) { + ck.setSecure(true); + } + + ck.setDomain(COOKIE_DOMAIN); + + + ((HttpServletResponse) response).addCookie(ck); + } + @Override public void setServletContext(ServletContext servletContext) { context = servletContext; } + + @ControllerAdvice + class ExceptionHandlerAdvice { + @ExceptionHandler({ SpringConflictException.class }) + @ResponseBody + ResponseEntity handle(Exception exception) { + SingleValueModel body = new SingleValueModel(); + body.setValue(resolveAnnotatedExceptionReason(exception)); + HttpStatus responseStatus = resolveAnnotatedResponseStatus(exception); + return new ResponseEntity<>(body, responseStatus); + } + + HttpStatus resolveAnnotatedResponseStatus(Exception exception) { + ResponseStatus annotation = findMergedAnnotation(exception.getClass(), ResponseStatus.class); + if (annotation != null) { + return annotation.value(); + } + return HttpStatus.INTERNAL_SERVER_ERROR; + } + + String resolveAnnotatedExceptionReason(Exception exception) { + ResponseStatus annotation = findMergedAnnotation(exception.getClass(), ResponseStatus.class); + if (annotation != null && !"".equals(annotation.reason())) { + return annotation.reason(); + } + return exception.getLocalizedMessage(); + } + } + + @ResponseStatus(value=HttpStatus.CONFLICT, reason= EXCEPTION_REASON) + public class SpringConflictException extends RuntimeException { + + } } From 6bd4f76c5e9c8bf10746ff1f71d9e57e1ff65a3a Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 14 Aug 2017 17:10:08 -0700 Subject: [PATCH 0030/1214] Added logic to skip the Expires value if Max-Age is set to -1 in cookies. Based on the feedback on #51 --- .../internal/servlet/AwsHttpServletResponse.java | 16 +++++++++------- .../servlet/AwsHttpServletResponseTest.java | 11 +++++++++++ .../proxy/spark/HelloWorldSparkTest.java | 2 +- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 126f7adb..b72401d0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -98,13 +98,15 @@ public void addCookie(Cookie cookie) { } cookieData += "; Max-Age=" + cookie.getMaxAge(); - // we always set the timezone to GMT - TimeZone gmtTimeZone = TimeZone.getTimeZone(COOKIE_DEFAULT_TIME_ZONE); - Calendar currentTimestamp = Calendar.getInstance(gmtTimeZone); - currentTimestamp.add(Calendar.SECOND, cookie.getMaxAge()); - SimpleDateFormat cookieDateFormatter = new SimpleDateFormat(HEADER_DATE_PATTERN); - cookieDateFormatter.setTimeZone(gmtTimeZone); - cookieData += "; Expires=" + cookieDateFormatter.format(currentTimestamp.getTime()); + if (cookie.getMaxAge() > 0) { + // we always set the timezone to GMT + TimeZone gmtTimeZone = TimeZone.getTimeZone(COOKIE_DEFAULT_TIME_ZONE); + Calendar currentTimestamp = Calendar.getInstance(gmtTimeZone); + currentTimestamp.add(Calendar.SECOND, cookie.getMaxAge()); + SimpleDateFormat cookieDateFormatter = new SimpleDateFormat(HEADER_DATE_PATTERN); + cookieDateFormatter.setTimeZone(gmtTimeZone); + cookieData += "; Expires=" + cookieDateFormatter.format(currentTimestamp.getTime()); + } setHeader(HttpHeaders.SET_COOKIE, cookieData, false); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 34e9583e..110ac211 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -128,6 +128,17 @@ public void cookie_addCookie_positiveMaxAgeExpiresDate() { assertEquals(dateFormat.format(testExpiration.getTime()), dateFormat.format(expiration.getTime())); } + @Test + public void cookie_addCookieWithoutMaxAge_expectNoExpires() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie simpleCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + resp.addCookie(simpleCookie); + + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + assertNotNull(cookieHeader); + assertFalse(cookieHeader.contains("Expires")); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 40314051..53dba6fb 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -75,7 +75,7 @@ public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { assertEquals(200, response.getStatusCode()); assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); // we compare against 4 because the expiration date of the cookies will also contain a string - assertEquals(4, response.getHeaders().get(HttpHeaders.SET_COOKIE).split(",").length); + assertEquals(2, response.getHeaders().get(HttpHeaders.SET_COOKIE).split(",").length); assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "2=" + COOKIE_VALUE + "2")); assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); From 8c7db310a1099d5a96802b533632d8203e610d5b Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 15 Aug 2017 10:02:19 -0700 Subject: [PATCH 0031/1214] Upgrade to Spark 2.6.0 to address #42. Also moved Junit dependency from individual pom files to the main one. --- README.md | 10 +++ aws-serverless-java-container-core/pom.xml | 16 ---- aws-serverless-java-container-jersey/pom.xml | 8 -- aws-serverless-java-container-spark/pom.xml | 11 +-- .../spark/SparkLambdaContainerHandler.java | 19 +++-- .../embeddedserver/LambdaEmbeddedServer.java | 29 ++++--- .../LambdaEmbeddedServerFactory.java | 15 ++++ .../proxy/spark/HelloWorldSparkTest.java | 15 +++- .../proxy/spark/InitExceptionHandlerTest.java | 75 +++++++++++++++++++ .../SparkLambdaContainerHandlerTest.java | 7 ++ aws-serverless-java-container-spring/pom.xml | 8 -- pom.xml | 16 ++++ 12 files changed, 167 insertions(+), 62 deletions(-) create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java diff --git a/README.md b/README.md index f1a83111..50e7a922 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,16 @@ public class LambdaHandler implements RequestHandler { + LOG.error("ignite failed", e); + System.exit(100); +}); +``` + # Security context The `aws-serverless-java-container-core` contains a default implementation of the `SecurityContextWriter` that supports API Gateway's proxy integration. The generated security context uses the API Gateway `$context` object to establish the request security context. The context looks for the following values in order and returns the first matched type: diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9bcc77c2..86811558 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -50,22 +50,6 @@ 1.3.2 - - - junit - junit - 4.12 - test - - - - - org.mockito - mockito-all - 1.10.19 - test - - org.apache.httpcomponents diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b61b2dd0..7d5bf0b9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -33,14 +33,6 @@ ${jersey.version} - - - junit - junit - 4.12 - test - - commons-codec diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index d93fc032..bc5e8a11 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -15,7 +15,7 @@ - 2.5.3 + 2.6.0 @@ -31,6 +31,7 @@ com.sparkjava spark-core ${spark.version} + org.slf4j @@ -38,14 +39,6 @@ - - - - junit - junit - 4.12 - test - diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index c601474a..b4a059d3 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import spark.Service; import spark.Spark; +import spark.embeddedserver.EmbeddedServerFactory; import spark.embeddedserver.EmbeddedServers; import java.lang.reflect.Field; @@ -91,7 +92,8 @@ public static SparkLambdaContainerHandler get return new SparkLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler()); + new AwsProxyExceptionHandler(), + new LambdaEmbeddedServerFactory()); } @@ -102,31 +104,34 @@ public static SparkLambdaContainerHandler get public SparkLambdaContainerHandler(RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler) + ExceptionHandler exceptionHandler, + EmbeddedServerFactory embeddedServerFactory) throws ContainerInitializationException { super(requestReader, responseWriter, securityContextWriter, exceptionHandler); - EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, new LambdaEmbeddedServerFactory()); + EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, embeddedServerFactory); // TODO: This is pretty bad but we are not given access to the embeddedServerIdentifier property of the // Service object try { + log.debug("Changing visibility of getInstance method and embeddedServerIdentifier properties"); Method serviceInstanceMethod = Spark.class.getDeclaredMethod("getInstance"); serviceInstanceMethod.setAccessible(true); Service sparkService = (Service) serviceInstanceMethod.invoke(null); Field serverIdentifierField = Service.class.getDeclaredField("embeddedServerIdentifier"); serverIdentifierField.setAccessible(true); serverIdentifierField.set(sparkService, LAMBDA_EMBEDDED_SERVER_CODE); - - // remove Jetty from embedded servers - EmbeddedServers.class.getDeclaredMethod("initialize"); } catch (NoSuchFieldException e) { + log.error("Could not fine embeddedServerIdentifier field in Service class", e); throw new ContainerInitializationException("Cannot find embeddedServerIdentifier field in Service class", e); } catch (NoSuchMethodException e) { + log.error("Could not find getInstance method in Spark class", e); throw new ContainerInitializationException("Cannot find getInstance method in Spark class", e); } catch (IllegalAccessException e) { + log.error("Could not access getInstance method in Spark class", e); throw new ContainerInitializationException("Cannot access getInstance method in Spark class", e); } catch (InvocationTargetException e) { + log.error("Could not invoke getInstance method in Spark class", e); throw new ContainerInitializationException("Cannot invoke getInstance method in Spark class", e); } } @@ -145,10 +150,12 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest @Override protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { + // this method of the AwsLambdaServletContainerHandler sets the request context super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); if (embeddedServer == null) { + log.debug("First request, getting new server instance"); embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); // call the onStartup event if set to give developers a chance to set filters in the context diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index 73502fa3..e6c8541f 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -15,7 +15,6 @@ import java.io.IOException; import java.util.Map; import java.util.Optional; -import java.util.concurrent.CountDownLatch; public class LambdaEmbeddedServer implements EmbeddedServer { @@ -45,19 +44,14 @@ public class LambdaEmbeddedServer //------------------------------------------------------------- // Implementation - EmbeddedServer //------------------------------------------------------------- - @Override - public int ignite(String host, - int port, - SslStores sslStores, - CountDownLatch countDownLatch, - int maxThreads, - int minThreads, - int threadIdleTimeoutMillis) { + public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) + throws Exception { + log.info("Starting Spark server, ignoring port and host"); sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, false, hasMultipleHandler); sparkFilter.init(null); - countDownLatch.countDown(); + //countDownLatch.countDown(); return 0; } @@ -71,18 +65,31 @@ public void configureWebSockets(Map webSocketHa } + @Override + public void join() + throws InterruptedException { + log.info("Called join method, nothing to do here since Lambda only runs a single event per container"); + } + + @Override public void extinguish() { + log.info("Called extinguish method, nothing to do here."); } + @Override + public int activeThreadCount() { + log.debug("Called activeThreadCount, since Lambda only runs one event per container we always return 1"); + return 1; + } + //------------------------------------------------------------- // Methods - Public //------------------------------------------------------------- public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - //RouteMatch route = applicationRoutes.find(HttpMethod.get(request.requestMethod()), request.contextPath(), "*/*"); sparkFilter.doFilter(request, response, null); } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index f200f5b9..3bf02a71 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -14,6 +14,21 @@ public class LambdaEmbeddedServerFactory implements EmbeddedServerFactory { private static LambdaEmbeddedServer embeddedServer; + /** + * Empty constructor, applications should always use this constructor. + */ + public LambdaEmbeddedServerFactory() {} + + + /** + * Constructor used in unit tests to inject a mocked embedded server + * @param server The mocked server + */ + public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { + embeddedServer = server; + } + + //------------------------------------------------------------- // Implementation - EmbeddedServerFactory //------------------------------------------------------------- diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 53dba6fb..d75595e2 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -7,8 +7,10 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import spark.Spark; import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; @@ -22,10 +24,10 @@ public class HelloWorldSparkTest { private static final String CUSTOM_HEADER_VALUE = "My Header Value"; private static final String BODY_TEXT_RESPONSE = "Hello World"; - public static final String COOKIE_NAME = "MyCookie"; - public static final String COOKIE_VALUE = "CookieValue"; - public static final String COOKIE_DOMAIN = "mydomain.com"; - public static final String COOKIE_PATH = "/"; + private static final String COOKIE_NAME = "MyCookie"; + private static final String COOKIE_VALUE = "CookieValue"; + private static final String COOKIE_DOMAIN = "mydomain.com"; + private static final String COOKIE_PATH = "/"; private static SparkLambdaContainerHandler handler; @@ -42,6 +44,11 @@ public static void initializeServer() { } } + @AfterClass + public static void stopSpark() { + Spark.stop(); + } + @Test public void basicServer_handleRequest_emptyFilters() { AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/hello").build(); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java new file mode 100644 index 00000000..a0c976d5 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -0,0 +1,75 @@ +package com.amazonaws.serverless.proxy.spark; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.internal.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; +import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; + +import org.junit.AfterClass; +import org.junit.Test; +import spark.Spark; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.when; +import static spark.Spark.get; +import static spark.Spark.initExceptionHandler; + + +public class InitExceptionHandlerTest { + + private static final String TEST_EXCEPTION_MESSAGE = "test exception"; + private static LambdaEmbeddedServer embeddedServer = mock(LambdaEmbeddedServer.class); + + @Test + public void initException_mockException_expectHandlerToRun() { + try { + + when(embeddedServer.ignite(anyString(), anyInt(), anyObject(), anyInt(), anyInt(), anyInt())) + .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null)); + LambdaEmbeddedServerFactory serverFactory = new LambdaEmbeddedServerFactory(embeddedServer); + new SparkLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + serverFactory); + + configureRoutes(); + + } catch (Exception e) { + e.printStackTrace(); + fail("Error while mocking server"); + } + + } + + @AfterClass + public static void stopSpark() { + // un-mock the embedded server to avoid blocking other tests + reset(embeddedServer); + // reset the static variable in the factory so that it will be instantiated again next time + new LambdaEmbeddedServerFactory(null); + Spark.stop(); + } + + private static void configureRoutes() { + initExceptionHandler((e) -> { + System.out.println("Exception Handler called: " + e.getLocalizedMessage()); + assertEquals(TEST_EXCEPTION_MESSAGE, e.getLocalizedMessage()); + }); + + get("/test-route", (req, res) -> { + res.status(200); + return "test"; + }); + } +} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index f5da3396..ecf09226 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -8,7 +8,9 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; +import org.junit.AfterClass; import org.junit.Test; +import spark.Spark; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; @@ -57,6 +59,11 @@ public void filters_onStartupMethod_executeFilters() { } + @AfterClass + public static void stopSpark() { + Spark.stop(); + } + private void configureRoutes() { get("/header-filter", (req, res) -> { res.status(200); diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1e93db81..636e35e3 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -49,14 +49,6 @@ test - - - junit - junit - 4.12 - test - - com.fasterxml.jackson.core jackson-databind diff --git a/pom.xml b/pom.xml index 3afc637e..94b714dd 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,14 @@ + + + junit + junit + 4.12 + test + + org.slf4j @@ -54,6 +62,14 @@ 1.7.25 test + + + + org.mockito + mockito-all + 1.10.19 + test + From 4fbe38074e9f6ac0d9218649ffd98a36afb28546 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 16 Aug 2017 08:21:44 -0700 Subject: [PATCH 0032/1214] Updated Spark version in sample application - final change for #42 --- samples/spark/pet-store/pom.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index a4e82436..7cad08a1 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.8.5 - 2.5.3 + 2.6.0 @@ -77,11 +77,6 @@ ${jackson.version} - - com.amazonaws - aws-lambda-java-log4j - 1.0.0 - org.slf4j slf4j-log4j12 From 60563596d7c4a007918b1040283cf1cd131dae8d Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 16 Aug 2017 08:28:47 -0700 Subject: [PATCH 0033/1214] Changed addCookie method not to return a Max-Age or Expires property if the maxAge is < 0. This is tested with a browser and should finally close #51 --- .../proxy/internal/servlet/AwsHttpServletResponse.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index b72401d0..4ebfd893 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -96,9 +96,10 @@ public void addCookie(Cookie cookie) { if (cookie.getDomain() != null && !"".equals(cookie.getDomain().trim())) { cookieData += "; Domain=" + cookie.getDomain(); } - cookieData += "; Max-Age=" + cookie.getMaxAge(); if (cookie.getMaxAge() > 0) { + cookieData += "; Max-Age=" + cookie.getMaxAge(); + // we always set the timezone to GMT TimeZone gmtTimeZone = TimeZone.getTimeZone(COOKIE_DEFAULT_TIME_ZONE); Calendar currentTimestamp = Calendar.getInstance(gmtTimeZone); From 292af7895809ad00718e774c2d4c09690c74e17c Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 16 Aug 2017 08:31:57 -0700 Subject: [PATCH 0034/1214] Fixed cookie unit test --- .../proxy/internal/servlet/AwsHttpServletResponseTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 110ac211..d4771354 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -78,11 +78,8 @@ public void cookie_addCookie_defaultMaxAgeIsNegative() { String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); - assertTrue(cookieHeader.contains("; Max-Age=")); + assertFalse(cookieHeader.contains("Max-Age=")); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); - - int maxAge = getMaxAge(cookieHeader); - assertEquals(-1, maxAge); } @Test From 2392c340fc5d8368c411ea70fb9607b31b55fd5b Mon Sep 17 00:00:00 2001 From: Eran Medan Date: Tue, 22 Aug 2017 15:12:55 -0400 Subject: [PATCH 0035/1214] rethrow exception instead of silently return --- .../amazonaws/serverless/sample/spring/StreamLambdaHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 7ce5c63a..c896a8bc 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -28,7 +28,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co } catch (ContainerInitializationException e) { e.printStackTrace(); outputStream.close(); - return; + throw new RuntimeException(e); } } From 7d6ad846f74e6b61d61eb2308387ff47f958aee0 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 24 Aug 2017 10:16:36 -0700 Subject: [PATCH 0036/1214] [maven-release-plugin] prepare release aws-serverless-java-container-0.7 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 86811558..577f8c1c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.7-SNAPSHOT + 0.7 com.amazonaws.serverless aws-serverless-java-container - 0.7-SNAPSHOT + 0.7 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 7d5bf0b9..cdacac76 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.7-SNAPSHOT + 0.7 com.amazonaws.serverless aws-serverless-java-container - 0.7-SNAPSHOT + 0.7 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7-SNAPSHOT + 0.7 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index bc5e8a11..d0c57641 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.7-SNAPSHOT + 0.7 com.amazonaws.serverless aws-serverless-java-container - 0.7-SNAPSHOT + 0.7 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7-SNAPSHOT + 0.7 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 636e35e3..b7f160ce 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.7-SNAPSHOT + 0.7 com.amazonaws.serverless aws-serverless-java-container - 0.7-SNAPSHOT + 0.7 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7-SNAPSHOT + 0.7 diff --git a/pom.xml b/pom.xml index 94b714dd..854e9aba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.7-SNAPSHOT + 0.7 AWS Serverless Java container From 0c1a28a3ca00b47ba634e7f1a221e051050e827e Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 24 Aug 2017 10:16:36 -0700 Subject: [PATCH 0037/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 577f8c1c..fa3834d5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.7 + 0.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.7 + 0.8-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cdacac76..2b2f78a5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.7 + 0.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.7 + 0.8-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7 + 0.8-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index d0c57641..5901f1fa 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.7 + 0.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.7 + 0.8-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7 + 0.8-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b7f160ce..5855cd39 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.7 + 0.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.7 + 0.8-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.7 + 0.8-SNAPSHOT diff --git a/pom.xml b/pom.xml index 854e9aba..0cfa934d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.7 + 0.8-SNAPSHOT AWS Serverless Java container From 55aae8d7ab72f6e4e29afc77d61694982cd1b41a Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 24 Aug 2017 10:23:00 -0700 Subject: [PATCH 0038/1214] Bumping version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50e7a922..b21c8701 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to com.amazonaws.serverless aws-serverless-java-container-jersey - 0.6 + 0.7 ``` From 97c935023d24bd1b5869979d20d54a0d85b815e7 Mon Sep 17 00:00:00 2001 From: Hendy Irawan Date: Sat, 2 Sep 2017 06:17:58 +0700 Subject: [PATCH 0039/1214] Proof-of-concept of Spring Boot, Servlet API, and Spring MVC support for AWS Lambda See https://github.com/spring-projects/spring-boot/issues/10136 --- .../proxy/internal/model/AwsProxyRequest.java | 9 +- .../servlet/AwsHttpServletRequest.java | 12 +- .../servlet/AwsHttpServletResponse.java | 10 +- .../internal/servlet/AwsHttpSession.java | 111 ++++++++ .../AwsLambdaServletContainerHandler.java | 7 +- .../servlet/AwsProxyHttpServletRequest.java | 8 +- .../internal/servlet/AwsServletContext.java | 15 +- .../internal/servlet/FilterChainHolder.java | 40 ++- .../internal/servlet/FilterChainManager.java | 15 +- .../proxy/internal/servlet/FilterHolder.java | 2 +- .../testutils/AwsProxyRequestBuilder.java | 2 + .../servlet/AwsFilterChainManagerTest.java | 18 +- .../spark/SparkLambdaContainerHandler.java | 2 +- .../SpringBootLambdaContainerHandler.java | 254 ++++++++++++++++++ .../spring/SpringLambdaContainerHandler.java | 3 +- 15 files changed, 468 insertions(+), 40 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java create mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java index e9b141ec..d8c59482 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import java.util.HashMap; import java.util.Map; /** @@ -31,7 +32,7 @@ public class AwsProxyRequest { private String resource; private ApiGatewayRequestContext requestContext; private Map queryStringParameters; - private Map headers; + private Map headers = new HashMap<>(); // avoid NPE private Map pathParameters; private String httpMethod; private Map stageVariables; @@ -105,7 +106,11 @@ public Map getHeaders() { public void setHeaders(Map headers) { - this.headers = headers; + if (null != headers) { + this.headers = headers; + } else { + this.headers.clear(); + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 15ad74da..c4d85dd2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -12,6 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.RequestReader; +import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; @@ -24,6 +26,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionContext; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; @@ -68,6 +71,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private Context lambdaContext; private Map attributes; private ServletContext servletContext; + private AwsHttpSession session; protected DispatcherType dispatcherType; @@ -101,13 +105,17 @@ public String getRequestedSessionId() { @Override public HttpSession getSession(boolean b) { - return null; + if (b && null == this.session) { + ApiGatewayRequestContext requestContext = (ApiGatewayRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + this.session = new AwsHttpSession(requestContext.getRequestId()); + } + return this.session; } @Override public HttpSession getSession() { - return null; + return this.session; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 4ebfd893..52b6b80a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -53,6 +53,7 @@ public class AwsHttpServletResponse private int statusCode; private String statusMessage; private String responseBody; + private PrintWriter writer; private ByteArrayOutputStream bodyOutputStream = new ByteArrayOutputStream(); private CountDownLatch writersCountDownLatch; private AwsHttpServletRequest request; @@ -316,7 +317,10 @@ public void close() @Override public PrintWriter getWriter() throws IOException { - return new PrintWriter(bodyOutputStream); + if (null == writer) { + writer = new PrintWriter(bodyOutputStream); + } + return writer; } @@ -358,7 +362,11 @@ public int getBufferSize() { @Override public void flushBuffer() throws IOException { + if (null != writer) { + writer.flush(); + } responseBody = new String(bodyOutputStream.toByteArray()); + log.debug("Response buffer flushed with {} bytes, latch={}", responseBody.length(), writersCountDownLatch.getCount()); isCommitted = true; writersCountDownLatch.countDown(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java new file mode 100644 index 00000000..6aca5947 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -0,0 +1,111 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionContext; +import java.util.Enumeration; + +public class AwsHttpSession implements HttpSession { + + private static final Logger log = LoggerFactory.getLogger(AwsHttpSession.class); + private String id; + + /** + * @param id API gateway request ID. + */ + public AwsHttpSession(String id) { + if (null == id) { + throw new RuntimeException("HTTP session id (from request ID) cannot be null"); + } + log.debug("Creating session " + id); + this.id = id; + } + + @Override + public long getCreationTime() { + return 0; + } + + @Override + public String getId() { + return id; + } + + @Override + public long getLastAccessedTime() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public void setMaxInactiveInterval(int interval) { + + } + + @Override + public int getMaxInactiveInterval() { + return 0; + } + + @Override + public HttpSessionContext getSessionContext() { + return null; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Object getValue(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String[] getValueNames() { + return new String[0]; + } + + @Override + public void setAttribute(String name, Object value) { + + } + + @Override + public void putValue(String name, Object value) { + + } + + @Override + public void removeAttribute(String name) { + + } + + @Override + public void removeValue(String name) { + + } + + @Override + public void invalidate() { + + } + + @Override + public boolean isNew() { + return false; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 39d7806e..cc6697cf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -176,11 +177,13 @@ protected void setServletContext(final ServletContext context) { * Applies the filter chain in the request lifecycle * @param request The Request object. This must be an implementation of HttpServletRequest * @param response The response object. This must be an implementation of HttpServletResponse + * @param servlet Servlet at the end of the chain (optional). * @throws IOException * @throws ServletException */ - protected void doFilter(ContainerRequestType request, ContainerResponseType response) throws IOException, ServletException { - FilterChainHolder chain = filterChainManager.getFilterChain(request); + protected void doFilter(ContainerRequestType request, ContainerResponseType response, Servlet servlet) throws IOException, ServletException { + FilterChainHolder chain = filterChainManager.getFilterChain(request, servlet); + log.debug("FilterChainHolder.doFilter {}", chain); chain.doFilter(request, response); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 5f836ef1..7245522e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -196,9 +196,13 @@ public String getPathTranslated() { } + /** + * In AWS API Gateway, stage is never given as part of the path. + * @return + */ @Override public String getContextPath() { - return request.getRequestContext().getStage(); + return ""; } @@ -228,7 +232,7 @@ public Principal getUserPrincipal() { @Override public String getRequestURI() { - return request.getPath(); + return (getContextPath().isEmpty() ? "" : "/" + getContextPath()) + request.getPath(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index fcdbcb5e..957af0f0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -34,6 +34,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; @@ -141,9 +142,16 @@ public int getEffectiveMinorVersion() { @Override public String getMimeType(String s) { try { - return Files.probeContentType(Paths.get(s)); + + if (s.startsWith("file:")) { // Support paths such as file:/D:/something/hello.txt + return Files.probeContentType(Paths.get(URI.create(s))); + } else if (s.startsWith("/")) { // Support paths such as file:/D:/something/hello.txt + return Files.probeContentType(Paths.get(URI.create("file://" + s))); + } else { + return Files.probeContentType(Paths.get(s)); + } } catch (IOException e) { - log.warn("Could not find content type for filter", e); + log.warn("Could not find content type for file {}", s, e); return null; } } @@ -364,6 +372,8 @@ public FilterRegistration.Dynamic addFilter(String name, Filter filter) { // filter already exists, we do nothing if (filters.containsKey(name)) { return null; + } else { + log.debug("Adding filter '{}' from {}", name, filter); } FilterHolder newFilter = new FilterHolder(name, filter, this); @@ -376,6 +386,7 @@ public FilterRegistration.Dynamic addFilter(String name, Filter filter) { @Override public FilterRegistration.Dynamic addFilter(String name, Class filterClass) { try { + log.debug("Adding filter '{}' from {}", name, filterClass.getName()); Filter newFilter = createFilter(filterClass); return addFilter(name, newFilter); } catch (ServletException e) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index 47c5ebe6..eb42cff7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -15,10 +15,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.ArrayList; @@ -30,6 +28,7 @@ * during a request lifecycle */ public class FilterChainHolder implements FilterChain { + private final Servlet servlet; //------------------------------------------------------------- // Variables - Private @@ -47,19 +46,22 @@ public class FilterChainHolder implements FilterChain { /** * Creates a new empty FilterChainHolder + * @param servlet */ - FilterChainHolder() { - this(new ArrayList<>()); + FilterChainHolder(Servlet servlet) { + this(new ArrayList<>(), servlet); } /** * Creates a new instance of a filter chain holder * @param allFilters A populated list of FilterHolder objects + * @param servlet */ - FilterChainHolder(List allFilters) { + FilterChainHolder(List allFilters, Servlet servlet) { filters = allFilters; resetHolder(); + this.servlet = servlet; } @@ -70,9 +72,19 @@ public class FilterChainHolder implements FilterChain { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { currentFilter++; - if (filters == null || filters.size() == 0 || currentFilter > filters.size() - 1) { + if (filters == null || filters.size() == 0 ) { log.debug("Could not find filters to execute, returning"); return; + } else if (currentFilter > filters.size() - 1) { + if (null != servlet) { + log.debug("Starting servlet {}", servlet); + servlet.service(servletRequest, servletResponse); + log.debug("Executed servlet {}", servlet); + return; + } else { + log.debug("No more filters"); + return; + } } // TODO: We do not check for async filters here @@ -82,9 +94,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (!holder.isFilterInitialized()) { holder.init(); } - log.debug("Starting filter " + holder.getFilterName()); + log.debug("Starting {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), + currentFilter, holder.getFilterName(), holder.getFilter()); holder.getFilter().doFilter(servletRequest, servletResponse, this); - log.debug("Executed filter " + holder.getFilterName()); + log.debug("Executed {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), + currentFilter, holder.getFilterName(), holder.getFilter()); + currentFilter--; } @@ -144,4 +159,9 @@ public List getFilters() { private void resetHolder() { currentFilter = -1; } + + @Override + public String toString() { + return "filters=" + filters + ", servlet=" + servlet; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 79bbbc75..6ddfeadf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; import javax.servlet.DispatcherType; +import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -81,18 +82,19 @@ public abstract class FilterChainManagerFilterChainHolder object that can be used to apply the filters to the request */ - FilterChainHolder getFilterChain(final HttpServletRequest request) { + FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servlet) { String targetPath = request.getServletPath(); DispatcherType type = request.getDispatcherType(); // only return the cached result if the filter list hasn't changed in the meanwhile - if (getFilterHolders().size() == filtersSize && getFilterChainCache(type, targetPath) != null) { - return getFilterChainCache(type, targetPath); + if (getFilterHolders().size() == filtersSize && getFilterChainCache(type, targetPath, servlet) != null) { + return getFilterChainCache(type, targetPath, servlet); } - FilterChainHolder chainHolder = new FilterChainHolder(); + FilterChainHolder chainHolder = new FilterChainHolder(servlet); Map registrations = getFilterHolders(); if (registrations == null || registrations.size() == 0) { @@ -134,9 +136,10 @@ FilterChainHolder getFilterChain(final HttpServletRequest request) { * initialized with the cached list of {@link FilterHolder} objects * @param type The dispatcher type for the incoming request * @param targetPath The request path - this is extracted with the getPath method of the request object + * @param servlet Servlet to put at the end of the chain (optional). * @return A populated FilterChainHolder */ - private FilterChainHolder getFilterChainCache(final DispatcherType type, final String targetPath) { + private FilterChainHolder getFilterChainCache(final DispatcherType type, final String targetPath, Servlet servlet) { TargetCacheKey key = new TargetCacheKey(); key.setDispatcherType(type); key.setTargetPath(targetPath); @@ -145,7 +148,7 @@ private FilterChainHolder getFilterChainCache(final DispatcherType type, final S return null; } - return new FilterChainHolder(filterCache.get(key)); + return new FilterChainHolder(filterCache.get(key), servlet); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index daa31828..a8446b14 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -29,7 +29,7 @@ public class FilterHolder { //------------------------------------------------------------- private Filter filter; - private FilterConfig filterConfig; + private FilterConfig filterConfig = new Config(); private Registration registration; private String filterName; private Map initParameters; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index bdfd90fb..1c9b4d36 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -62,10 +62,12 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { this.mapper = new ObjectMapper(); this.request = new AwsProxyRequest(); + this.request.setHeaders(new HashMap<>()); // avoid NPE this.request.setHttpMethod(httpMethod); this.request.setPath(path); this.request.setQueryStringParameters(new HashMap<>()); this.request.setRequestContext(new ApiGatewayRequestContext()); + this.request.getRequestContext().setRequestId("test-invoke-request"); this.request.getRequestContext().setStage("test"); ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity(); identity.setSourceIp("127.0.0.1"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 84f320b9..c5ed8f24 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -115,21 +115,21 @@ public void filterChain_getFilterChain_subsetOfFilters() { new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); - FilterChainHolder fcHolder = chainManager.getFilterChain(req); + FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/second/mime", "GET").build(), lambdaContext, null ); - fcHolder = chainManager.getFilterChain(req); + fcHolder = chainManager.getFilterChain(req, null); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter2", fcHolder.getFilter(0).getFilterName()); req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/second/mime/third", "GET").build(), lambdaContext, null ); - fcHolder = chainManager.getFilterChain(req); + fcHolder = chainManager.getFilterChain(req, null); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter2", fcHolder.getFilter(0).getFilterName()); } @@ -140,7 +140,7 @@ public void filterChain_matchMultipleTimes_expectSameMatch() { new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); - FilterChainHolder fcHolder = chainManager.getFilterChain(req); + FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); @@ -148,7 +148,7 @@ public void filterChain_matchMultipleTimes_expectSameMatch() { new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); - FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2); + FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2, null); assertEquals(1, fcHolder2.filterCount()); assertEquals("Filter1", fcHolder2.getFilter(0).getFilterName()); } @@ -159,7 +159,7 @@ public void filerChain_executeMultipleFilters_expectRunEachTime() { new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); - FilterChainHolder fcHolder = chainManager.getFilterChain(req); + FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); assertEquals(1, fcHolder.filterCount()); assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); AwsHttpServletResponse resp = new AwsHttpServletResponse(req, new CountDownLatch(1)); @@ -183,7 +183,7 @@ public void filerChain_executeMultipleFilters_expectRunEachTime() { new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req2.setServletContext(servletContext); - FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2); + FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2, null); assertEquals(1, fcHolder2.filterCount()); assertEquals("Filter1", fcHolder2.getFilter(0).getFilterName()); assertEquals(-1, fcHolder2.currentFilter); @@ -212,14 +212,14 @@ public void filterChain_getFilterChain_multipleFilters() { req.setServletContext(servletContext); FilterRegistration.Dynamic reg = req.getServletContext().addFilter("Filter4", new MockFilter()); reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/second/*"); - FilterChainHolder fcHolder = chainManager.getFilterChain(req); + FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); assertEquals(2, fcHolder.filterCount()); assertEquals("Filter2", fcHolder.getFilter(0).getFilterName()); assertEquals("Filter4", fcHolder.getFilter(1).getFilterName()); reg = req.getServletContext().addFilter("Filter5", new MockFilter()); reg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/second/*"); - fcHolder = chainManager.getFilterChain(req); + fcHolder = chainManager.getFilterChain(req, null); assertEquals(3, fcHolder.filterCount()); assertEquals("Filter2", fcHolder.getFilter(0).getFilterName()); assertEquals("Filter4", fcHolder.getFilter(1).getFilterName()); diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index b4a059d3..6c7aa1a4 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -164,7 +164,7 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH } } - doFilter(httpServletRequest, httpServletResponse); + doFilter(httpServletRequest, httpServletResponse, null); embeddedServer.handle(httpServletRequest, httpServletResponse); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java new file mode 100644 index 00000000..de7ce509 --- /dev/null +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -0,0 +1,254 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.*; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.SpringServletContainerInitializer; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; +import java.util.*; +import java.util.concurrent.CountDownLatch; + +/** + * Spring implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` + * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and + * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. + * + * Important: Make sure to add {@link LambdaFlushResponseListener} in your SpringBootServletInitializer subclass configure(). + * + * @param The incoming event type + * @param The expected return type + */ +public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { + static ThreadLocal currentResponse = new ThreadLocal<>(); + private final Class springBootInitializer; + private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); + + // State vars + private boolean initialized; + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException + */ + public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) + throws ContainerInitializationException { + return new SpringBootLambdaContainerHandler<>( + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer + ); + } + + /** + * Creates a new container handler with the given reader and writer objects + * + * @param requestReader An implementation of `RequestReader` + * @param responseWriter An implementation of `ResponseWriter` + * @param securityContextWriter An implementation of `SecurityContextWriter` + * @param exceptionHandler An implementation of `ExceptionHandler` + * @throws ContainerInitializationException + */ + public SpringBootLambdaContainerHandler(RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler, + Class springBootInitializer) + throws ContainerInitializationException { + super(requestReader, responseWriter, securityContextWriter, exceptionHandler); + this.springBootInitializer = springBootInitializer; + } + + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + // this method of the AwsLambdaServletContainerHandler sets the servlet context + if (getServletContext() == null) { + setServletContext(new SpringBootAwsServletContext()); + } + + // wire up the application context on the first invocation + if (!initialized) { + SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); + LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); + webAppInitializers.add(springBootInitializer); + springServletContainerInitializer.onStartup(webAppInitializers, getServletContext()); + initialized = true; + } + + containerRequest.setServletContext(getServletContext()); + + currentResponse.set(containerResponse); + try { + WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); + DispatcherServlet dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + // process filters & invoke servlet + log.debug("Process filters & invoke servlet: {}", dispatcherServlet); + doFilter(containerRequest, containerResponse, dispatcherServlet); + } finally { + // call the flush method to release the latch + SpringBootLambdaContainerHandler.currentResponse.remove(); + currentResponse.remove(); + } + } + + private class SpringBootAwsServletContext extends AwsServletContext { + public SpringBootAwsServletContext() { + super(SpringBootLambdaContainerHandler.this); + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, String s1) { + throw new UnsupportedOperationException("Only dispatcherServlet is supported"); + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, Class aClass) { + throw new UnsupportedOperationException("Only dispatcherServlet is supported"); + } + + @Override + public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) { + if ("dispatcherServlet".equals(s)) { + try { + servlet.init(new ServletConfig() { + @Override + public String getServletName() { + return s; + } + + @Override + public ServletContext getServletContext() { + return SpringBootAwsServletContext.this; + } + + @Override + public String getInitParameter(String name) { + return null; + } + + @Override + public Enumeration getInitParameterNames() { + return new Enumeration() { + @Override + public boolean hasMoreElements() { + return false; + } + + @Override + public String nextElement() { + return null; + } + }; + } + }); + } catch (ServletException e) { + throw new RuntimeException("Cannot add servlet " + servlet, e); + } + return new ServletRegistration.Dynamic() { + @Override + public String getName() { + return s; + } + + @Override + public String getClassName() { + return null; + } + + @Override + public boolean setInitParameter(String name, String value) { + return false; + } + + @Override + public String getInitParameter(String name) { + return null; + } + + @Override + public Set setInitParameters(Map initParameters) { + return null; + } + + @Override + public Map getInitParameters() { + return null; + } + + @Override + public Set addMapping(String... urlPatterns) { + return null; + } + + @Override + public Collection getMappings() { + return null; + } + + @Override + public String getRunAsRole() { + return null; + } + + @Override + public void setAsyncSupported(boolean isAsyncSupported) { + + } + + @Override + public void setLoadOnStartup(int loadOnStartup) { + + } + + @Override + public Set setServletSecurity(ServletSecurityElement constraint) { + return null; + } + + @Override + public void setMultipartConfig(MultipartConfigElement multipartConfig) { + + } + + @Override + public void setRunAsRole(String roleName) { + + } + }; + } else { + throw new UnsupportedOperationException("Only dispatcherServlet is supported"); + } + } + } +} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index f3a932b0..9c4950ba 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -21,7 +21,6 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import javax.servlet.ServletContext; import java.util.Arrays; import java.util.concurrent.CountDownLatch; @@ -136,7 +135,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt containerRequest.setServletContext(getServletContext()); // process filters - doFilter(containerRequest, containerResponse); + doFilter(containerRequest, containerResponse, null); // invoke servlet initializer.dispatch(containerRequest, containerResponse); } From d237c38f35024229306756bc467c7047bebbb2d5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 08:40:16 -0700 Subject: [PATCH 0040/1214] Fixed tests that were failing because of pull request #65 --- .../serverless/proxy/spring/SpringAwsProxyTest.java | 6 +++--- .../serverless/proxy/spring/echoapp/EchoResource.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 9d6ee9e1..b94e60b0 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -209,16 +209,16 @@ public void request_requestURI() { @Test public void request_requestURL() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-Url", "GET") + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-url", "GET") .scheme("https") .serverName("api.myserver.com") .stage("prod") .build(); - + handler.stripBasePath(""); AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - validateSingleValueModel(output, "https://api.myserver.com/prod/echo/request-Url"); + validateSingleValueModel(output, "https://api.myserver.com/echo/request-url"); } @Test diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 55deb7ed..af6ae2fb 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -102,7 +102,7 @@ public SingleValueModel echoRequestURI(HttpServletRequest request) { return valueModel; } - @RequestMapping(path = "/request-Url", method = RequestMethod.GET) + @RequestMapping(path = "/request-url", method = RequestMethod.GET) public SingleValueModel echoRequestURL(HttpServletRequest request) { SingleValueModel valueModel = new SingleValueModel(); valueModel.setValue(request.getRequestURL().toString()); From 3cd6184557593a51ea1deb9c118a0f819d517784 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 08:54:02 -0700 Subject: [PATCH 0041/1214] Minor change to embedded server for Spark - running into a build issue I cannot replicate in local --- .../proxy/spark/embeddedserver/LambdaEmbeddedServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index e6c8541f..ee51c44f 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -49,11 +49,11 @@ public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) throws Exception { log.info("Starting Spark server, ignoring port and host"); sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, false, hasMultipleHandler); - sparkFilter.init(null); + //sparkFilter.init(null); //countDownLatch.countDown(); - return 0; + return i; } From fb8d656989ce4fee1ccf44ca31da77ff64fe2336 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 09:06:02 -0700 Subject: [PATCH 0042/1214] More minor changes to address build failres for spark. Still cannot replicate in local --- .../proxy/spark/embeddedserver/LambdaEmbeddedServer.java | 3 --- .../proxy/spark/SparkLambdaContainerHandlerTest.java | 5 +++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index ee51c44f..b3bfe275 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -49,9 +49,6 @@ public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) throws Exception { log.info("Starting Spark server, ignoring port and host"); sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, false, hasMultipleHandler); - //sparkFilter.init(null); - - //countDownLatch.countDown(); return i; } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index ecf09226..101baddd 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -9,6 +9,7 @@ import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import spark.Spark; @@ -34,7 +35,7 @@ public void filters_onStartupMethod_executeFilters() { e.printStackTrace(); fail(); } - + handler.onStartup(c -> { if (c == null) { System.out.println("Null servlet context"); @@ -64,7 +65,7 @@ public static void stopSpark() { Spark.stop(); } - private void configureRoutes() { + private static void configureRoutes() { get("/header-filter", (req, res) -> { res.status(200); return RESPONSE_BODY_TEXT; From 0433b6b778560e1da5fb07a691d963b5e1f4641a Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 09:15:03 -0700 Subject: [PATCH 0043/1214] Still flying blind, move Spark filter initialization to constructor of the embedded server object --- .../proxy/spark/embeddedserver/LambdaEmbeddedServer.java | 8 +++++++- .../proxy/spark/SparkLambdaContainerHandlerTest.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index b3bfe275..b8228255 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -38,6 +38,9 @@ public class LambdaEmbeddedServer applicationRoutes = routes; staticFilesConfiguration = filesConfig; hasMultipleHandler = multipleHandlers; + + // try to initialize the filter here. + sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, true, hasMultipleHandler); } @@ -48,7 +51,10 @@ public class LambdaEmbeddedServer public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) throws Exception { log.info("Starting Spark server, ignoring port and host"); - sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, false, hasMultipleHandler); + // if not initialized yet + if (sparkFilter == null) { + sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, true, hasMultipleHandler); + } return i; } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 101baddd..4790358c 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -35,7 +35,7 @@ public void filters_onStartupMethod_executeFilters() { e.printStackTrace(); fail(); } - + handler.onStartup(c -> { if (c == null) { System.out.println("Null servlet context"); From c677a2014855f517ff51b11bc65f73242c171397 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 13:07:13 -0700 Subject: [PATCH 0044/1214] Moved execution of servlet to the filter chain to allow filters to halt execution. The servlet is injected in the chain by the FilterChainManager. This should fix the last issues with #65 and fix #66 --- .../AwsLambdaServletContainerHandler.java | 8 ++- .../internal/servlet/FilterChainHolder.java | 53 ++++++++----------- .../internal/servlet/FilterChainManager.java | 48 ++++++++++++++++- .../spark/SparkLambdaContainerHandler.java | 10 +++- .../embeddedserver/LambdaEmbeddedServer.java | 10 ++++ .../SparkLambdaContainerHandlerTest.java | 50 +++++++++++++++++ .../spark/filter/UnauthenticatedFilter.java | 45 ++++++++++++++++ .../LambdaSpringApplicationInitializer.java | 24 ++++++++- .../spring/SpringLambdaContainerHandler.java | 4 +- .../proxy/spring/SpringAwsProxyTest.java | 13 +++++ .../spring/echoapp/EchoSpringAppConfig.java | 11 ++++ .../spring/echoapp/UnauthenticatedFilter.java | 45 ++++++++++++++++ 12 files changed, 279 insertions(+), 42 deletions(-) create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index cc6697cf..ade16b26 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.FilterChain; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -168,6 +169,10 @@ protected void setServletContext(final ServletContext context) { filterChainManager = new AwsFilterChainManager((AwsServletContext)context); } + protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet) { + return filterChainManager.getFilterChain(req, servlet); + } + //------------------------------------------------------------- // Methods - Protected @@ -182,12 +187,11 @@ protected void setServletContext(final ServletContext context) { * @throws ServletException */ protected void doFilter(ContainerRequestType request, ContainerResponseType response, Servlet servlet) throws IOException, ServletException { - FilterChainHolder chain = filterChainManager.getFilterChain(request, servlet); + FilterChain chain = getFilterChain(request, servlet); log.debug("FilterChainHolder.doFilter {}", chain); chain.doFilter(request, response); } - //------------------------------------------------------------- // Inner Class - //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index eb42cff7..af7ba7a7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -28,7 +28,6 @@ * during a request lifecycle */ public class FilterChainHolder implements FilterChain { - private final Servlet servlet; //------------------------------------------------------------- // Variables - Private @@ -46,22 +45,19 @@ public class FilterChainHolder implements FilterChain { /** * Creates a new empty FilterChainHolder - * @param servlet */ - FilterChainHolder(Servlet servlet) { - this(new ArrayList<>(), servlet); + FilterChainHolder() { + this(new ArrayList<>()); } /** * Creates a new instance of a filter chain holder * @param allFilters A populated list of FilterHolder objects - * @param servlet */ - FilterChainHolder(List allFilters, Servlet servlet) { + FilterChainHolder(List allFilters) { filters = allFilters; resetHolder(); - this.servlet = servlet; } @@ -72,34 +68,27 @@ public class FilterChainHolder implements FilterChain { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { currentFilter++; - if (filters == null || filters.size() == 0 ) { - log.debug("Could not find filters to execute, returning"); - return; - } else if (currentFilter > filters.size() - 1) { - if (null != servlet) { - log.debug("Starting servlet {}", servlet); - servlet.service(servletRequest, servletResponse); - log.debug("Executed servlet {}", servlet); - return; - } else { - log.debug("No more filters"); - return; - } - } // TODO: We do not check for async filters here - FilterHolder holder = filters.get(currentFilter); + // if we still have filters, keep running through the chain + if (currentFilter <= filters.size() - 1) { + FilterHolder holder = filters.get(currentFilter); + + // lazily initialize filters when they are needed + if (!holder.isFilterInitialized()) { + holder.init(); + } + log.debug("Starting {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), + currentFilter, holder.getFilterName(), holder.getFilter()); + holder.getFilter().doFilter(servletRequest, servletResponse, this); + log.debug("Executed {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), + currentFilter, holder.getFilterName(), holder.getFilter()); + } - // lazily initialize filters when they are needed - if (!holder.isFilterInitialized()) { - holder.init(); + // if for some reason the response wasn't flushed yet, we force it here. + if (!servletResponse.isCommitted()) { + servletResponse.flushBuffer(); } - log.debug("Starting {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), - currentFilter, holder.getFilterName(), holder.getFilter()); - holder.getFilter().doFilter(servletRequest, servletResponse, this); - log.debug("Executed {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), - currentFilter, holder.getFilterName(), holder.getFilter()); - currentFilter--; } @@ -162,6 +151,6 @@ private void resetHolder() { @Override public String toString() { - return "filters=" + filters + ", servlet=" + servlet; + return "filters=" + filters; } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 6ddfeadf..bd323349 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -13,10 +13,17 @@ package com.amazonaws.serverless.proxy.internal.servlet; import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; import javax.servlet.Servlet; import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -94,10 +101,13 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl return getFilterChainCache(type, targetPath, servlet); } - FilterChainHolder chainHolder = new FilterChainHolder(servlet); + FilterChainHolder chainHolder = new FilterChainHolder(); Map registrations = getFilterHolders(); if (registrations == null || registrations.size() == 0) { + if (servlet != null) { + chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servlet), servletContext)); + } return chainHolder; } for (String name : registrations.keySet()) { @@ -117,6 +127,10 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl // we assume we only ever have one servlet. } + if (servlet != null) { + chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servlet), servletContext)); + } + putFilterChainCache(type, targetPath, chainHolder); // update total filter size if (filtersSize != registrations.size()) { @@ -148,7 +162,7 @@ private FilterChainHolder getFilterChainCache(final DispatcherType type, final S return null; } - return new FilterChainHolder(filterCache.get(key), servlet); + return new FilterChainHolder(filterCache.get(key)); } @@ -303,4 +317,34 @@ void setDispatcherType(DispatcherType dispatcherType) { this.dispatcherType = dispatcherType; } } + + private class ServletExecutionFilter implements Filter { + + private FilterConfig config; + private Servlet handlerServlet; + + public ServletExecutionFilter(Servlet handler) { + handlerServlet = handler; + } + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + config = filterConfig; + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + handlerServlet.service(servletRequest, servletResponse); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + + } + } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 6c7aa1a4..7f609855 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -29,9 +29,13 @@ import spark.embeddedserver.EmbeddedServerFactory; import spark.embeddedserver.EmbeddedServers; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.EnumSet; import java.util.concurrent.CountDownLatch; /** @@ -162,10 +166,12 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH if (startupHandler != null) { startupHandler.onStartup(getServletContext()); } + + // manually add the spark filter to the chain. This should the last one and match all uris + FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); + sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); } doFilter(httpServletRequest, httpServletResponse, null); - - embeddedServer.handle(httpServletRequest, httpServletResponse); } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index b8228255..1025b0a0 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -9,6 +9,7 @@ import spark.ssl.SslStores; import spark.staticfiles.StaticFilesConfiguration; +import javax.servlet.Filter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -95,4 +96,13 @@ public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { sparkFilter.doFilter(request, response, null); } + + + /** + * Returns the initialized instance of the main Spark filter. + * @return The spark filter instance. + */ + public Filter getSparkFilter() { + return sparkFilter; + } } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 4790358c..154485e1 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -7,6 +7,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; +import com.amazonaws.serverless.proxy.spark.filter.UnauthenticatedFilter; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -60,6 +61,50 @@ public void filters_onStartupMethod_executeFilters() { } + @Test + public void filters_unauthenticatedFilter_stopRequestProcessing() { + + SparkLambdaContainerHandler handler = null; + try { + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail(); + } + + handler.onStartup(c -> { + if (c == null) { + System.out.println("Null servlet context"); + fail(); + } + FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); + // update the registration to map to a path + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/unauth"); + // servlet name mappings are disabled and will throw an exception + }); + + configureRoutes(); + + // first we test without the custom header, we expect request processing to complete + // successfully + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/unauth").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + assertNotNull(response); + assertEquals(200, response.getStatusCode()); + assertEquals(RESPONSE_BODY_TEXT, response.getBody()); + + // now we test with the custom header, this should stop request processing in the + // filter and return an unauthenticated response + AwsProxyRequest unauthReq = new AwsProxyRequestBuilder().method("GET").path("/unauth") + .header(UnauthenticatedFilter.HEADER_NAME, "1").build(); + AwsProxyResponse unauthResp = handler.proxy(unauthReq, new MockLambdaContext()); + + assertNotNull(unauthResp); + assertEquals(UnauthenticatedFilter.RESPONSE_STATUS, unauthResp.getStatusCode()); + assertEquals("", unauthResp.getBody()); + } + @AfterClass public static void stopSpark() { Spark.stop(); @@ -70,5 +115,10 @@ private static void configureRoutes() { res.status(200); return RESPONSE_BODY_TEXT; }); + + get("/unauth", (req, res) -> { + res.status(200); + return RESPONSE_BODY_TEXT; + }); } } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java new file mode 100644 index 00000000..60e8eb42 --- /dev/null +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.proxy.spark.filter; + + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + + +public class UnauthenticatedFilter implements Filter { + public static final String HEADER_NAME = "X-Unauthenticated-Response"; + public static final int RESPONSE_STATUS = 401; + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + System.out.println("Running unauth filter"); + if (((HttpServletRequest)servletRequest).getHeader(HEADER_NAME) != null) { + ((HttpServletResponse) servletResponse).setStatus(401); + System.out.println("Returning 401"); + return; + } + System.out.println("Continue chain"); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + + } +} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 45a9e1e0..28e38a4a 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -27,6 +27,7 @@ import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.*; +import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -42,7 +43,7 @@ * `currentResponse` private property to the value of the new `HttpServletResponse` object. This is used to intercept * Spring notifications for the `ServletRequestHandledEvent` and call the flush method to release the latch. */ -public class LambdaSpringApplicationInitializer implements WebApplicationInitializer { +public class LambdaSpringApplicationInitializer extends HttpServlet implements WebApplicationInitializer { public static final String ERROR_NO_CONTEXT = "No application context or configuration classes provided"; private static final String DEFAULT_SERVLET_NAME = "aws-servless-java-container"; @@ -98,6 +99,15 @@ public void dispatch(HttpServletRequest request, HttpServletResponse response) dispatcherServlet.service(request, response); } + + /** + * Gets the initialized Spring dispatcher servlet instance. + * @return + */ + public Servlet getDispatcherServlet() { + return dispatcherServlet; + } + public List getSpringProfiles() { return Collections.unmodifiableList(springProfiles); } @@ -151,6 +161,18 @@ private void notifyStartListeners(ServletContext context) { } } + + /////////////////////////////////////////////////////////////// + // HttpServlet implementation // + // This is used to pass the initializer to the filter chain // + // to handle requests // + /////////////////////////////////////////////////////////////// + + @Override + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + dispatch((HttpServletRequest)req, (HttpServletResponse)res); + } + /** * Default configuration class for the DispatcherServlet. This just mocks the behaviour of a default * ServletConfig object with no init parameters diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 9c4950ba..9ac03516 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -135,8 +135,6 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt containerRequest.setServletContext(getServletContext()); // process filters - doFilter(containerRequest, containerResponse, null); - // invoke servlet - initializer.dispatch(containerRequest, containerResponse); + doFilter(containerRequest, containerResponse, initializer); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index b94e60b0..ac3420ef 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -6,6 +6,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; +import com.amazonaws.serverless.proxy.spring.echoapp.UnauthenticatedFilter; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import com.fasterxml.jackson.core.JsonProcessingException; @@ -139,6 +140,18 @@ public void error_statusCode_methodNotAllowed() { assertEquals(405, output.getStatusCode()); } + @Test + public void error_unauthenticatedCall_filterStepsRequest() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "GET") + .header(UnauthenticatedFilter.HEADER_NAME, "1") + .json() + .queryString("status", "201") + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(401, output.getStatusCode()); + } + @Test public void responseBody_responseWriter_validBody() throws JsonProcessingException { SingleValueModel singleValueModel = new SingleValueModel(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index 93134c1b..1f068f8f 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -13,6 +13,11 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.web.context.ConfigurableWebApplicationContext; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + +import java.util.EnumSet; + @Configuration @ComponentScan("com.amazonaws.serverless.proxy.spring.echoapp") @@ -26,6 +31,12 @@ public class EchoSpringAppConfig { public SpringLambdaContainerHandler springLambdaContainerHandler() throws ContainerInitializationException { SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext); handler.setRefreshContext(false); + handler.onStartup(c -> { + FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); + // update the registration to map to a path + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*"); + // servlet name mappings are disabled and will throw an exception + }); return handler; } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java new file mode 100644 index 00000000..b6340157 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.proxy.spring.echoapp; + + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + + +public class UnauthenticatedFilter implements Filter { + public static final String HEADER_NAME = "X-Unauthenticated-Response"; + public static final int RESPONSE_STATUS = 401; + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + System.out.println("Running unauth filter"); + if (((HttpServletRequest)servletRequest).getHeader(HEADER_NAME) != null) { + ((HttpServletResponse) servletResponse).setStatus(401); + System.out.println("Returning 401"); + return; + } + System.out.println("Continue chain"); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + + } +} From a0e140429b741c2e04ac64f9304d7e04881b878c Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Oct 2017 14:03:28 -0700 Subject: [PATCH 0045/1214] Added check to avoid NPE when mapping null request body. Addresses #70 --- .../servlet/AwsProxyHttpServletRequest.java | 3 ++ .../proxy/spring/SpringAwsProxyTest.java | 28 +++++++++++++++++++ .../proxy/spring/echoapp/EchoResource.java | 11 ++++++++ 3 files changed, 42 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 7245522e..0792098d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -386,6 +386,9 @@ public String getContentType() { @Override public ServletInputStream getInputStream() throws IOException { + if (request.getBody() == null) { + return null; + } byte[] bodyBytes = request.getBody().getBytes(); if (request.isBase64Encoded()) { bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index ac3420ef..1cbeaef4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -189,6 +189,34 @@ public void base64_binaryResponse_base64Encoding() { assertTrue(Base64.isBase64(response.getBody())); } + @Test + public void injectBody_populatedResponse_noException() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-body", "POST") + .body("This is a populated body") + .build(); + + AwsProxyResponse response = handler.proxy(request, lambdaContext); + assertNotNull(response.getBody()); + try { + SingleValueModel output = objectMapper.readValue(response.getBody(), SingleValueModel.class); + assertEquals("true", output.getValue()); + } catch (IOException e) { + e.printStackTrace(); + fail(); + } + + AwsProxyRequest emptyReq = new AwsProxyRequestBuilder("/echo/request-body", "POST") + .build(); + AwsProxyResponse emptyResp = handler.proxy(emptyReq, lambdaContext); + try { + SingleValueModel output = objectMapper.readValue(emptyResp.getBody(), SingleValueModel.class); + assertEquals(null, output.getValue()); + } catch (IOException e) { + e.printStackTrace(); + fail(); + } + } + @Test public void servletRequestEncoding_acceptEncoding_okStatusCode() { SingleValueModel singleValueModel = new SingleValueModel(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index af6ae2fb..185bc7bd 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -110,6 +110,17 @@ public SingleValueModel echoRequestURL(HttpServletRequest request) { return valueModel; } + @RequestMapping(path = "/request-body", method = RequestMethod.POST) + public SingleValueModel helloForPopulatedBody(@RequestBody(required = false) String input) { + SingleValueModel valueModel = new SingleValueModel(); + System.out.println("Input: \"" + input + "\""); + if (input != null && !"null".equals(input)) { + valueModel.setValue("true"); + } + + return valueModel; + } + @RequestMapping(path = "/encoded-request-uri/{encoded-var}", method = RequestMethod.GET) public SingleValueModel echoEncodedRequestUri(@PathVariable("encoded-var") String encodedVar) { SingleValueModel valueModel = new SingleValueModel(); From 5b338ba637d7a0fab652fc5808d7d2260d7ac2b7 Mon Sep 17 00:00:00 2001 From: Jim Ancona Date: Fri, 10 Nov 2017 07:40:32 -0500 Subject: [PATCH 0046/1214] Initialize filterConfig to avoid NPE --- .../serverless/proxy/internal/servlet/FilterHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index daa31828..a8446b14 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -29,7 +29,7 @@ public class FilterHolder { //------------------------------------------------------------- private Filter filter; - private FilterConfig filterConfig; + private FilterConfig filterConfig = new Config(); private Registration registration; private String filterName; private Map initParameters; From 3104192fe4127dbb193527391fc6b59d1b33395b Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 20 Nov 2017 19:31:20 -0800 Subject: [PATCH 0047/1214] Fixed issue with encoded form parameters and added unit test for it --- .../servlet/AwsProxyHttpServletRequest.java | 22 +++++++++++-------- .../AwsProxyHttpServletRequestFormTest.java | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 0792098d..dc2a9550 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -707,13 +707,8 @@ private Map> getFormUrlEncodedParametersMap() { if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase().equals("post")) { return new HashMap<>(); } - String rawBodyContent; - try { - rawBodyContent = URLDecoder.decode(request.getBody(), DEFAULT_CHARACTER_ENCODING); - } catch (UnsupportedEncodingException e) { - log.warn("Could not decode body content - proceeding as if it was already decoded", e); - rawBodyContent = request.getBody(); - } + + String rawBodyContent = request.getBody(); Map> output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { @@ -725,10 +720,19 @@ private Map> getFormUrlEncodedParametersMap() { if (output.containsKey(parameterKeyValue[0])) { values = output.get(parameterKeyValue[0]); } - values.add(parameterKeyValue[1]); - output.put(parameterKeyValue[0], values); + values.add(decodeValueIfEncoded(parameterKeyValue[1])); + output.put(decodeValueIfEncoded(parameterKeyValue[0]), values); } return output; } + + private String decodeValueIfEncoded(String value) { + try { + return URLDecoder.decode(value, DEFAULT_CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + log.warn("Could not decode body content - proceeding as if it was already decoded", e); + return value; + } + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index f82ab9d9..62f3fe97 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -7,12 +7,14 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.client.entity.EntityBuilder; +import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.Test; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import java.io.IOException; import java.util.Random; @@ -29,6 +31,8 @@ public class AwsProxyHttpServletRequestFormTest { private static final String PART_VALUE_2 = "value2"; private static final String FILE_KEY = "file_upload_1"; + private static final String ENCODED_VALUE = "test123a%3D1%262@3"; + private static final HttpEntity MULTIPART_FORM_DATA = MultipartEntityBuilder.create() .addTextBody(PART_KEY_1, PART_VALUE_1) .addTextBody(PART_KEY_2, PART_VALUE_2) @@ -43,6 +47,24 @@ public class AwsProxyHttpServletRequestFormTest { .addTextBody(PART_KEY_2, PART_VALUE_2) .addBinaryBody(FILE_KEY, FILE_BYTES) .build(); + private static final String ENCODED_FORM_ENTITY = PART_KEY_1 + "=" + ENCODED_VALUE + "&" + PART_KEY_2 + "=" + PART_VALUE_2; + + @Test + public void postForm_getParam_getEncodedFullValue() { + try { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED) + .body(ENCODED_FORM_ENTITY) + .build(); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + assertNotNull(request.getParts()); + assertEquals("test123a=1&2@3", request.getParameter(PART_KEY_1)); + } catch (IOException | ServletException e) { + fail(e.getMessage()); + } + } + @Test public void postForm_getParts_parsing() { try { From 6c1d15966a86131908ccc0a4214e26a4086568e6 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 20 Nov 2017 19:42:23 -0800 Subject: [PATCH 0048/1214] Upgraded to latest version of spark to try and address #71 --- aws-serverless-java-container-spark/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5901f1fa..4fb1c3e0 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -15,7 +15,7 @@ - 2.6.0 + 2.7.1 From 1f9e957101bb0293fce42c9a273268e660835c7d Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 07:45:41 -0800 Subject: [PATCH 0049/1214] Added init method call for filter, still cannot replicate #71 in local --- .../proxy/spark/embeddedserver/LambdaEmbeddedServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index 1025b0a0..6885cc52 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -56,6 +56,7 @@ public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) if (sparkFilter == null) { sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, true, hasMultipleHandler); } + sparkFilter.init(null); return i; } From 558565c043239d04b78f0128812fd542dc6ec49c Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 10:58:13 -0800 Subject: [PATCH 0050/1214] Added the awaitInitialization() call as suggested in #71. --- .../serverless/proxy/spark/SparkLambdaContainerHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 7f609855..9c61f081 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -170,6 +170,10 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH // manually add the spark filter to the chain. This should the last one and match all uris FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + + // adding this call to make sure that the framework is fully initialized. This should address a race + // condition and solve GitHub issue #71. + Spark.awaitInitialization(); } doFilter(httpServletRequest, httpServletResponse, null); From ab7160b8f1b5077e5c6fa5a3947f6ef1d3563dda Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 11:44:25 -0800 Subject: [PATCH 0051/1214] Changes to address #55. Added a new CognitoUserPoolPrincipal object that exposes claims from the token. Also added support for custom claims. --- .../InvalidRequestEventException.java | 4 ++ .../jaxrs/AwsProxySecurityContext.java | 67 ++++++++++++++----- .../model/CognitoAuthorizerClaims.java | 16 +++++ .../testutils/AwsProxyRequestBuilder.java | 6 ++ .../jaxrs/AwsProxySecurityContextTest.java | 18 ++++- 5 files changed, 92 insertions(+), 19 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java index f20a8e55..faf82b9c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java @@ -22,4 +22,8 @@ public class InvalidRequestEventException extends Exception { public InvalidRequestEventException(String message, Exception e) { super(message, e); } + + public InvalidRequestEventException(String message) { + super(message); + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 816cf8af..46eb809c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.jaxrs; import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.internal.model.CognitoAuthorizerClaims; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; @@ -61,26 +62,33 @@ public AwsProxySecurityContext(final Context lambdaContext, final AwsProxyReques //------------------------------------------------------------- public Principal getUserPrincipal() { - return () -> { - if (getAuthenticationScheme() == null) { - return null; - } - - if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM)) { - return event.getRequestContext().getAuthorizer().getPrincipalId(); - } else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { - // if we received credentials from Cognito Federated Identities then we return the identity id - if (event.getRequestContext().getIdentity().getCognitoIdentityId() != null) { - return event.getRequestContext().getIdentity().getCognitoIdentityId(); - } else { // otherwise the user arn from the credentials - return event.getRequestContext().getIdentity().getUserArn(); + if (getAuthenticationScheme() == null) { + return () -> null; + } + + if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM) || getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { + return () -> { + if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM)) { + return event.getRequestContext().getAuthorizer().getPrincipalId(); + } else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { + // if we received credentials from Cognito Federated Identities then we return the identity id + if (event.getRequestContext().getIdentity().getCognitoIdentityId() != null) { + return event.getRequestContext().getIdentity().getCognitoIdentityId(); + } else { // otherwise the user arn from the credentials + return event.getRequestContext().getIdentity().getUserArn(); + } } - } else if (getAuthenticationScheme().equals(AUTH_SCHEME_COGNITO_POOL)) { - return event.getRequestContext().getAuthorizer().getClaims().getSubject(); - } - return null; - }; + // return null if we couldn't find a valid scheme + return null; + }; + } + + if (getAuthenticationScheme().equals(AUTH_SCHEME_COGNITO_POOL)) { + return new CognitoUserPoolPrincipal(event.getRequestContext().getAuthorizer().getClaims()); + } + + throw new RuntimeException("Cannot recognize authorization scheme in event"); } @@ -105,4 +113,27 @@ public String getAuthenticationScheme() { return null; } } + + + /** + * Custom object for request authorized with a Cognito User Pool authorizer. By casting the Principal + * object to this you can extract the Claims object included in the token. + */ + public class CognitoUserPoolPrincipal implements Principal { + + private CognitoAuthorizerClaims claims; + + CognitoUserPoolPrincipal(CognitoAuthorizerClaims c) { + claims = c; + } + + @Override + public String getName() { + return claims.getSubject(); + } + + public CognitoAuthorizerClaims getClaims() { + return claims; + } + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java index 697bce4e..6c370286 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java @@ -13,10 +13,14 @@ package com.amazonaws.serverless.proxy.internal.model; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; /** @@ -44,6 +48,8 @@ public class CognitoAuthorizerClaims { // Variables - Private //------------------------------------------------------------- + private Map claims = new HashMap<>(); + @JsonProperty(value = "sub") private String subject; @JsonProperty(value = "aud") @@ -69,6 +75,16 @@ public class CognitoAuthorizerClaims { // Methods - Getter/Setter //------------------------------------------------------------- + @JsonAnyGetter + public String getClaim(String claim) { + return claims.get(claim); + } + + @JsonAnySetter + public void setClaim(String claim, String value) { + claims.put(claim, value); + } + public String getSubject() { return this.subject; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 1c9b4d36..5ffd2941 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -189,6 +189,12 @@ public AwsProxyRequestBuilder cognitoUserPool(String identityId) { return this; } + public AwsProxyRequestBuilder claim(String claim, String value) { + this.request.getRequestContext().getAuthorizer().getClaims().setClaim(claim, value); + + return this; + } + public AwsProxyRequestBuilder cognitoIdentity(String identityId, String identityPoolId) { this.request.getRequestContext().getIdentity().setCognitoAuthenticationType("IDENTITY"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index c5d63158..255f2a0d 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -4,13 +4,17 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import org.junit.Test; +import java.security.Principal; + import static org.junit.Assert.*; public class AwsProxySecurityContextTest { + private static final String CLAIM_KEY = "custom:claim"; + private static final String CLAIM_VALUE = "customClaimant"; private static final String COGNITO_IDENTITY_ID = "us-east-2:123123123123"; private static final AwsProxyRequest REQUEST_NO_AUTH = new AwsProxyRequestBuilder("/hello", "GET").build(); private static final AwsProxyRequest REQUEST_COGNITO_USER_POOL = new AwsProxyRequestBuilder("/hello", "GET") - .cognitoUserPool(COGNITO_IDENTITY_ID).build(); + .cognitoUserPool(COGNITO_IDENTITY_ID).claim(CLAIM_KEY, CLAIM_VALUE).build(); @Test public void localVars_constructor_nullValues() { @@ -39,4 +43,16 @@ public void authScheme_getPrincipal_userPool() { assertEquals("COGNITO_USER_POOL", context.getAuthenticationScheme()); assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); } + + @Test + public void userPool_getClaims_retrieveCustomClaim() { + AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); + Principal userPrincipal = context.getUserPrincipal(); + assertNotNull(userPrincipal.getName()); + assertEquals(COGNITO_IDENTITY_ID, userPrincipal.getName()); + + assertTrue(userPrincipal instanceof AwsProxySecurityContext.CognitoUserPoolPrincipal); + assertNotNull(((AwsProxySecurityContext.CognitoUserPoolPrincipal)userPrincipal).getClaims().getClaim(CLAIM_KEY)); + assertEquals(CLAIM_VALUE, ((AwsProxySecurityContext.CognitoUserPoolPrincipal)userPrincipal).getClaims().getClaim(CLAIM_KEY)); + } } From de731558897499ab034bd7d19c28ccc6a5e18279 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 11:51:17 -0800 Subject: [PATCH 0052/1214] Another commit for #71. Looks like the awaitInitialization method needs to be called after the resources are defined --- README.md | 3 +++ .../com/amazonaws/serverless/sample/spark/LambdaHandler.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index b21c8701..210b948a 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,9 @@ public class LambdaHandler implements RequestHandler Date: Tue, 21 Nov 2017 12:03:07 -0800 Subject: [PATCH 0053/1214] Bumped Spark version in sample application --- samples/spark/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 7cad08a1..a291acf7 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.8.5 - 2.6.0 + 2.7.1 From a1b0798839b2674427987b78835b8e716d6bb1ba Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 14:32:07 -0800 Subject: [PATCH 0054/1214] Added awaitInitialization call in all spark unit tests --- .../amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java | 2 +- .../serverless/proxy/spark/InitExceptionHandlerTest.java | 2 +- .../proxy/spark/SparkLambdaContainerHandlerTest.java | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index d75595e2..3975a421 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -37,7 +37,7 @@ public static void initializeServer() { handler = SparkLambdaContainerHandler.getAwsProxyHandler(); configureRoutes(); - + Spark.awaitInitialization(); } catch (RuntimeException | ContainerInitializationException e) { e.printStackTrace(); fail(); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java index a0c976d5..a95497c2 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -44,7 +44,7 @@ public void initException_mockException_expectHandlerToRun() { serverFactory); configureRoutes(); - + Spark.awaitInitialization(); } catch (Exception e) { e.printStackTrace(); fail("Error while mocking server"); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 154485e1..f1884537 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -50,6 +50,8 @@ public void filters_onStartupMethod_executeFilters() { configureRoutes(); + Spark.awaitInitialization(); + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/header-filter").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); @@ -84,6 +86,7 @@ public void filters_unauthenticatedFilter_stopRequestProcessing() { }); configureRoutes(); + Spark.awaitInitialization(); // first we test without the custom header, we expect request processing to complete // successfully From 76b7ff329992c7106618332a13e5fcd3b7d31c58 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 20:41:16 -0800 Subject: [PATCH 0055/1214] Moved awaitInitialization call in Spark handler --- .../proxy/spark/SparkLambdaContainerHandler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 9c61f081..84492564 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -162,6 +162,10 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH log.debug("First request, getting new server instance"); embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); + // adding this call to make sure that the framework is fully initialized. This should address a race + // condition and solve GitHub issue #71. + Spark.awaitInitialization(); + // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { startupHandler.onStartup(getServletContext()); @@ -170,10 +174,6 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH // manually add the spark filter to the chain. This should the last one and match all uris FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - - // adding this call to make sure that the framework is fully initialized. This should address a race - // condition and solve GitHub issue #71. - Spark.awaitInitialization(); } doFilter(httpServletRequest, httpServletResponse, null); From eba3badc1a1351c330d6300e14fe5a2aa4569537 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 21 Nov 2017 21:15:36 -0800 Subject: [PATCH 0056/1214] Minor changes attempting to fix Spark unit tests --- .../internal/servlet/AwsLambdaServletContainerHandler.java | 2 +- .../serverless/proxy/spark/SparkLambdaContainerHandler.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index ade16b26..974117e5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -166,7 +166,7 @@ protected void setServletContext(final ServletContext context) { servletContext = context; // We assume custom implementations of the RequestWriter for HttpServletRequest will reuse // the existing AwsServletContext object since it has no dependencies other than the Lambda context - filterChainManager = new AwsFilterChainManager((AwsServletContext)context); + filterChainManager = new AwsFilterChainManager((AwsServletContext)servletContext); } protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet) { diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 84492564..746fa04e 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -160,12 +160,16 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH if (embeddedServer == null) { log.debug("First request, getting new server instance"); - embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); + + // trying to call init in case the embedded server had not been initialized. + Spark.init(); // adding this call to make sure that the framework is fully initialized. This should address a race // condition and solve GitHub issue #71. Spark.awaitInitialization(); + embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); + // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { startupHandler.onStartup(getServletContext()); From c63e59cc4e5c65803a9b44cf5519a789e4b3b17d Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 22 Nov 2017 08:12:04 -0800 Subject: [PATCH 0057/1214] Changed the surefire fork model for Spark --- aws-serverless-java-container-spark/pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 4fb1c3e0..66950fa0 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -41,4 +41,18 @@ + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.9 + + always + + + + + From 348e2fae5214588169b0e889826a27d762fb37d1 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 22 Nov 2017 08:40:59 -0800 Subject: [PATCH 0058/1214] Fixed javadoc comments for release --- .../spring/LambdaSpringApplicationInitializer.java | 10 +++++----- .../proxy/spring/SpringBootLambdaContainerHandler.java | 7 ++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 28e38a4a..e4414753 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -88,10 +88,10 @@ public void setRefreshContext(boolean refreshContext) { /** * Given a request and response objects, triggers the filters set in the servlet context and - * @param request - * @param response - * @throws ServletException - * @throws IOException + * @param request The incoming request + * @param response The response object Spring should write to. + * @throws ServletException When an error occurs during processing or of the request + * @throws IOException When an error occurs while writing the response */ public void dispatch(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { @@ -102,7 +102,7 @@ public void dispatch(HttpServletRequest request, HttpServletResponse response) /** * Gets the initialized Spring dispatcher servlet instance. - * @return + * @return The Spring dispatcher servlet */ public Servlet getDispatcherServlet() { return dispatcherServlet; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index de7ce509..b2cc9f24 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -36,7 +36,7 @@ * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. * - * Important: Make sure to add {@link LambdaFlushResponseListener} in your SpringBootServletInitializer subclass configure(). + * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). * * @param The incoming event type * @param The expected return type @@ -53,7 +53,7 @@ public class SpringBootLambdaContainerHandler extends * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects * @param springBootInitializer {@code SpringBootServletInitializer} class * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework */ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) throws ContainerInitializationException { @@ -73,7 +73,8 @@ public static SpringBootLambdaContainerHandler requestReader, ResponseWriter responseWriter, From 3c44483c28d7f0f8d44b6d6c4d64b10ead37fc13 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 22 Nov 2017 08:44:23 -0800 Subject: [PATCH 0059/1214] [maven-release-plugin] prepare release aws-serverless-java-container-0.8 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fa3834d5..7d9239ea 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.8-SNAPSHOT + 0.8 com.amazonaws.serverless aws-serverless-java-container - 0.8-SNAPSHOT + 0.8 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 2b2f78a5..356bba17 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.8-SNAPSHOT + 0.8 com.amazonaws.serverless aws-serverless-java-container - 0.8-SNAPSHOT + 0.8 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8-SNAPSHOT + 0.8 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 66950fa0..1b64681d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.8-SNAPSHOT + 0.8 com.amazonaws.serverless aws-serverless-java-container - 0.8-SNAPSHOT + 0.8 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8-SNAPSHOT + 0.8 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5855cd39..4ed08868 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.8-SNAPSHOT + 0.8 com.amazonaws.serverless aws-serverless-java-container - 0.8-SNAPSHOT + 0.8 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8-SNAPSHOT + 0.8 diff --git a/pom.xml b/pom.xml index 0cfa934d..1db482ed 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.8-SNAPSHOT + 0.8 AWS Serverless Java container From 9abcca22c4771e37621704f73bea22ccdabe45ee Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 22 Nov 2017 08:44:24 -0800 Subject: [PATCH 0060/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7d9239ea..6c675b9b 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 0.8 + 0.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.8 + 0.9-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 356bba17..d462beae 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 0.8 + 0.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.8 + 0.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8 + 0.9-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 1b64681d..9fae1699 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 0.8 + 0.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.8 + 0.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8 + 0.9-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4ed08868..7e1620fd 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 0.8 + 0.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 0.8 + 0.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 0.8 + 0.9-SNAPSHOT diff --git a/pom.xml b/pom.xml index 1db482ed..6ddf5524 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 0.8 + 0.9-SNAPSHOT AWS Serverless Java container From ba8ea46c76f4ca55f03c2f472ff1d24865f2d487 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 22 Nov 2017 10:36:06 -0800 Subject: [PATCH 0061/1214] Bumped version in readme instructions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 210b948a..f4dffc44 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To include the library in your Maven project, add the desired implementation to com.amazonaws.serverless aws-serverless-java-container-jersey - 0.7 + 0.8 ``` From c8cb4df2f28042412a977aac33ae521a3a741a97 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 18 Dec 2017 13:46:23 -0800 Subject: [PATCH 0062/1214] Refactoring to move the model and interface packages out of the internal package --- README.md | 2 +- .../ContainerInitializationException.java | 6 +- .../InvalidRequestEventException.java | 6 +- .../InvalidResponseObjectException.java | 6 +- .../AwsProxySecurityContextWriter.java | 4 +- .../{internal => }/ExceptionHandler.java | 2 +- .../proxy/{internal => }/RequestReader.java | 13 +--- .../proxy/{internal => }/ResponseWriter.java | 4 +- .../{internal => }/SecurityContextWriter.java | 4 +- .../internal/AwsProxyExceptionHandler.java | 8 +- .../internal/LambdaContainerHandler.java | 6 +- .../jaxrs/AwsProxySecurityContext.java | 4 +- .../servlet/AwsHttpServletRequest.java | 8 +- .../internal/servlet/AwsHttpSession.java | 75 +++++++++++++++---- .../AwsLambdaServletContainerHandler.java | 8 +- .../servlet/AwsProxyHttpServletRequest.java | 2 +- .../AwsProxyHttpServletRequestReader.java | 6 +- .../AwsProxyHttpServletResponseWriter.java | 5 +- .../servlet/AwsProxyRequestDispatcher.java | 3 - .../testutils/AwsProxyRequestBuilder.java | 10 +-- .../model/ApiGatewayAuthorizerContext.java | 2 +- .../model/ApiGatewayRequestContext.java | 6 +- .../model/ApiGatewayRequestIdentity.java | 6 +- .../{internal => }/model/AwsProxyRequest.java | 2 +- .../model/AwsProxyResponse.java | 2 +- .../model/CognitoAuthorizerClaims.java | 3 +- .../{internal => }/model/ContainerConfig.java | 2 +- .../{internal => }/model/ErrorModel.java | 2 +- .../AwsProxySecurityContextWriterTest.java | 5 +- .../{internal => }/RequestReaderTest.java | 4 +- .../AwsProxyExceptionHandlerTest.java | 4 +- .../jaxrs/AwsProxySecurityContextTest.java | 2 +- .../servlet/AwsHttpServletRequestTest.java | 3 +- .../AwsProxyHttpServletRequestFormTest.java | 4 +- .../AwsProxyHttpServletRequestReaderTest.java | 4 +- .../AwsProxyHttpServletRequestTest.java | 8 +- .../ApiGatewayAuthorizerContextTest.java | 2 +- .../model/CognitoAuthorizerClaimsTest.java | 2 +- .../jersey/JerseyAwsProxyRequestReader.java | 8 +- .../jersey/JerseyAwsProxyResponseWriter.java | 4 +- .../jersey/JerseyLambdaContainerHandler.java | 14 ++-- .../AwsProxyServletRequestFactory.java | 3 +- .../proxy/jersey/EchoJerseyResource.java | 4 +- .../proxy/jersey/JerseyAwsProxyTest.java | 4 +- .../spark/SparkLambdaContainerHandler.java | 9 ++- .../proxy/spark/HelloWorldSparkTest.java | 4 +- .../proxy/spark/InitExceptionHandlerTest.java | 2 +- .../SparkLambdaContainerHandlerTest.java | 5 +- .../SpringBootLambdaContainerHandler.java | 9 ++- .../spring/SpringLambdaContainerHandler.java | 9 ++- .../proxy/spring/SpringAwsProxyTest.java | 4 +- .../spring/SpringServletContextTest.java | 4 +- .../proxy/spring/StaticAppProxyTest.java | 4 +- .../proxy/spring/echoapp/EchoResource.java | 4 +- .../spring/profile/SpringProfileTest.java | 4 +- .../proxy/spring/staticapp/LambdaHandler.java | 4 +- .../sample/jersey/LambdaHandler.java | 4 +- .../sample/spark/LambdaHandler.java | 6 +- .../sample/spring/LambdaHandler.java | 4 +- .../sample/spring/StreamLambdaHandler.java | 4 +- 60 files changed, 212 insertions(+), 150 deletions(-) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/AwsProxySecurityContextWriter.java (94%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/ExceptionHandler.java (98%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/RequestReader.java (90%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/ResponseWriter.java (95%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/SecurityContextWriter.java (92%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/ApiGatewayAuthorizerContext.java (97%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/ApiGatewayRequestContext.java (96%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/ApiGatewayRequestIdentity.java (96%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/AwsProxyRequest.java (98%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/AwsProxyResponse.java (98%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/CognitoAuthorizerClaims.java (97%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/ContainerConfig.java (98%) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/model/ErrorModel.java (96%) rename aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/{internal => }/AwsProxySecurityContextWriterTest.java (87%) rename aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/{internal => }/RequestReaderTest.java (95%) rename aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/{internal => }/model/ApiGatewayAuthorizerContextTest.java (99%) rename aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/{internal => }/model/CognitoAuthorizerClaimsTest.java (99%) diff --git a/README.md b/README.md index f4dffc44..fedd49f7 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ handler.onStartup(c -> { # Using the Lambda Stream handler By default, Lambda does not use Jackson annotations when marshalling and unmarhsalling JSON. This can cause issues when receiving requests that include the claims object from a Cognito User Pool authorizer. To support these type of requests, use Lambda's `RequestStreamHandler` interface instead of the POJO-based `RequestHandler`. This allows you to use a custom version of Jackson with support for annotations. -This library uses Jackson annotations in the `com.amazonaws.serverless.proxy.internal.model.CognitoAuthorizerClaims` object. The example below shows how to do this with a `SpringLambdaContainerHandler`, you can use the same methodology with all of the other implementations. +This library uses Jackson annotations in the `com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims` object. The example below shows how to do this with a `SpringLambdaContainerHandler`, you can use the same methodology with all of the other implementations. ```java public class StreamLambdaHandler implements RequestStreamHandler { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/ContainerInitializationException.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/ContainerInitializationException.java index 3bacd3ea..c68023fd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/ContainerInitializationException.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/ContainerInitializationException.java @@ -12,11 +12,15 @@ */ package com.amazonaws.serverless.exceptions; + +import com.amazonaws.serverless.proxy.RequestReader; + + /** * This exception is thrown when the ContainerHandler fails to parse a request object or input stream into the * object required by the Container. The exception is thrown by implementing sub-classes of RequestReader * - * @see com.amazonaws.serverless.proxy.internal.RequestReader + * @see RequestReader */ public class ContainerInitializationException extends Exception { public ContainerInitializationException(String message, Exception e) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java index faf82b9c..bf42df94 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidRequestEventException.java @@ -12,11 +12,15 @@ */ package com.amazonaws.serverless.exceptions; + +import com.amazonaws.serverless.proxy.RequestReader; + + /** * This exception is thrown when the ContainerHandler fails to parse a request object or input stream into the * object required by the Container. The exception is thrown by implementing sub-classes of RequestReader * - * @see com.amazonaws.serverless.proxy.internal.RequestReader + * @see RequestReader */ public class InvalidRequestEventException extends Exception { public InvalidRequestEventException(String message, Exception e) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidResponseObjectException.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidResponseObjectException.java index 33189ad4..b3ac9c1e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidResponseObjectException.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/exceptions/InvalidResponseObjectException.java @@ -12,11 +12,15 @@ */ package com.amazonaws.serverless.exceptions; + +import com.amazonaws.serverless.proxy.ResponseWriter; + + /** * This exception is thrown when the ContainerHandler cannot transform the Container response into a valid return value * for the Lambda function. This exception is thrown by implementing sub-classes of ResponseWriter * - * @see com.amazonaws.serverless.proxy.internal.ResponseWriter + * @see ResponseWriter */ public class InvalidResponseObjectException extends Exception { public InvalidResponseObjectException(String message, Exception e) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java similarity index 94% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriter.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java index 839658ff..9a38bbf2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java @@ -10,10 +10,10 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java similarity index 98% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ExceptionHandler.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java index a56e2ec7..846c6478 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import java.io.IOException; import java.io.OutputStream; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java similarity index 90% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index fcd7dacf..1a63aec8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -10,20 +10,15 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.databind.ObjectMapper; - import javax.ws.rs.core.SecurityContext; -import java.io.IOException; -import java.io.InputStream; - /** * Implementations of the RequestReader object are used by container objects to transform the incoming Lambda event into @@ -63,13 +58,13 @@ public abstract class RequestReader { /** * Reads the incoming event object and produces a populated request for the underlying container * @param request The incoming request object - * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.internal.SecurityContextWriter) + * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.SecurityContextWriter) * @param lambdaContext The AWS Lambda context for the request * @param config The container configuration object. This is passed in by the LambdaContainerHandler. * @return A valid request object for the underlying container * @throws InvalidRequestEventException This exception is thrown if anything goes wrong during the creation of the request object */ - protected abstract ContainerRequestType readRequest(RequestType request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) + public abstract ContainerRequestType readRequest(RequestType request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java similarity index 95% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ResponseWriter.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java index dd9ce225..b759a020 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/ResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; @@ -44,7 +44,7 @@ public abstract class ResponseWriter { * @return A valid return value for the Lambda function * @throws InvalidResponseObjectException When the implementation cannot read the container response object */ - protected abstract ResponseType writeResponse(ContainerResponseType containerResponse, Context lambdaContext) + public abstract ResponseType writeResponse(ContainerResponseType containerResponse, Context lambdaContext) throws InvalidResponseObjectException; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java similarity index 92% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityContextWriter.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java index 23e6e508..32430d81 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java @@ -10,9 +10,9 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java index 886b1dd9..c022bf52 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java @@ -13,8 +13,10 @@ package com.amazonaws.serverless.proxy.internal; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.model.ErrorModel; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.ErrorModel; +import com.amazonaws.serverless.proxy.ExceptionHandler; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; @@ -34,7 +36,7 @@ * Returns application/json messages with a status code of 500 when the RequestReader failed to read the incoming event. * For all other exceptions returns a 502. Responses are populated with a JSON object containing a message property. * - * @see com.amazonaws.serverless.proxy.internal.ExceptionHandler + * @see ExceptionHandler */ public class AwsProxyExceptionHandler implements ExceptionHandler { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 521168a8..6dfa3069 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -13,7 +13,11 @@ package com.amazonaws.serverless.proxy.internal; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 46eb809c..0e561a22 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -12,8 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.jaxrs; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index c4d85dd2..59143d91 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -12,9 +12,9 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; @@ -26,7 +26,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpSessionContext; + import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 6aca5947..76f56416 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -6,15 +6,33 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; + +import java.time.Instant; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * This class emulates the behavior of an HTTP session. At the moment a new instance of this class + * is created for each request/event. In the future, we may define a session id resolver interface + * allowing clients to store a map of sessions within a Lambda container. + */ public class AwsHttpSession implements HttpSession { + public static final int SESSION_DURATION_SEC = 60 * 30; + private static final Logger log = LoggerFactory.getLogger(AwsHttpSession.class); + private Map attributes; private String id; + private long creationTime; + private int maxInactiveInterval; + private long lastAccessedTime; + private boolean valid; /** - * @param id API gateway request ID. + * @param id A unique session identifier */ public AwsHttpSession(String id) { if (null == id) { @@ -22,11 +40,16 @@ public AwsHttpSession(String id) { } log.debug("Creating session " + id); this.id = id; + attributes = new HashMap<>(); + creationTime = Instant.now().getEpochSecond(); + maxInactiveInterval = SESSION_DURATION_SEC; + lastAccessedTime = creationTime; + valid = true; } @Override public long getCreationTime() { - return 0; + return creationTime; } @Override @@ -46,66 +69,88 @@ public ServletContext getServletContext() { @Override public void setMaxInactiveInterval(int interval) { - + maxInactiveInterval = interval; } @Override public int getMaxInactiveInterval() { - return 0; + return maxInactiveInterval; } @Override + @Deprecated public HttpSessionContext getSessionContext() { - return null; + throw new UnsupportedOperationException("Session context is deprecated and no longer supported"); } @Override public Object getAttribute(String name) { - return null; + touch(); + return attributes.get(name); } @Override + @Deprecated public Object getValue(String name) { - return null; + throw new UnsupportedOperationException("Session values are deprecated and not suported"); } @Override public Enumeration getAttributeNames() { - return null; + touch(); + return Collections.enumeration(attributes.keySet()); } @Override + @Deprecated public String[] getValueNames() { - return new String[0]; + throw new UnsupportedOperationException("Session values are deprecated and not suported"); } @Override public void setAttribute(String name, Object value) { - + touch(); + attributes.put(name, value); } @Override + @Deprecated public void putValue(String name, Object value) { - + throw new UnsupportedOperationException("Session values are deprecated and not suported"); } @Override public void removeAttribute(String name) { - + touch(); + attributes.remove(name); } @Override + @Deprecated public void removeValue(String name) { - + throw new UnsupportedOperationException("Session values are deprecated and not suported"); } @Override public void invalidate() { - + valid = false; + attributes.clear(); } @Override public boolean isNew() { - return false; + return lastAccessedTime == creationTime; + } + + private void touch() { + lastAccessedTime = Instant.now().getEpochSecond(); + } + + boolean isValid() { + if (lastAccessedTime - creationTime < maxInactiveInterval) { + return valid; + } else { + return false; + } } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 974117e5..c8347caf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -12,11 +12,11 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.ExceptionHandler; +import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.ResponseWriter; -import com.amazonaws.serverless.proxy.internal.SecurityContextWriter; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index dc2a9550..cf5e57d6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -14,7 +14,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import org.apache.commons.fileupload.FileItem; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 469c4ce6..25a2bd7d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -13,9 +13,9 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 232bd15e..d03c4018 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -14,11 +14,10 @@ import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.internal.ResponseWriter; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import java.io.IOException; import java.util.Base64; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 7e4b2299..4080e1c7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -1,9 +1,6 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; - import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 5ffd2941..c393e408 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -12,11 +12,11 @@ */ package com.amazonaws.serverless.proxy.internal.testutils; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayAuthorizerContext; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestIdentity; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.ApiGatewayAuthorizerContext; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContext.java similarity index 97% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContext.java index 9b937bb9..c2001954 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContext.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java similarity index 96% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java index a3ce1528..657bde19 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java @@ -10,9 +10,11 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; +import com.amazonaws.serverless.proxy.RequestReader; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -22,7 +24,7 @@ * readers. * * @see AwsProxyRequest - * @see com.amazonaws.serverless.proxy.internal.RequestReader + * @see RequestReader */ @JsonIgnoreProperties(ignoreUnknown = true) public class ApiGatewayRequestContext { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java similarity index 96% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java index 436cd690..6d0f453b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayRequestIdentity.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java @@ -10,9 +10,11 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; +import com.amazonaws.serverless.proxy.RequestReader; + import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,7 +23,7 @@ * all of the properties declared in the $context.identity API Gateway object so could be re-used for other implemnetations * * @see AwsProxyRequest - * @see com.amazonaws.serverless.proxy.internal.RequestReader + * @see RequestReader */ @JsonIgnoreProperties(ignoreUnknown = true) public class ApiGatewayRequestIdentity { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java similarity index 98% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index d8c59482..eefa59f3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java similarity index 98% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyResponse.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java index 43393fda..01c289f3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/AwsProxyResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import java.util.HashMap; import java.util.Map; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaims.java similarity index 97% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaims.java index 6c370286..34e2e47a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaims.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaims.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import com.fasterxml.jackson.annotation.JsonAnyGetter; @@ -18,7 +18,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java similarity index 98% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 452dac0c..2a019709 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ErrorModel.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java similarity index 96% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ErrorModel.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java index dbc1c7ca..5046a6c2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/model/ErrorModel.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; /** * Default error response model. This object is used by the AwsProxyExceptionHandler objcect. diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java similarity index 87% rename from aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriterTest.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java index 4f1c6860..6255344a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxySecurityContextWriterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java @@ -1,6 +1,7 @@ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; import org.junit.Before; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/RequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java similarity index 95% rename from aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/RequestReaderTest.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java index 6bdc5d41..fb0d25f4 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/RequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java @@ -1,7 +1,7 @@ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import org.junit.Test; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java index ff503ff9..392fda32 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java @@ -3,8 +3,8 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.model.ErrorModel; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.ErrorModel; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index 255f2a0d..da9f1168 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -1,6 +1,6 @@ package com.amazonaws.serverless.proxy.internal.jaxrs; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import org.junit.Test; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 41c49dfc..e10526f7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -1,6 +1,6 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.fasterxml.jackson.core.JsonProcessingException; @@ -11,7 +11,6 @@ import static org.junit.Assert.*; -import java.util.AbstractMap; import java.util.List; import java.util.Map; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 62f3fe97..f49927d4 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -1,13 +1,11 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; -import org.apache.http.client.entity.EntityBuilder; -import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.Test; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index fa883856..456e522d 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -2,8 +2,8 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; import org.junit.Test; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index c7884a6e..862a5245 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -1,21 +1,15 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.apache.commons.io.IOUtils; -import org.apache.http.HttpEntity; -import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.Test; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import java.io.IOException; import java.util.Collections; -import java.util.Enumeration; import java.util.List; import static org.junit.Assert.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java similarity index 99% rename from aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContextTest.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java index 75b80d81..87ab0ed7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/ApiGatewayAuthorizerContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaimsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java similarity index 99% rename from aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaimsTest.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java index 980ee188..1805edf3 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/model/CognitoAuthorizerClaimsTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.proxy.internal.model; +package com.amazonaws.serverless.proxy.model; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java index 143236af..e90902b6 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java @@ -14,9 +14,9 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; import org.glassfish.jersey.internal.MapPropertiesDelegate; import org.glassfish.jersey.internal.PropertiesDelegate; @@ -63,7 +63,7 @@ public class JerseyAwsProxyRequestReader extends RequestReaderContainerRequest object. * * @param request The incoming request object - * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.internal.SecurityContextWriter) + * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.SecurityContextWriter) * @param lambdaContext The AWS Lambda context for the request * @param config The container config object, this is passed in by the LambdaContainerHandler * @return A populated ContainerRequest object diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java index 80ea48fa..cbf9f18a 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java @@ -14,8 +14,8 @@ import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.internal.ResponseWriter; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; import java.util.Base64; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index b57c6c6d..3d82aef1 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -14,14 +14,14 @@ import com.amazonaws.serverless.proxy.internal.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.internal.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.ExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.ResponseWriter; -import com.amazonaws.serverless.proxy.internal.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; import org.glassfish.jersey.server.ApplicationHandler; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java index 748585e4..3b353871 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java @@ -14,8 +14,7 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.internal.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.model.ContainerConfig; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index c22277da..4a512455 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -12,8 +12,8 @@ */ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index a6cc7e1a..9e1d11cc 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -13,8 +13,8 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 746fa04e..23cb876a 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -13,9 +13,14 @@ package com.amazonaws.serverless.proxy.spark; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.serverless.proxy.internal.*; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 3975a421..58da129e 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -2,8 +2,8 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java index a95497c2..9ae4a500 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -3,7 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.internal.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index f1884537..48fc881f 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -2,15 +2,14 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; import com.amazonaws.serverless.proxy.spark.filter.UnauthenticatedFilter; import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Test; import spark.Spark; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index b2cc9f24..7e8c220d 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -13,9 +13,14 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.serverless.proxy.internal.*; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 9ac03516..e5c5cbda 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -13,9 +13,14 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.serverless.proxy.internal.*; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.services.lambda.runtime.Context; import org.springframework.web.context.ConfigurableWebApplicationContext; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 1cbeaef4..0c26a61b 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.spring; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index ca676b3a..95767e41 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -2,8 +2,8 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index 37cde971..8299402e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -1,8 +1,8 @@ package com.amazonaws.serverless.proxy.spring; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spring.staticapp.LambdaHandler; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 185bc7bd..bae0e045 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.spring.echoapp; -import com.amazonaws.serverless.proxy.internal.RequestReader; -import com.amazonaws.serverless.proxy.internal.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import org.springframework.beans.factory.annotation.Autowired; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index 882e75ee..60354e28 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.spring.profile; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java index 101c63fa..ef74e340 100755 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/LambdaHandler.java @@ -2,8 +2,8 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; - import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; - import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; + import com.amazonaws.serverless.proxy.model.AwsProxyRequest; + import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/LambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/LambdaHandler.java index 1ac88537..b680718a 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/LambdaHandler.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/LambdaHandler.java @@ -12,8 +12,8 @@ */ package com.amazonaws.serverless.sample.jersey; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java index 8eff622e..baded0f1 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java @@ -13,14 +13,14 @@ package com.amazonaws.serverless.sample.spark; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; import com.amazonaws.serverless.sample.spark.model.Pet; import com.amazonaws.serverless.sample.spark.model.PetData; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.log4j.LambdaAppender; + import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java index 515178ee..0aa89126 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java @@ -13,8 +13,8 @@ package com.amazonaws.serverless.sample.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 43ad4e39..ac85a9e3 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -2,8 +2,8 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.internal.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; From 5708da6fb2be746f07c240ec62eb774221da85ad Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 10 Jan 2018 14:43:13 -0800 Subject: [PATCH 0063/1214] Moved AwsProxyExceptionHandler to proxy package. This should complete the refactoring of internal classes --- .../proxy/{internal => }/AwsProxyExceptionHandler.java | 3 +-- .../proxy/{internal => }/AwsProxyExceptionHandlerTest.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/{internal => }/AwsProxyExceptionHandler.java (97%) rename aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/{internal => }/AwsProxyExceptionHandlerTest.java (98%) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java similarity index 97% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index c022bf52..9280a5b4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -10,12 +10,11 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; -import com.amazonaws.serverless.proxy.ExceptionHandler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java similarity index 98% rename from aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index 392fda32..11adf356 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -1,8 +1,9 @@ -package com.amazonaws.serverless.proxy.internal; +package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; import com.fasterxml.jackson.core.JsonProcessingException; From 26d0db01b3f97391c68d47f3607bfb02ca922c05 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 10 Jan 2018 14:46:09 -0800 Subject: [PATCH 0064/1214] Changed import of exception handler in main handlers implementations --- .../jersey/JerseyLambdaContainerHandler.java | 2 +- .../spark/SparkLambdaContainerHandler.java | 2 +- .../SpringBootLambdaContainerHandler.java | 38 +++++++++++-------- .../spring/SpringLambdaContainerHandler.java | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 3d82aef1..297a5962 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -13,7 +13,7 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 23cb876a..87a99946 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -13,12 +13,12 @@ package com.amazonaws.serverless.proxy.spark; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.*; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 7e8c220d..37e83589 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -13,18 +13,20 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.*; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.StandardEnvironment; import org.springframework.web.SpringServletContainerInitializer; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.WebApplicationContext; @@ -32,7 +34,7 @@ import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.*; -import javax.servlet.http.HttpServletResponse; + import java.util.*; import java.util.concurrent.CountDownLatch; @@ -47,9 +49,9 @@ * @param The expected return type */ public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { - static ThreadLocal currentResponse = new ThreadLocal<>(); private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); + private String[] springProfiles = null; // State vars private boolean initialized; @@ -91,6 +93,12 @@ public SpringBootLambdaContainerHandler(RequestReader> webAppInitializers = new LinkedHashSet<>(); webAppInitializers.add(springBootInitializer); springServletContainerInitializer.onStartup(webAppInitializers, getServletContext()); + + if (springProfiles != null && springProfiles.length > 0) { + ConfigurableEnvironment springEnv = new StandardEnvironment(); + springEnv.setActiveProfiles(springProfiles); + + } + initialized = true; } containerRequest.setServletContext(getServletContext()); - currentResponse.set(containerResponse); - try { - WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); - DispatcherServlet dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); - // process filters & invoke servlet - log.debug("Process filters & invoke servlet: {}", dispatcherServlet); - doFilter(containerRequest, containerResponse, dispatcherServlet); - } finally { - // call the flush method to release the latch - SpringBootLambdaContainerHandler.currentResponse.remove(); - currentResponse.remove(); - } + WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); + + DispatcherServlet dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + // process filters & invoke servlet + doFilter(containerRequest, containerResponse, dispatcherServlet); } private class SpringBootAwsServletContext extends AwsServletContext { diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index e5c5cbda..76df8bbc 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -13,12 +13,12 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.*; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; From bb07467a412d5d8c4ff554c4d0374e65ac244e36 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 10 Jan 2018 14:48:29 -0800 Subject: [PATCH 0065/1214] Forgot to add the spark test --- .../serverless/proxy/spark/InitExceptionHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java index 9ae4a500..1781b212 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -2,7 +2,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; From be7ca2a51579ca979833fd2e6434e64220321efc Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 11 Jan 2018 10:02:37 -0800 Subject: [PATCH 0066/1214] Changes to servlet context to address #84. Created a singleton ObjectMapper to speed up initialization and address #91. Added unit tests to make sure #90 is resolved and stays resolved. --- .../proxy/AwsProxyExceptionHandler.java | 10 ++- .../internal/LambdaContainerHandler.java | 10 +++ .../servlet/AwsProxyHttpServletRequest.java | 78 +++++++++++++------ .../AwsProxyHttpServletRequestReader.java | 2 +- .../internal/servlet/AwsServletContext.java | 2 +- .../internal/servlet/FilterChainManager.java | 2 +- .../testutils/AwsProxyRequestBuilder.java | 10 +-- .../proxy/model/ContainerConfig.java | 34 +++++++- .../servlet/AwsHttpServletRequestTest.java | 12 ++- .../proxy/jersey/EchoJerseyResource.java | 7 ++ .../proxy/jersey/JerseyAwsProxyTest.java | 13 +++- .../proxy/spring/SpringAwsProxyTest.java | 21 +++++ .../proxy/spring/echoapp/EchoResource.java | 19 +++++ 13 files changed, 176 insertions(+), 44 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index 9280a5b4..e515353b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -13,11 +13,14 @@ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat; +import com.fasterxml.jackson.databind.ser.std.JsonValueSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,8 +58,6 @@ public class AwsProxyExceptionHandler //------------------------------------------------------------- private static Map headers = new HashMap<>(); - private static ObjectMapper objectMapper = new ObjectMapper(); - //------------------------------------------------------------- // Constructors @@ -87,7 +88,7 @@ public AwsProxyResponse handle(Throwable ex) { public void handle(Throwable ex, OutputStream stream) throws IOException { AwsProxyResponse response = handle(ex); - objectMapper.writeValue(stream, response); + LambdaContainerHandler.getObjectMapper().writeValue(stream, response); } @@ -96,8 +97,9 @@ public void handle(Throwable ex, OutputStream stream) throws IOException { //------------------------------------------------------------- String getErrorJson(String message) { + try { - return objectMapper.writeValueAsString(new ErrorModel(message)); + return LambdaContainerHandler.getObjectMapper().writeValueAsString(new ErrorModel(message)); } catch (JsonProcessingException e) { log.error("Could not produce error JSON", e); return "{ \"message\": \"" + message + "\" }"; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 6dfa3069..26003742 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -20,6 +20,7 @@ import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,6 +65,8 @@ public abstract class LambdaContainerHandler> urlEncodedFormParameters; private Map multipartFormParameters; private Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); + private ContainerConfig config; //------------------------------------------------------------- @@ -89,6 +91,17 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd super(lambdaContext); this.request = awsProxyRequest; this.securityContext = awsSecurityContext; + this.config = ContainerConfig.defaultConfig(); + + this.urlEncodedFormParameters = getFormUrlEncodedParametersMap(); + this.multipartFormParameters = getMultipartFormParametersMap(); + } + + public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext, ContainerConfig config) { + super(lambdaContext); + this.request = awsProxyRequest; + this.securityContext = awsSecurityContext; + this.config = config; this.urlEncodedFormParameters = getFormUrlEncodedParametersMap(); this.multipartFormParameters = getMultipartFormParametersMap(); @@ -181,10 +194,7 @@ public String getMethod() { @Override public String getPathInfo() { - String pathInfo = getServletPath().replace(getContextPath(), ""); - if (!pathInfo.startsWith("/")) { - pathInfo = "/" + pathInfo; - } + String pathInfo = cleanUri(request.getPath()); //getServletPath().replace(getContextPath(), ""); return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); } @@ -196,13 +206,18 @@ public String getPathTranslated() { } - /** - * In AWS API Gateway, stage is never given as part of the path. - * @return - */ @Override public String getContextPath() { - return ""; + if (config.isUseStageAsServletContext()) { + String contextPath = cleanUri(request.getRequestContext().getStage()); + if (config.getServiceBasePath() != null) { + contextPath += cleanUri(config.getServiceBasePath()); + } + + return contextPath; + } else { + return "" + (config.getServiceBasePath() != null ? cleanUri(config.getServiceBasePath()) : ""); + } } @@ -232,7 +247,7 @@ public Principal getUserPrincipal() { @Override public String getRequestURI() { - return (getContextPath().isEmpty() ? "" : "/" + getContextPath()) + request.getPath(); + return cleanUri(getContextPath()) + cleanUri(request.getPath()); } @@ -240,12 +255,8 @@ public String getRequestURI() { public StringBuffer getRequestURL() { String url = ""; url += getServerName(); - url += "/"; - url += getContextPath(); - url += "/"; - url += request.getPath(); - - url = url.replaceAll("/+", "/"); + url += cleanUri(getContextPath()); + url += cleanUri(request.getPath()); return new StringBuffer(getScheme() + "://" + url); } @@ -253,7 +264,8 @@ public StringBuffer getRequestURL() { @Override public String getServletPath() { - return decodeRequestPath(request.getPath(), LambdaContainerHandler.getContainerConfig()); + // we always work on the root path + return ""; } @Override @@ -653,15 +665,15 @@ private String getQueryStringParameterCaseInsensitive(String key) { private String[] getFormBodyParameterCaseInsensitive(String key) { - List values = urlEncodedFormParameters.get(key); - if (values != null) { - String[] valuesArray = new String[values.size()]; - valuesArray = values.toArray(valuesArray); - return valuesArray; - } else { - return null; - } + List values = urlEncodedFormParameters.get(key); + if (values != null) { + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + return valuesArray; + } else { + return null; } + } private Map getMultipartFormParametersMap() { @@ -698,6 +710,22 @@ private Map getMultipartFormParametersMap() { return output; } + private String cleanUri(String uri) { + String finalUri = uri; + + if (!finalUri.startsWith("/")) { + finalUri = "/" + finalUri; + } + + if (finalUri.endsWith(("/"))) { + finalUri = finalUri.substring(0, finalUri.length() - 1); + } + + finalUri = finalUri.replaceAll("/+", "/"); + + return finalUri; + } + private Map> getFormUrlEncodedParametersMap() { String contentType = getContentType(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 25a2bd7d..949ed7e3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -34,7 +34,7 @@ public class AwsProxyHttpServletRequestReader extends RequestReaderFilterChainHolder object that can be used to apply the filters to the request */ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servlet) { - String targetPath = request.getServletPath(); + String targetPath = request.getRequestURI(); DispatcherType type = request.getDispatcherType(); // only return the cached result if the filter list hasn't changed in the meanwhile diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index c393e408..54bd0ebe 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal.testutils; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.ApiGatewayAuthorizerContext; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; @@ -41,8 +42,6 @@ public class AwsProxyRequestBuilder { //------------------------------------------------------------- private AwsProxyRequest request; - private ObjectMapper mapper; - //------------------------------------------------------------- // Constructors @@ -59,7 +58,6 @@ public AwsProxyRequestBuilder(String path) { public AwsProxyRequestBuilder(String path, String httpMethod) { - this.mapper = new ObjectMapper(); this.request = new AwsProxyRequest(); this.request.setHeaders(new HashMap<>()); // avoid NPE @@ -144,7 +142,7 @@ public AwsProxyRequestBuilder body(String body) { public AwsProxyRequestBuilder body(Object body) { if (request.getHeaders() != null && request.getHeaders().get(HttpHeaders.CONTENT_TYPE).equals(MediaType.APPLICATION_JSON)) { try { - return body(mapper.writeValueAsString(body)); + return body(LambdaContainerHandler.getObjectMapper().writeValueAsString(body)); } catch (JsonProcessingException e) { throw new UnsupportedOperationException("Could not serialize object: " + e.getMessage()); } @@ -239,13 +237,13 @@ public AwsProxyRequestBuilder serverName(String serverName) { public AwsProxyRequestBuilder fromJsonString(String jsonContent) throws IOException { - request = mapper.readValue(jsonContent, AwsProxyRequest.class); + request = LambdaContainerHandler.getObjectMapper().readValue(jsonContent, AwsProxyRequest.class); return this; } public AwsProxyRequestBuilder fromJsonPath(String filePath) throws IOException { - request = mapper.readValue(new File(filePath), AwsProxyRequest.class); + request = LambdaContainerHandler.getObjectMapper().readValue(new File(filePath), AwsProxyRequest.class); return this; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 2a019709..668f25e0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -1,6 +1,9 @@ package com.amazonaws.serverless.proxy.model; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; + + /** * Configuration parameters for the framework */ @@ -12,6 +15,7 @@ public static ContainerConfig defaultConfig() { configuration.setStripBasePath(false); configuration.setUriEncoding(DEFAULT_URI_ENCODING); configuration.setConsolidateSetCookieHeaders(true); + configuration.setUseStageAsServletContext(false); return configuration; } @@ -24,19 +28,29 @@ public static ContainerConfig defaultConfig() { private boolean stripBasePath; private String uriEncoding; private boolean consolidateSetCookieHeaders; + private boolean useStageAsServletContext; //------------------------------------------------------------- // Methods - Getter/Setter //------------------------------------------------------------- + + /** + * Returns the base path configured in the container. This configuration variable is used in conjuction with {@link #setStripBasePath(boolean)} to route + * the request. When requesting the context path from an HttpServletRequest: {@link AwsProxyHttpServletRequest#getContextPath()} this base path is added + * to the context even though it was initially stripped for the purpose of routing the request. We decided to add it to the context to address GitHub issue + * #84 and allow framework's link builders to it. + * + * @return The base path configured for the container + */ public String getServiceBasePath() { return serviceBasePath; } /** - * Configures a base path that can be strippped from the request path before passing it to the frameowkr-specific implementation. This can be used to + * Configures a base path that can be stripped from the request path before passing it to the framework-specific implementation. This can be used to * remove API Gateway's base path mappings from the request. * @param serviceBasePath The base path mapping to be removed. */ @@ -99,4 +113,22 @@ public boolean isConsolidateSetCookieHeaders() { public void setConsolidateSetCookieHeaders(boolean consolidateSetCookieHeaders) { this.consolidateSetCookieHeaders = consolidateSetCookieHeaders; } + + + /** + * Tells whether the stage name passed in the request should be added to the context path: {@link AwsProxyHttpServletRequest#getContextPath()}. + * @return true if the stage will be included in the context path, false otherwise. + */ + public boolean isUseStageAsServletContext() { + return useStageAsServletContext; + } + + + /** + * Sets whether the API Gateway stage name should be included in the servlet context path. + * @param useStageAsServletContext true if you want the stage to appear as the root of the context path, false otherwise. + */ + public void setUseStageAsServletContext(boolean useStageAsServletContext) { + this.useStageAsServletContext = useStageAsServletContext; + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index e10526f7..70106e0a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -3,6 +3,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.ContainerConfig; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; @@ -28,9 +30,11 @@ public class AwsHttpServletRequestTest { private static final MockLambdaContext mockContext = new MockLambdaContext(); + private static ContainerConfig config = ContainerConfig.defaultConfig(); + @Test public void headers_parseHeaderValue_multiValue() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(contentTypeRequest, mockContext, null); + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(contentTypeRequest, mockContext, null, config); // I'm also using this to double-check that I can get a header ignoring case List> values = request.parseHeaderValue(request.getHeader("content-type")); @@ -44,7 +48,7 @@ public void headers_parseHeaderValue_multiValue() { @Test public void headers_parseHeaderValue_validMultipleCookie() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(validCookieRequest, mockContext, null); + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(validCookieRequest, mockContext, null, config); List> values = request.parseHeaderValue(request.getHeader(HttpHeaders.COOKIE)); assertEquals(2, values.size()); @@ -56,7 +60,7 @@ public void headers_parseHeaderValue_validMultipleCookie() { @Test public void headers_parseHeaderValue_complexAccept() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null); + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null, config); List> values = request.parseHeaderValue(request.getHeader(HttpHeaders.ACCEPT)); try { @@ -69,7 +73,7 @@ public void headers_parseHeaderValue_complexAccept() { @Test public void queyrString_generateQueryString_validQuery() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null); + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); String parsedString = request.generateQueryString(queryString.getQueryStringParameters()); assertEquals("one=two&three=four", parsedString); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 4a512455..e3a89b8d 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -34,6 +34,8 @@ @Path("/echo") public class EchoJerseyResource { + public static final String EXCEPTION_MESSAGE = "Fake exception"; + @Path("/headers") @GET @Produces(MediaType.APPLICATION_JSON) public MapResponseModel echoHeaders(@Context ContainerRequestContext context) { @@ -127,4 +129,9 @@ public Response echoBinaryData() { return Response.ok(b).build(); } + + @Path("/exception") @GET + public Response throwException() { + throw new UnsupportedOperationException(EXCEPTION_MESSAGE); + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 9e1d11cc..36031996 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -34,6 +34,7 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Response; import java.io.IOException; import java.util.UUID; @@ -53,7 +54,7 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); - private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") + private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey", "com.amazonaws.serverless.proxy.jersey.providers") .register(new AbstractBinder() { @Override protected void configure() { @@ -245,6 +246,16 @@ public void base64_binaryResponse_base64Encoding() { assertTrue(Base64.isBase64(response.getBody())); } + @Test + public void exception_mapException_mapToNotImplemented() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/exception", "GET").build(); + + AwsProxyResponse response = handler.proxy(request, lambdaContext); + assertNotNull(response.getBody()); + assertEquals(EchoJerseyResource.EXCEPTION_MESSAGE, response.getBody()); + assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); + } + private void validateMapResponseModel(AwsProxyResponse output) { validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 0c26a61b..1fa4d666 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -5,6 +5,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.spring.echoapp.EchoResource; import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; import com.amazonaws.serverless.proxy.spring.echoapp.UnauthenticatedFilter; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; @@ -277,6 +278,26 @@ public void request_encodedPath_returnsDecodedPath() { } + @Test + public void contextPath_generateLink_returnsCorrectPath() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/generate-uri", "GET") + .scheme("https") + .serverName("api.myserver.com") + .stage("prod") + .build(); + SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + System.out.println("Response: " + output.getBody()); + + String expectedUri = "https://api.myserver.com/prod/echo/encoded-request-uri/" + EchoResource.TEST_GENERATE_URI; + + validateSingleValueModel(output, expectedUri); + + SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); + } + private void validateMapResponseModel(AwsProxyResponse output) { try { MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index bae0e045..688e7760 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -12,14 +12,22 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; + +import java.net.URI; import java.util.Enumeration; import java.util.Map; import java.util.Random; +import static org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMethodCall; +import static org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.on; + + @RestController @EnableWebMvc @RequestMapping("/echo") public class EchoResource { + public static final String TEST_GENERATE_URI = "test"; + @Autowired ServletContext servletContext; @@ -129,4 +137,15 @@ public SingleValueModel echoEncodedRequestUri(@PathVariable("encoded-var") Strin return valueModel; } + @RequestMapping(path = "/generate-uri", method = RequestMethod.GET) + public SingleValueModel echoGeneratedResourceLink() { + SingleValueModel valueModel = new SingleValueModel(); + + URI personUri = fromMethodCall(on(EchoResource.class).echoEncodedRequestUri(TEST_GENERATE_URI)).build().toUri(); + + valueModel.setValue(personUri.toString()); + + return valueModel; + } + } From dd85c06dc245db2c1d0d5c1a6aedcf220acf6886 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 11 Jan 2018 12:21:27 -0800 Subject: [PATCH 0067/1214] Adding exception mapper to fix failing unit test --- .../providers/CustomExceptionMapper.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java new file mode 100644 index 00000000..ca9cda96 --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java @@ -0,0 +1,26 @@ +package com.amazonaws.serverless.proxy.jersey.providers; + + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + + +@Provider +public class CustomExceptionMapper implements ExceptionMapper { + + @Inject + public javax.inject.Provider request; + + @Override + public Response toResponse(UnsupportedOperationException throwable) { + if (request == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } else { + System.out.println("Request uri: " + request.get().getRequestURI()); + return Response.ok(throwable.getMessage()).status(Response.Status.NOT_IMPLEMENTED).build(); + } + } +} From 488b7a04f2b13ad853fbd1ce6594f28832bf7f5b Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 11 Jan 2018 12:45:21 -0800 Subject: [PATCH 0068/1214] Updated all samples to include a stream handler with relevant SAM templates to address #82. Updated wiki quick start documentation with all samples to close #89. Added a new Spring Boot sample. --- samples/jersey/pet-store/sam.yaml | 2 +- .../sample/jersey/StreamLambdaHandler.java | 38 ++++++ .../sample/jersey/model/PetData.java | 10 +- samples/spark/pet-store/sam.yaml | 2 +- .../sample/spark/LambdaHandler.java | 61 +-------- .../sample/spark/SparkResources.java | 66 ++++++++++ .../sample/spark/StreamLambdaHandler.java | 49 ++++++++ .../sample/spark/model/PetData.java | 10 +- samples/spring/pet-store/sam.yaml | 2 +- .../sample/spring/StreamLambdaHandler.java | 7 +- .../sample/spring/model/PetData.java | 10 +- samples/springboot/pet-store/pom.xml | 68 ++++++++++ samples/springboot/pet-store/sam.yaml | 26 ++++ .../sample/springboot/Application.java | 21 ++++ .../sample/springboot/LambdaHandler.java | 46 +++++++ .../springboot/StreamLambdaHandler.java | 45 +++++++ .../springboot/controller/PetsController.java | 78 ++++++++++++ .../sample/springboot/model/Error.java | 29 +++++ .../sample/springboot/model/Pet.java | 55 ++++++++ .../sample/springboot/model/PetData.java | 117 ++++++++++++++++++ .../pet-store/src/main/resources/logback.xml | 5 + 21 files changed, 665 insertions(+), 82 deletions(-) create mode 100644 samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java create mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java create mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java create mode 100644 samples/springboot/pet-store/pom.xml create mode 100644 samples/springboot/pet-store/sam.yaml create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java create mode 100644 samples/springboot/pet-store/src/main/resources/logback.xml diff --git a/samples/jersey/pet-store/sam.yaml b/samples/jersey/pet-store/sam.yaml index 4b973809..40ca1e2d 100644 --- a/samples/jersey/pet-store/sam.yaml +++ b/samples/jersey/pet-store/sam.yaml @@ -5,7 +5,7 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.sample.jersey.LambdaHandler::handleRequest + Handler: com.amazonaws.serverless.sample.jersey.StreamLambdaHandler::handleRequest Runtime: java8 CodeUri: target/serverless-jersey-example-1.0-SNAPSHOT.jar MemorySize: 512 diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java new file mode 100644 index 00000000..6195e653 --- /dev/null +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java @@ -0,0 +1,38 @@ +package com.amazonaws.serverless.sample.jersey; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private final ResourceConfig jerseyApplication = new ResourceConfig() + .packages("com.amazonaws.serverless.sample.jersey") + .register(JacksonFeature.class); + private final JerseyLambdaContainerHandler handler + = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + + AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class); + + AwsProxyResponse resp = handler.proxy(request, context); + + LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/model/PetData.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/model/PetData.java index fb1ee15c..a5f44461 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/model/PetData.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/model/PetData.java @@ -39,17 +39,17 @@ public class PetData { names.add("Daisy"); names.add("Rocky"); names.add("Maggie"); - names.add("Jake "); + names.add("Jake"); names.add("Sophie"); - names.add("Jack "); + names.add("Jack"); names.add("Sadie"); - names.add("Toby "); + names.add("Toby"); names.add("Chloe"); - names.add("Cody "); + names.add("Cody"); names.add("Bailey"); names.add("Buster"); names.add("Lola"); - names.add("Duke "); + names.add("Duke"); names.add("Zoe"); names.add("Cooper"); names.add("Abby"); diff --git a/samples/spark/pet-store/sam.yaml b/samples/spark/pet-store/sam.yaml index 84a85368..c3df9bf8 100644 --- a/samples/spark/pet-store/sam.yaml +++ b/samples/spark/pet-store/sam.yaml @@ -5,7 +5,7 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.sample.spark.LambdaHandler::handleRequest + Handler: com.amazonaws.serverless.sample.spark.StreamLambdaHandler::handleRequest Runtime: java8 CodeUri: target/serverless-spark-example-1.0-SNAPSHOT.jar MemorySize: 512 diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java index baded0f1..bfc795c8 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java @@ -16,25 +16,14 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; -import com.amazonaws.serverless.sample.spark.model.Pet; -import com.amazonaws.serverless.sample.spark.model.PetData; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spark.Spark; -import javax.ws.rs.core.Response; -import java.util.UUID; - -import static spark.Spark.before; -import static spark.Spark.get; -import static spark.Spark.post; - public class LambdaHandler implements RequestHandler { - private ObjectMapper objectMapper = new ObjectMapper(); private boolean isInitialized = false; private SparkLambdaContainerHandler handler; private Logger log = LoggerFactory.getLogger(LambdaHandler.class); @@ -45,7 +34,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c isInitialized = true; try { handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - defineResources(); + SparkResources.defineResources(); Spark.awaitInitialization(); } catch (ContainerInitializationException e) { log.error("Cannot initialize Spark application", e); @@ -54,52 +43,4 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c } return handler.proxy(awsProxyRequest, context); } - - private void defineResources() { - before((request, response) -> response.type("application/json")); - - post("/pets", (req, res) -> { - Pet newPet = objectMapper.readValue(req.body(), Pet.class); - if (newPet.getName() == null || newPet.getBreed() == null) { - return Response.status(400).entity(new Error("Invalid name or breed")).build(); - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - - res.status(200); - return dbPet; - }, new JsonTransformer()); - - get("/pets", (req, res) -> { - int limit = 10; - if (req.queryParams("limit") != null) { - limit = Integer.parseInt(req.queryParams("limit")); - } - - Pet[] outputPets = new Pet[limit]; - - for (int i = 0; i < limit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - res.status(200); - return outputPets; - }, new JsonTransformer()); - - get("/pets/:petId", (req, res) -> { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - res.status(200); - return newPet; - }, new JsonTransformer()); - } } \ No newline at end of file diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java new file mode 100644 index 00000000..7731a70b --- /dev/null +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java @@ -0,0 +1,66 @@ +package com.amazonaws.serverless.sample.spark; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.sample.spark.model.Pet; +import com.amazonaws.serverless.sample.spark.model.PetData; + +import javax.ws.rs.core.Response; + +import java.util.UUID; + +import static spark.Spark.before; +import static spark.Spark.get; +import static spark.Spark.post; + + +public class SparkResources { + + public static void defineResources() { + before((request, response) -> response.type("application/json")); + + post("/pets", (req, res) -> { + Pet newPet = LambdaContainerHandler.getObjectMapper().readValue(req.body(), Pet.class); + if (newPet.getName() == null || newPet.getBreed() == null) { + return Response.status(400).entity(new Error("Invalid name or breed")).build(); + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + + res.status(200); + return dbPet; + }, new JsonTransformer()); + + get("/pets", (req, res) -> { + int limit = 10; + if (req.queryParams("limit") != null) { + limit = Integer.parseInt(req.queryParams("limit")); + } + + Pet[] outputPets = new Pet[limit]; + + for (int i = 0; i < limit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + res.status(200); + return outputPets; + }, new JsonTransformer()); + + get("/pets/:petId", (req, res) -> { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + res.status(200); + return newPet; + }, new JsonTransformer()); + } +} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java new file mode 100644 index 00000000..c7c1b3bd --- /dev/null +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.sample.spark; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spark.Spark; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private boolean isInitialized = false; + private SparkLambdaContainerHandler handler; + private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + if (!isInitialized) { + isInitialized = true; + try { + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + SparkResources.defineResources(); + Spark.awaitInitialization(); + } catch (ContainerInitializationException e) { + log.error("Cannot initialize Spark application", e); + return; + } + } + + AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class); + + AwsProxyResponse resp = handler.proxy(request, context); + + LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java index a8c45a53..ba9c47db 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java @@ -39,17 +39,17 @@ public class PetData { names.add("Daisy"); names.add("Rocky"); names.add("Maggie"); - names.add("Jake "); + names.add("Jake"); names.add("Sophie"); - names.add("Jack "); + names.add("Jack"); names.add("Sadie"); - names.add("Toby "); + names.add("Toby"); names.add("Chloe"); - names.add("Cody "); + names.add("Cody"); names.add("Bailey"); names.add("Buster"); names.add("Lola"); - names.add("Duke "); + names.add("Duke"); names.add("Zoe"); names.add("Cooper"); names.add("Abby"); diff --git a/samples/spring/pet-store/sam.yaml b/samples/spring/pet-store/sam.yaml index 82d85dbc..dc17076b 100644 --- a/samples/spring/pet-store/sam.yaml +++ b/samples/spring/pet-store/sam.yaml @@ -5,7 +5,7 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.sample.spring.LambdaHandler::handleRequest + Handler: com.amazonaws.serverless.sample.spring.StreamLambdaHandler::handleRequest Runtime: java8 CodeUri: target/serverless-spring-example-1.0-SNAPSHOT.jar MemorySize: 512 diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index ac85a9e3..8e08830a 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -2,13 +2,13 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,6 @@ public class StreamLambdaHandler implements RequestStreamHandler { private SpringLambdaContainerHandler handler; - private static ObjectMapper mapper = new ObjectMapper(); private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); @Override @@ -35,11 +34,11 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co } } - AwsProxyRequest request = mapper.readValue(inputStream, AwsProxyRequest.class); + AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class); AwsProxyResponse resp = handler.proxy(request, context); - mapper.writeValue(outputStream, resp); + LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); // just in case it wasn't closed by the mapper outputStream.close(); } diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/model/PetData.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/model/PetData.java index b06348d9..d9373df7 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/model/PetData.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/model/PetData.java @@ -39,17 +39,17 @@ public class PetData { names.add("Daisy"); names.add("Rocky"); names.add("Maggie"); - names.add("Jake "); + names.add("Jake"); names.add("Sophie"); - names.add("Jack "); + names.add("Jack"); names.add("Sadie"); - names.add("Toby "); + names.add("Toby"); names.add("Chloe"); - names.add("Cody "); + names.add("Cody"); names.add("Bailey"); names.add("Buster"); names.add("Lola"); - names.add("Duke "); + names.add("Duke"); names.add("Zoe"); names.add("Cooper"); names.add("Abby"); diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml new file mode 100644 index 00000000..efc60801 --- /dev/null +++ b/samples/springboot/pet-store/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-spring-boot-example + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.amazonaws.serverless + aws-serverless-java-container-spring + [0.1,) + + + + com.amazonaws + aws-lambda-java-core + 1.1.0 + + + + + 1.8 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + \ No newline at end of file diff --git a/samples/springboot/pet-store/sam.yaml b/samples/springboot/pet-store/sam.yaml new file mode 100644 index 00000000..53fbdf1f --- /dev/null +++ b/samples/springboot/pet-store/sam.yaml @@ -0,0 +1,26 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot with the aws-serverless-java-container library +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT.jar + MemorySize: 1512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 60 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Export: + Name: SpringBootPetStoreApi diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java new file mode 100644 index 00000000..a068734f --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java @@ -0,0 +1,21 @@ +package com.amazonaws.serverless.sample.springboot; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; + + +@SpringBootApplication +@ComponentScan(basePackages = "com.amazonaws.serverless.sample.springboot.controller") +public class Application extends SpringBootServletInitializer { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java new file mode 100644 index 00000000..4e272ab7 --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java @@ -0,0 +1,46 @@ +package com.amazonaws.serverless.sample.springboot; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class LambdaHandler implements RequestStreamHandler { + private SpringBootLambdaContainerHandler handler; + private static ObjectMapper mapper = new ObjectMapper(); + private Logger log = LoggerFactory.getLogger(LambdaHandler.class); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + if (handler == null) { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + + } catch (ContainerInitializationException e) { + e.printStackTrace(); + outputStream.close(); + return; + } + } + + AwsProxyRequest request = mapper.readValue(inputStream, AwsProxyRequest.class); + + AwsProxyResponse resp = handler.proxy(request, context); + mapper.writeValue(outputStream, resp); + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java new file mode 100644 index 00000000..1cf57452 --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.sample.springboot; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private SpringBootLambdaContainerHandler handler; + private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + if (handler == null) { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + } catch (ContainerInitializationException e) { + log.error("Cannot initialize Spring container", e); + outputStream.close(); + throw new RuntimeException(e); + } + } + + AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class); + + AwsProxyResponse resp = handler.proxy(request, context); + + LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java new file mode 100644 index 00000000..cd879543 --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java @@ -0,0 +1,78 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot.controller; + + + +import com.amazonaws.serverless.sample.springboot.model.Pet; +import com.amazonaws.serverless.sample.springboot.model.PetData; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + System.out.println(principal.getName()); + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet listPets() { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java new file mode 100644 index 00000000..74d7ecbf --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java new file mode 100644 index 00000000..1b07530c --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java new file mode 100644 index 00000000..05026fd3 --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot/pet-store/src/main/resources/logback.xml b/samples/springboot/pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..14a3a84f --- /dev/null +++ b/samples/springboot/pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 14a4333673c72b3e4d9e272d22e6bf5e8bb691e8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 11 Jan 2018 13:35:09 -0800 Subject: [PATCH 0069/1214] Addressed duplicate parameters bug reported in #86 and added unit test for it. --- .../servlet/AwsProxyHttpServletRequest.java | 10 ++------ .../AwsProxyHttpServletRequestTest.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index b57f18ae..d48a18b4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -88,13 +88,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { //------------------------------------------------------------- public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext) { - super(lambdaContext); - this.request = awsProxyRequest; - this.securityContext = awsSecurityContext; - this.config = ContainerConfig.defaultConfig(); - - this.urlEncodedFormParameters = getFormUrlEncodedParametersMap(); - this.multipartFormParameters = getMultipartFormParametersMap(); + this(awsProxyRequest, lambdaContext, awsSecurityContext, ContainerConfig.defaultConfig()); } public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext, ContainerConfig config) { @@ -506,7 +500,7 @@ public Map getParameterMap() { if (request.getQueryStringParameters() != null) { for (Map.Entry entry : request.getQueryStringParameters().entrySet()) { - if (params.containsKey(entry.getKey())) { + if (params.containsKey(entry.getKey()) && !params.get(entry.getKey()).contains(entry.getValue())) { params.get(entry.getKey()).add(entry.getValue()); } else { List valueList = new ArrayList<>(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 862a5245..fc104432 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -11,6 +11,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; import static org.junit.Assert.*; @@ -42,6 +43,9 @@ public class AwsProxyHttpServletRequestTest { .cookie(FORM_PARAM_TEST, FORM_PARAM_NAME_VALUE).build(); private static final AwsProxyRequest REQUEST_MALFORMED_COOKIE = new AwsProxyRequestBuilder("/hello", "GET") .header(HttpHeaders.COOKIE, QUERY_STRING_NAME_VALUE).build(); + private static final AwsProxyRequest REQUEST_MULTIPLE_FORM_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST") + .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE) + .queryString(FORM_PARAM_TEST, QUERY_STRING_NAME_VALUE).build(); private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING; static { @@ -177,4 +181,25 @@ public void queryParameters_getParameterNames_notNull() { assertEquals(1, parameterNames.size()); assertTrue(parameterNames.contains(FORM_PARAM_NAME)); } + + @Test + public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { + HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_MULTIPLE_FORM_AND_QUERY, null, null); + + Map params = request.getParameterMap(); + assertNotNull(params); + assertEquals(2, params.size()); + assertNotNull(params.get(FORM_PARAM_NAME)); + assertEquals(1, params.get(FORM_PARAM_NAME).length); + assertNotNull(params.get(FORM_PARAM_TEST)); + assertEquals(1, params.get(FORM_PARAM_TEST).length); + + params = request.getParameterMap(); + assertNotNull(params); + assertEquals(2, params.size()); + assertNotNull(params.get(FORM_PARAM_NAME)); + assertEquals(1, params.get(FORM_PARAM_NAME).length); + assertNotNull(params.get(FORM_PARAM_TEST)); + assertEquals(1, params.get(FORM_PARAM_TEST).length); + } } From 5cac5743ac6bfd473d30853214ee19085202d571 Mon Sep 17 00:00:00 2001 From: Benedikt Linse <3542487+1123@users.noreply.github.com> Date: Fri, 12 Jan 2018 10:16:41 +0100 Subject: [PATCH 0070/1214] Bugfix: Adding locale to DateTimeFormatter initialization as discussed in the following issue: https://github.com/awslabs/aws-serverless-java-container/issues/96 --- .../serverless/proxy/model/CognitoAuthorizerClaimsTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java index 1805edf3..de8b3654 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.util.Locale; import static org.junit.Assert.*; @@ -19,7 +20,7 @@ public class CognitoAuthorizerClaimsTest { private static final String EXP_TIME = "Mon Apr 17 23:12:49 UTC 2017"; private static final String ISSUE_TIME = "Mon Apr 17 22:12:49 UTC 2017"; - static final DateTimeFormatter TOKEN_DATE_FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); + static final DateTimeFormatter TOKEN_DATE_FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy").withLocale(Locale.ENGLISH); private static final String USER_POOLS_REQUEST = "{\n" + " \"resource\": \"/restaurants\",\n" From 0ea244445faf15175b232f0906aaacecb5ece5bd Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 12 Jan 2018 10:52:51 -0800 Subject: [PATCH 0071/1214] Removed jackson as a global dependency so that we can have different versions in each implementation --- aws-serverless-java-container-core/pom.xml | 10 ++++- aws-serverless-java-container-jersey/pom.xml | 14 +++++- .../proxy/jersey/EchoJerseyResource.java | 1 - .../proxy/jersey/JerseyAwsProxyTest.java | 29 ++++++------ .../providers/CustomExceptionMapper.java | 5 +++ aws-serverless-java-container-spring/pom.xml | 3 +- .../proxy/spring/SpringAwsProxyTest.java | 1 + pom.xml | 4 -- samples/spring/pet-store/pom.xml | 8 +++- samples/spring/pet-store/sam.yaml | 2 +- .../spring/PetStoreSpringAppConfig.java | 44 +++++++++++++++++++ 11 files changed, 97 insertions(+), 24 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 6c675b9b..13b2c9b4 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -14,6 +14,12 @@ 0.9-SNAPSHOT + + 2.9.3 + 2.0.1 + 3.1.0 + + @@ -26,14 +32,14 @@ javax.servlet javax.servlet-api - 3.1.0 + ${servlet.version} javax.ws.rs javax.ws.rs-api - 2.0.1 + ${jaxrs.version} diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d462beae..9bd904e8 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -24,6 +24,12 @@ com.amazonaws.serverless aws-serverless-java-container-core 0.9-SNAPSHOT + + + com.fasterxml.jackson.core + jackson-databind + + @@ -41,13 +47,19 @@ test + + + com.fasterxml.jackson.core + jackson-annotations + 2.8.4 + + org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version} test - com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index e3a89b8d..58f43799 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -56,7 +56,6 @@ public MapResponseModel echoServletHeaders(@Context HttpServletRequest context) String headerName = headerNames.nextElement(); headers.addValue(headerName, context.getHeader(headerName)); } - return headers; } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 36031996..71c58bd7 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -13,11 +13,11 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; +import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; -import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; -import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.glassfish.hk2.utilities.binding.AbstractBinder; +import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.process.internal.RequestScoped; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; @@ -55,17 +56,19 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey", "com.amazonaws.serverless.proxy.jersey.providers") - .register(new AbstractBinder() { - @Override - protected void configure() { - bindFactory(AwsProxyServletRequestFactory.class) - .to(HttpServletRequest.class) - .in(RequestScoped.class); - bindFactory(AwsProxyServletContextFactory.class) - .to(ServletContext.class) - .in(RequestScoped.class); - } - }); + .register(LoggingFeature.class) + .register(new AbstractBinder() { + @Override + protected void configure() { + bindFactory(AwsProxyServletRequestFactory.class) + .to(HttpServletRequest.class) + .in(RequestScoped.class); + bindFactory(AwsProxyServletContextFactory.class) + .to(ServletContext.class) + .in(RequestScoped.class); + } + }) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); private static Context lambdaContext = new MockLambdaContext(); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java index ca9cda96..e0c7d164 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java @@ -3,6 +3,7 @@ import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @@ -11,6 +12,10 @@ @Provider public class CustomExceptionMapper implements ExceptionMapper { + public CustomExceptionMapper() { + System.out.println("Starting custom exception mapper"); + } + @Inject public javax.inject.Provider request; diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7e1620fd..1b31f4b5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -15,7 +15,8 @@ - 4.3.4.RELEASE + 4.3.13.RELEASE + 2.9.3 diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 1fa4d666..1bcd6bb5 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -193,6 +193,7 @@ public void base64_binaryResponse_base64Encoding() { @Test public void injectBody_populatedResponse_noException() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-body", "POST") + .header(HttpHeaders.CONTENT_TYPE, "text/plain") .body("This is a populated body") .build(); diff --git a/pom.xml b/pom.xml index 6ddf5524..46858067 100644 --- a/pom.xml +++ b/pom.xml @@ -35,10 +35,6 @@ - - 2.8.4 - - diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 902f7f14..264914d8 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 4.3.4.RELEASE + 5.0.2.RELEASE 2.8.4 @@ -50,6 +50,12 @@ ${spring.version} + + org.springframework + spring-context + ${spring.version} + + com.fasterxml.jackson.core jackson-annotations diff --git a/samples/spring/pet-store/sam.yaml b/samples/spring/pet-store/sam.yaml index dc17076b..0e1391fa 100644 --- a/samples/spring/pet-store/sam.yaml +++ b/samples/spring/pet-store/sam.yaml @@ -10,7 +10,7 @@ Resources: CodeUri: target/serverless-spring-example-1.0-SNAPSHOT.jar MemorySize: 512 Policies: AWSLambdaBasicExecutionRole - Timeout: 20 + Timeout: 30 Events: GetResource: Type: Api diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java index 5884d170..8319410d 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java @@ -12,10 +12,54 @@ */ package com.amazonaws.serverless.sample.spring; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + @Configuration @ComponentScan("com.amazonaws.serverless.sample.spring") public class PetStoreSpringAppConfig { + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + /* + * optimization - avoids creating default exception resolvers; not required as the serverless container handles + * all exceptions + * + * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including + * an expensive ObjectMapper instance. + */ + @Bean + public HandlerExceptionResolver handlerExceptionResolver() { + return new HandlerExceptionResolver() { + + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + return null; + } + }; + } } From f80dc5da588bde382f6f14b928f8f3aaa80962a7 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 12 Jan 2018 11:42:01 -0800 Subject: [PATCH 0072/1214] Added method to SpringBoot container handler to address #88. --- .../SpringBootLambdaContainerHandler.java | 1 + .../sample/springboot/Application.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 37e83589..1d822d1f 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -113,6 +113,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // wire up the application context on the first invocation if (!initialized) { + System.setProperty("spring.profiles.active", String.join(",", springProfiles)); SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); webAppInitializers.add(springBootInitializer); diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java index a068734f..88eefa11 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java @@ -4,7 +4,17 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; @SpringBootApplication @@ -15,6 +25,40 @@ public class Application extends SpringBootServletInitializer { @Value("${logging.level.root:OFF}") String message = ""; + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + /* + * optimization - avoids creating default exception resolvers; not required as the serverless container handles + * all exceptions + * + * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including + * an expensive ObjectMapper instance. + */ + @Bean + public HandlerExceptionResolver handlerExceptionResolver() { + return new HandlerExceptionResolver() { + + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + return null; + } + }; + } + public static void main(String[] args) { SpringApplication.run(Application.class, args); } From 674b454322af996a44394db88cf5372cd6d76244 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 12 Jan 2018 11:48:12 -0800 Subject: [PATCH 0073/1214] Added null check on spring boot profiles --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 1d822d1f..164e8e1d 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -113,7 +113,9 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // wire up the application context on the first invocation if (!initialized) { - System.setProperty("spring.profiles.active", String.join(",", springProfiles)); + if (springProfiles != null && springProfiles.length > 0) { + System.setProperty("spring.profiles.active", String.join(",", springProfiles)); + } SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); webAppInitializers.add(springBootInitializer); From 1fd3cacbf2e71bdb11483376bd057ef0640baf0d Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 12 Jan 2018 12:33:21 -0800 Subject: [PATCH 0074/1214] Cleaned up samples pom files and added logging dependency to address #80. Also added a call int the exception handler for applications that don't include an appender or run in sam-local --- .../proxy/AwsProxyExceptionHandler.java | 4 +++ samples/jersey/pet-store/pom.xml | 11 +++----- .../sample/jersey/PetsResource.java | 3 +++ samples/spark/pet-store/pom.xml | 19 +++----------- samples/spring/pet-store/pom.xml | 26 +++---------------- samples/springboot/pet-store/pom.xml | 7 ++--- 6 files changed, 22 insertions(+), 48 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index e515353b..29a96410 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -76,6 +76,10 @@ public class AwsProxyExceptionHandler @Override public AwsProxyResponse handle(Throwable ex) { log.error("Called exception handler for:", ex); + + // adding a print stack trace in case we have no appender or we are running inside SAM local, where need the + // output to go to the stderr. + ex.printStackTrace(); if (ex instanceof InvalidRequestEventException) { return new AwsProxyResponse(500, headers, getErrorJson(INTERNAL_SERVER_ERROR)); } else { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 2c3cb9c8..093e5ace 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -49,16 +49,13 @@ ${jersey.version} + - com.amazonaws - aws-lambda-java-log4j + io.symphonia + lambda-logging 1.0.0 - - org.slf4j - slf4j-log4j12 - 1.7.21 - + diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java index 2d92510d..0ce0979e 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java @@ -15,6 +15,9 @@ import com.amazonaws.serverless.sample.jersey.model.Pet; import com.amazonaws.serverless.sample.jersey.model.PetData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index a291acf7..f6d488fd 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -37,18 +37,6 @@ [0.1,) - - com.amazonaws - aws-lambda-java-core - 1.1.0 - - - - com.amazonaws - aws-lambda-java-log4j - 1.0.0 - - com.sparkjava @@ -77,10 +65,11 @@ ${jackson.version} + - org.slf4j - slf4j-log4j12 - 1.7.21 + io.symphonia + lambda-logging + 1.0.0 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 264914d8..144e9d47 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -56,32 +56,12 @@ ${spring.version} + - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - com.amazonaws - aws-lambda-java-log4j + io.symphonia + lambda-logging 1.0.0 - - org.slf4j - slf4j-log4j12 - 1.7.21 - diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index efc60801..efb3313f 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -25,10 +25,11 @@ [0.1,) + - com.amazonaws - aws-lambda-java-core - 1.1.0 + io.symphonia + lambda-logging + 1.0.0 From 06756285a14c3917a1799c85213d0c4c9fdb449f Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 12 Jan 2018 15:29:28 -0800 Subject: [PATCH 0075/1214] Adding issue template to repo --- .github/ISSUE_TEMPLATE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..14b1a472 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,12 @@ +* Framework version: XX +* Implementations: Jersey / Spring / Spring Boot / Spark + +## Scenario + +## Expected behavior + +## Actual behavior + +## Steps to reproduce + +## Full log output From 267961656ab2ccab99b26d61ddc2c0f7ca7b017f Mon Sep 17 00:00:00 2001 From: sapessi Date: Sat, 13 Jan 2018 15:00:55 -0800 Subject: [PATCH 0076/1214] Major chages to Jersey's implementation. Moved to using servlet requests and responses as underlying objects. This solves #62 and simplifies writers and readers by condensing everything in the servlet implementation --- .../serverless/proxy/RequestReader.java | 5 + .../servlet/AwsProxyHttpServletRequest.java | 10 +- .../AwsProxyHttpServletRequestReader.java | 1 + .../jersey/JerseyAwsProxyRequestReader.java | 148 ------------- .../jersey/JerseyAwsProxyResponseWriter.java | 73 ------- .../proxy/jersey/JerseyHandlerFilter.java | 194 ++++++++++++++++++ .../jersey/JerseyLambdaContainerHandler.java | 111 ++++------ ....java => JerseyServletResponseWriter.java} | 98 ++++----- .../AwsProxyServletContextFactory.java | 18 +- .../AwsProxyServletRequestFactory.java | 32 +-- .../AwsProxyServletResponseFactory.java | 66 ++++++ .../proxy/jersey/EchoJerseyResource.java | 12 +- .../proxy/jersey/JerseyAwsProxyTest.java | 19 ++ .../spark/SparkLambdaContainerHandler.java | 2 + 14 files changed, 409 insertions(+), 380 deletions(-) delete mode 100644 aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java delete mode 100644 aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java create mode 100644 aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java rename aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/{JerseyResponseWriter.java => JerseyServletResponseWriter.java} (59%) create mode 100644 aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index 1a63aec8..4b1028ea 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -50,6 +50,11 @@ public abstract class RequestReader { */ public static final String LAMBDA_CONTEXT_PROPERTY = "com.amazonaws.lambda.context"; + /** + * The key for the JAX RS security context properties stored in the request attributes + */ + public static final String JAX_SECURITY_CONTEXT_PROPERTY = "com.amazonaws.serverless.jaxrs.securityContext"; + //------------------------------------------------------------- // Methods - Abstract diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index d48a18b4..88909ef7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -79,7 +79,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private SecurityContext securityContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; - private Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); + private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; @@ -749,9 +749,13 @@ private Map> getFormUrlEncodedParametersMap() { return output; } - private String decodeValueIfEncoded(String value) { + public static String decodeValueIfEncoded(String value) { + if (value == null) { + return null; + } + try { - return URLDecoder.decode(value, DEFAULT_CHARACTER_ENCODING); + return URLDecoder.decode(value, LambdaContainerHandler.getContainerConfig().getUriEncoding()); } catch (UnsupportedEncodingException e) { log.warn("Could not decode body content - proceeding as if it was already decoded", e); return value; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 949ed7e3..e7905bd9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -38,6 +38,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext()); servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables()); servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext); + servletRequest.setAttribute(JAX_SECURITY_CONTEXT_PROPERTY, securityContext); return servletRequest; } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java deleted file mode 100644 index e90902b6..00000000 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyRequestReader.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.jersey; - - -import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.services.lambda.runtime.Context; -import org.glassfish.jersey.internal.MapPropertiesDelegate; -import org.glassfish.jersey.internal.PropertiesDelegate; -import org.glassfish.jersey.server.ContainerRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.core.SecurityContext; -import javax.ws.rs.core.UriBuilder; - -import java.io.ByteArrayInputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Base64; - - -/** - * Default implementation of the RequestReader object. This object reads an incoming AwsProxyRequest - * event and transform it into a Jersey ContainerRequest object. The object sets three custom properties in the - * request's PropertiesDelegate object: The API Gateway request context, the Map of stage variables, and the - * Lambda context object. - * - * The useStageAsBasePath configuration variable lets you set whether the stage name should be included in the - * request path passed to the Jersey application handler. - */ -public class JerseyAwsProxyRequestReader extends RequestReader { - - //------------------------------------------------------------- - // Variables - Private - Static - //------------------------------------------------------------- - - private static AwsProxyRequest currentRequest; - private static Context currentLambdaContext; - - private Logger log = LoggerFactory.getLogger(JerseyAwsProxyRequestReader.class); - - - //------------------------------------------------------------- - // Methods - Implementation - //------------------------------------------------------------- - - /** - * Reads an request object generated by an AWS_PROXY integration in API Gateway and transforms it into a Jersey - * ContainerRequest object. - * - * @param request The incoming request object - * @param securityContext A jax-rs SecurityContext object (@see com.amazonaws.serverless.proxy.SecurityContextWriter) - * @param lambdaContext The AWS Lambda context for the request - * @param config The container config object, this is passed in by the LambdaContainerHandler - * @return A populated ContainerRequest object - * @throws InvalidRequestEventException When the method fails to parse the incoming request - */ - @Override - public ContainerRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) - throws InvalidRequestEventException { - currentRequest = request; - currentLambdaContext = lambdaContext; - - request.setPath(stripBasePath(request.getPath(), config)); - - URI basePathUri; - URI requestPathUri; - String basePath = "/"; - - try { - basePathUri = new URI(basePath); - } catch (URISyntaxException e) { - log.error("Could not read base path URI", e); - throw new InvalidRequestEventException("Error while generating base path URI: " + basePath, e); - } - - - UriBuilder uriBuilder = UriBuilder.fromPath(request.getPath()); - - if (request.getQueryStringParameters() != null) { - for (String paramKey : request.getQueryStringParameters().keySet()) { - uriBuilder = uriBuilder.queryParam(paramKey, request.getQueryStringParameters().get(paramKey)); - } - } - - requestPathUri = uriBuilder.build(); - - PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate(); - apiGatewayProperties.setProperty(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext()); - apiGatewayProperties.setProperty(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables()); - apiGatewayProperties.setProperty(LAMBDA_CONTEXT_PROPERTY, lambdaContext); - - ContainerRequest requestContext = new ContainerRequest(basePathUri, requestPathUri, request.getHttpMethod(), securityContext, apiGatewayProperties); - - if (request.getBody() != null) { - if (request.isBase64Encoded()) { - requestContext.setEntityStream(new ByteArrayInputStream(Base64.getDecoder().decode(request.getBody()))); - } else { - requestContext.setEntityStream(new ByteArrayInputStream(request.getBody().getBytes())); - } - } - - if (request.getHeaders() != null) { - for (final String headerName : request.getHeaders().keySet()) { - requestContext.headers(headerName, request.getHeaders().get(headerName)); - } - } - - return requestContext; - } - - //------------------------------------------------------------- - // Methods - Protected - //------------------------------------------------------------- - - @Override - protected Class getRequestClass() { - return AwsProxyRequest.class; - } - - - //------------------------------------------------------------- - // Methods - Package - //------------------------------------------------------------- - - public static AwsProxyRequest getCurrentRequest() { - return currentRequest; - } - - - public static Context getCurrentLambdaContext() { - return currentLambdaContext; - } -} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java deleted file mode 100644 index cbf9f18a..00000000 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyResponseWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.jersey; - - -import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import java.util.Base64; - - -/** - * Transforms the data from a JerseyResponseWriter object into a valid AwsProxyResponse object. - * - * @see com.amazonaws.serverless.proxy.jersey.JerseyResponseWriter - * @see AwsProxyResponse - */ -public class JerseyAwsProxyResponseWriter extends ResponseWriter { - - //------------------------------------------------------------- - // Methods - Implementation - //------------------------------------------------------------- - - /** - * Reads the data from the JerseyResponseWriter object and creates an AwsProxyResponse object - * - * @param containerResponse The container response or response reader object - * @param lambdaContext The context for the Lambda function execution - * @return An initialized AwsProxyResponse object - * @throws InvalidResponseObjectException When the library fails to read the JerseyResponseWriter object - */ - @Override - public AwsProxyResponse writeResponse(JerseyResponseWriter containerResponse, Context lambdaContext) - throws InvalidResponseObjectException { - try { - AwsProxyResponse response = new AwsProxyResponse(); - response.setStatusCode(containerResponse.getStatusCode()); - - if (containerResponse.getHeaders() != null && containerResponse.getHeaders().size() > 0) { - response.setHeaders(containerResponse.getHeaders()); - } - - if (containerResponse.getResponseBody() != null) { - String responseString; - - if (isValidUtf8(containerResponse.getResponseBody().toByteArray())) { - responseString = new String(containerResponse.getResponseBody().toByteArray()); - } else { - responseString = Base64.getMimeEncoder().encodeToString(containerResponse.getResponseBody().toByteArray()); - response.setBase64Encoded(true); - } - - response.setBody(responseString); - } - - return response; - } catch (Exception ex) { - throw new InvalidResponseObjectException(ex.getMessage(), ex); - } - } -} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java new file mode 100644 index 00000000..db455ad2 --- /dev/null +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -0,0 +1,194 @@ +package com.amazonaws.serverless.proxy.jersey; + + +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; + +import org.glassfish.jersey.internal.MapPropertiesDelegate; +import org.glassfish.jersey.internal.PropertiesDelegate; +import org.glassfish.jersey.server.ApplicationHandler; +import org.glassfish.jersey.server.ContainerRequest; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.server.spi.Container; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.SecurityContext; +import javax.ws.rs.core.UriBuilder; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Enumeration; +import java.util.concurrent.CountDownLatch; + +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY; + + +public class JerseyHandlerFilter implements Filter, Container { + public static final String JERSEY_SERVLET_REQUEST_PROPERTY = "com.amazonaws.serverless.jersey.servletRequest"; + public static final String JERSEY_SERVLET_RESPONSE_PROPERTY = "com.amazonaws.serverless.jersey.servletResponse"; + + private ApplicationHandler jersey; + private Application app; + private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class); + + public JerseyHandlerFilter(Application jaxApplication) { + app = jaxApplication; + } + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + log.info("Initialize Jersey application handler"); + jersey = new ApplicationHandler(app); + jersey.onStartup(this); + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + log.debug("Called Jersey filter"); + // we use a latch to make the processing inside Jersey synchronous + CountDownLatch jerseyLatch = new CountDownLatch(1); + + ContainerRequest req = servletRequestToContainerRequest(servletRequest); + req.setWriter(new JerseyServletResponseWriter(servletResponse, jerseyLatch)); + + req.setProperty(JERSEY_SERVLET_RESPONSE_PROPERTY, servletResponse); + + jersey.handle(req); + try { + jerseyLatch.await(); + } catch (InterruptedException e) { + log.error("Interrupted while processing request", e); + throw new InternalServerErrorException(e); + } + + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + log.info("Jersey filter destroy"); + jersey.onShutdown(this); + } + + private ContainerRequest servletRequestToContainerRequest(ServletRequest request) { + URI basePathUri; + URI requestPathUri; + String basePath = "/"; + HttpServletRequest servletRequest = (HttpServletRequest)request; + + try { + if (servletRequest.getContextPath().equals("")) { + basePathUri = URI.create(basePath); + } else { + basePathUri = new URI(servletRequest.getContextPath()); + } + } catch (URISyntaxException e) { + log.error("Could not read base path URI", e); + basePathUri = URI.create(basePath); + } + + UriBuilder uriBuilder = UriBuilder.fromPath(servletRequest.getPathInfo()); + uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString())); + + requestPathUri = uriBuilder.build(); + + PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate(); + apiGatewayProperties.setProperty(API_GATEWAY_CONTEXT_PROPERTY, servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY)); + apiGatewayProperties.setProperty(API_GATEWAY_STAGE_VARS_PROPERTY, servletRequest.getAttribute(API_GATEWAY_STAGE_VARS_PROPERTY)); + apiGatewayProperties.setProperty(LAMBDA_CONTEXT_PROPERTY, servletRequest.getAttribute(LAMBDA_CONTEXT_PROPERTY)); + apiGatewayProperties.setProperty(JERSEY_SERVLET_REQUEST_PROPERTY, servletRequest); + + ContainerRequest requestContext = new ContainerRequest( + basePathUri, + requestPathUri, + servletRequest.getMethod().toUpperCase(), + (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), + apiGatewayProperties); + + InputStream requestInputStream = null; + try { + requestInputStream = servletRequest.getInputStream(); + if (requestInputStream != null) { + requestContext.setEntityStream(requestInputStream); + } + } catch (IOException e) { + log.error("Could not read input stream from request", e); + } + + Enumeration headerNames = servletRequest.getHeaderNames(); + + while (headerNames.hasMoreElements()) { + String headerKey = headerNames.nextElement(); + requestContext.header(headerKey, servletRequest.getHeader(headerKey)); + } + + return requestContext; + } + + //------------------------------------------------------------- + // Implementation - Container + //------------------------------------------------------------- + + + @Override + public ResourceConfig getConfiguration() { + return jersey.getConfiguration(); + } + + + @Override + public ApplicationHandler getApplicationHandler() { + return jersey; + } + + + /** + * Shuts down and restarts the application handler in the current container. The ApplicationHandler + * object is re-initialized with the Application object initially set in the LambdaContainer.getInstance() + * call. + */ + @Override + public void reload() { + jersey.onShutdown(this); + + jersey = new ApplicationHandler(app); + + jersey.onReload(this); + jersey.onStartup(this); + } + + + /** + * Restarts the application handler and configures a different Application object. The new application + * resets the one currently configured in the container. + * @param resourceConfig An initialized Application + */ + @Override + public void reload(ResourceConfig resourceConfig) { + jersey.onShutdown(this); + + app = resourceConfig; + jersey = new ApplicationHandler(resourceConfig); + + jersey.onReload(this); + jersey.onStartup(this); + } +} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 297a5962..2eaaeec9 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -20,6 +20,11 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -29,8 +34,11 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spi.Container; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; import javax.ws.rs.core.Application; +import java.util.EnumSet; import java.util.concurrent.CountDownLatch; @@ -58,8 +66,7 @@ * @param The type for the incoming Lambda event * @param The type for Lambda's return value */ -public class JerseyLambdaContainerHandler extends LambdaContainerHandler - implements Container { +public class JerseyLambdaContainerHandler extends AwsLambdaServletContainerHandler { //------------------------------------------------------------- // Variables - Private @@ -67,8 +74,10 @@ public class JerseyLambdaContainerHandler extends Lam // The Jersey application object private Application jaxRsApplication; - // The Jersey app handler to route requests - private ApplicationHandler applicationHandler; + + private JerseyHandlerFilter jerseyFilter; + // tracker for the first request + private boolean initialized; //------------------------------------------------------------- @@ -85,8 +94,8 @@ public class JerseyLambdaContainerHandler extends Lam * @return A JerseyLambdaContainerHandler object */ public static JerseyLambdaContainerHandler getAwsProxyHandler(Application jaxRsApplication) { - return new JerseyLambdaContainerHandler<>(new JerseyAwsProxyRequestReader(), - new JerseyAwsProxyResponseWriter(), + return new JerseyLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), jaxRsApplication); @@ -106,89 +115,49 @@ public static JerseyLambdaContainerHandler ge * @param exceptionHandler An exception handler * @param jaxRsApplication The JaxRs application */ - public JerseyLambdaContainerHandler(RequestReader requestReader, - ResponseWriter responseWriter, + public JerseyLambdaContainerHandler(RequestReader requestReader, + ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, Application jaxRsApplication) { super(requestReader, responseWriter, securityContextWriter, exceptionHandler); this.jaxRsApplication = jaxRsApplication; - this.applicationHandler = new ApplicationHandler(jaxRsApplication); - - applicationHandler.onStartup(this); + this.initialized = false; + this.jerseyFilter = new JerseyHandlerFilter(this.jaxRsApplication); } - //------------------------------------------------------------- - // Implementation - Container + // Methods - Implementation //------------------------------------------------------------- - /** - * Gets the configuration currently set in the internal ApplicationHandler - * - * @return The Jersey's ResourceConfig object currently running in the container - */ - public ResourceConfig getConfiguration() { - return applicationHandler.getConfiguration(); - } - - - /** - * The instantiated ApplicationHandler object used by this container - * - * @return Jersey's ApplicationHander object - */ - public ApplicationHandler getApplicationHandler() { - return applicationHandler; - } - - - /** - * Shuts down and restarts the application handler in the current container. The ApplicationHandler - * object is re-initialized with the Application object initially set in the LambdaContainer.getInstance() - * call. - */ - public void reload() { - applicationHandler.onShutdown(this); - - this.applicationHandler = new ApplicationHandler(jaxRsApplication); - - applicationHandler.onReload(this); - applicationHandler.onStartup(this); + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); } + @Override + protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) + throws Exception { - /** - * Restarts the application handler and configures a different Application object. The new application - * resets the one currently configured in the container. - * @param resourceConfig An initialized Application - */ - public void reload(ResourceConfig resourceConfig) { - applicationHandler.onShutdown(this); - - this.jaxRsApplication = resourceConfig; - this.applicationHandler = new ApplicationHandler(resourceConfig); - - applicationHandler.onReload(this); - applicationHandler.onStartup(this); - } - + // this method of the AwsLambdaServletContainerHandler sets the request context + super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); - //------------------------------------------------------------- - // Methods - Implementation - //------------------------------------------------------------- + if (!initialized) { + // call the onStartup event if set to give developers a chance to set filters in the context + if (startupHandler != null) { + startupHandler.onStartup(getServletContext()); + } - @Override - protected JerseyResponseWriter getContainerResponse(ContainerRequest request, CountDownLatch latch) { - return new JerseyResponseWriter(latch); - } + // manually add the spark filter to the chain. This should the last one and match all uris + FilterRegistration.Dynamic jerseyFilterReg = getServletContext().addFilter("JerseyFilter", jerseyFilter); + jerseyFilterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + initialized = true; + } - @Override - protected void handleRequest(ContainerRequest containerRequest, JerseyResponseWriter jerseyResponseWriter, Context lambdaContext) { - containerRequest.setWriter(jerseyResponseWriter); + httpServletRequest.setServletContext(getServletContext()); - applicationHandler.handle(containerRequest); + doFilter(httpServletRequest, httpServletResponse, null); } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java similarity index 59% rename from aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java rename to aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java index 89a038b1..93ecc900 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java @@ -13,17 +13,18 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; - import org.glassfish.jersey.server.ContainerException; import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.spi.ContainerResponseWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import javax.ws.rs.core.HttpHeaders; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.InternalServerErrorException; -import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.OutputStream; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; @@ -35,18 +36,16 @@ * AwsProxyResponse object. The response object is passed in the constructor alongside an ExceptionHandler * instance. */ -class JerseyResponseWriter +class JerseyServletResponseWriter implements ContainerResponseWriter { //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- - private CountDownLatch responseMutex; - private Map headers; - private int statusCode; - private ByteArrayOutputStream responseBody; - + private HttpServletResponse servletResponse; + private Logger log = LoggerFactory.getLogger(JerseyServletResponseWriter.class); + private CountDownLatch jerseyLatch; //------------------------------------------------------------- // Constructors @@ -54,11 +53,11 @@ class JerseyResponseWriter /** * Creates a new response writer. - * @param latch The latch object is used to synchronize the response request handling and response generation for - * AWS Lambda + * @param resp The current ServletResponse from the container */ - JerseyResponseWriter(CountDownLatch latch) { - this.responseMutex = latch; + public JerseyServletResponseWriter(ServletResponse resp, CountDownLatch latch) { + servletResponse = (HttpServletResponse)resp; + jerseyLatch = latch; } @@ -75,74 +74,57 @@ class JerseyResponseWriter */ public OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerResponse containerResponse) throws ContainerException { - statusCode = containerResponse.getStatusInfo().getStatusCode(); - - if (headers == null) { - headers = new HashMap<>(); - } - + servletResponse.setStatus(containerResponse.getStatusInfo().getStatusCode()); for (final Map.Entry> e : containerResponse.getStringHeaders().entrySet()) { for (final String value : e.getValue()) { - // special case for set cookies - // RFC 2109 allows for a comma separated list of cookies in one Set-Cookie header: https://tools.ietf.org/html/rfc2109 - if (e.getKey().equals(HttpHeaders.SET_COOKIE)) { - if (headers.containsKey(e.getKey()) && LambdaContainerHandler.getContainerConfig().isConsolidateSetCookieHeaders()) { - headers.put(e.getKey(), headers.get(e.getKey()) + ", " + value); - } else { - headers.put(e.getKey(), containerResponse.getStringHeaders().getFirst(e.getKey())); - break; - } - } else { - headers.put(e.getKey(), value); - } + servletResponse.setHeader(e.getKey(), value); } } - - responseBody = new ByteArrayOutputStream(); - - return responseBody; + try { + return servletResponse.getOutputStream(); + } catch (IOException e) { + log.error("Could not get servlet response output stream", e); + throw new InternalServerErrorException("Could not get servlet response output stream", e); + } } public boolean suspend(long l, TimeUnit timeUnit, TimeoutHandler timeoutHandler) { + log.debug("Suspend"); return false; } public void setSuspendTimeout(long l, TimeUnit timeUnit) throws IllegalStateException { + log.debug("SuspectTimeout"); } public void commit() { - responseMutex.countDown(); + try { + log.debug("commit"); + jerseyLatch.countDown(); + servletResponse.flushBuffer(); + } catch (IOException e) { + log.error("Could not commit response", e); + throw new InternalServerErrorException(e); + } } public void failure(Throwable throwable) { - responseMutex.countDown(); + try { + log.error("failure", throwable); + jerseyLatch.countDown(); + servletResponse.flushBuffer(); + } catch (IOException e) { + log.error("Could not fail response", e); + throw new InternalServerErrorException(e); + } } public boolean enableResponseBuffering() { return false; } - - - //------------------------------------------------------------- - // Methods - Package - //------------------------------------------------------------- - - Map getHeaders() { - return headers; - } - - - int getStatusCode() { - return statusCode; - } - - - ByteArrayOutputStream getResponseBody() { - return responseBody; - } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java index 4144d8db..e0f93f17 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java @@ -14,8 +14,13 @@ import org.glassfish.hk2.api.Factory; +import org.glassfish.jersey.server.ContainerRequest; import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Context; + +import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; /** @@ -37,9 +42,20 @@ * */ public class AwsProxyServletContextFactory implements Factory { + @Context ContainerRequest currentRequest; + @Override public ServletContext provide() { - return AwsProxyServletRequestFactory.getRequest().getServletContext(); + HttpServletRequest req = (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); + if (req == null) { + System.out.println("req is null"); + } + System.out.println(req.getPathInfo()); + ServletContext ctx = req.getServletContext(); + if (ctx == null) { + System.out.println("ServletContext is null"); + } + return ctx; } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java index 3b353871..6dc38d0f 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java @@ -13,19 +13,16 @@ package com.amazonaws.serverless.proxy.jersey.factory; -import com.amazonaws.serverless.exceptions.InvalidRequestEventException; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; -import com.amazonaws.serverless.proxy.jersey.JerseyAwsProxyRequestReader; -import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; - import org.glassfish.hk2.api.Factory; +import org.glassfish.jersey.server.ContainerRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Context; + +import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; + /** * Implementation of Jersey's Factory object for HttpServletRequest objects. This can be used @@ -48,7 +45,7 @@ public class AwsProxyServletRequestFactory implements Factory { - private static AwsProxyHttpServletRequestReader requestReader = new AwsProxyHttpServletRequestReader(); + @Context ContainerRequest currentRequest; private static Logger log = LoggerFactory.getLogger(AwsProxyServletRequestFactory.class); //------------------------------------------------------------- @@ -57,26 +54,11 @@ public class AwsProxyServletRequestFactory @Override public HttpServletRequest provide() { - return getRequest(); + return (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); } @Override public void dispose(HttpServletRequest httpServletRequest) { } - - public static HttpServletRequest getRequest() { - try { - AwsProxyHttpServletRequest req = requestReader.readRequest(JerseyAwsProxyRequestReader.getCurrentRequest(), - AwsProxySecurityContextWriter.getCurrentContext(), - JerseyAwsProxyRequestReader.getCurrentLambdaContext(), - JerseyLambdaContainerHandler.getContainerConfig()); - req.setServletContext(new AwsServletContext(null)); - return req; - } catch (InvalidRequestEventException e) { - log.error("Invalid request event", e); - return null; - } - - } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java new file mode 100644 index 00000000..79768aaf --- /dev/null +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java @@ -0,0 +1,66 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.jersey.factory; + + +import org.glassfish.hk2.api.Factory; +import org.glassfish.jersey.server.ContainerRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Context; + +import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; +import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_RESPONSE_PROPERTY; + + +/** + * Implementation of Jersey's Factory object for HttpServletRequest objects. This can be used + * by Jersey to generate a Servlet request given an AwsProxyRequest event. + * + *
+ * 
+ *     ResourceConfig app = new ResourceConfig().packages("my.app.package")
+ *         .register(new AbstractBinder() {
+ *             {@literal @}Override
+ *             protected void configure() {
+ *                 bindFactory(AwsProxyServletRequestFactory.class)
+ *                     .to(HttpServletRequest.class)
+ *                     .in(RequestScoped.class);
+ *            }
+ *       });
+ * 
+ * 
+ */ +public class AwsProxyServletResponseFactory + implements Factory { + + @Context ContainerRequest currentRequest; + private static Logger log = LoggerFactory.getLogger(AwsProxyServletResponseFactory.class); + + //------------------------------------------------------------- + // Implementation - Factory + //------------------------------------------------------------- + + @Override + public HttpServletResponse provide() { + return (HttpServletResponse)currentRequest.getProperty(JERSEY_SERVLET_RESPONSE_PROPERTY); + } + + + @Override + public void dispose(HttpServletResponse httpServletRequest) { + } +} diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 58f43799..86bac4f3 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -19,6 +19,7 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.ws.rs.*; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.core.Context; @@ -33,7 +34,7 @@ */ @Path("/echo") public class EchoJerseyResource { - + public static final String SERVLET_RESP_HEADER_KEY = "X-HttpServletResponse"; public static final String EXCEPTION_MESSAGE = "Fake exception"; @Path("/headers") @GET @@ -120,6 +121,15 @@ public Response echoCustomStatusCode(@QueryParam("status") int statusCode ) { return Response.status(statusCode).entity(output).build(); } + @Path("/servlet-response") @GET + @Produces(MediaType.APPLICATION_JSON) + public Response echoCustomStatusCode(@Context HttpServletResponse resp) { + SingleValueModel output = new SingleValueModel(); + output.setValue("Custom header in resp"); + resp.setHeader(SERVLET_RESP_HEADER_KEY, "1"); + return Response.ok().entity(output).build(); + } + @Path("/binary") @GET @Produces("application/octet-stream") public Response echoBinaryData() { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 71c58bd7..bbb28853 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -15,6 +15,7 @@ import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; +import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletResponseFactory; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -35,6 +36,7 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Response; import java.io.IOException; @@ -66,6 +68,9 @@ protected void configure() { bindFactory(AwsProxyServletContextFactory.class) .to(ServletContext.class) .in(RequestScoped.class); + bindFactory(AwsProxyServletResponseFactory.class) + .to(HttpServletResponse.class) + .in(RequestScoped.class); } }) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); @@ -101,10 +106,24 @@ public void headers_servletRequest_echo() { validateMapResponseModel(output); } + @Test + public void context_servletResponse_setCustomHeader() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-response", "GET") + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertTrue(output.getHeaders().containsKey(EchoJerseyResource.SERVLET_RESP_HEADER_KEY)); + } + @Test public void context_serverInfo_correctContext() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-context", "GET").build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); + for (String header : output.getHeaders().keySet()) { + System.out.println(header + ": " + output.getHeaders().get(header)); + } assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getHeaders().get("Content-Type")); diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 87a99946..590633af 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -185,6 +185,8 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); } + httpServletRequest.setServletContext(getServletContext()); + doFilter(httpServletRequest, httpServletResponse, null); } } From b3089e3cc0fa4f8d32899d085320062533e2e1e9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 15 Jan 2018 20:38:03 -0800 Subject: [PATCH 0077/1214] Code cleanup with FindBugs and added FindBugs to build process --- aws-serverless-java-container-core/pom.xml | 74 +++++++++ .../proxy/AwsProxySecurityContextWriter.java | 6 +- .../serverless/proxy/ResponseWriter.java | 6 +- .../internal/LambdaContainerHandler.java | 3 +- .../proxy/internal/SecurityUtils.java | 153 ++++++++++++++++++ .../jaxrs/AwsProxySecurityContext.java | 15 +- .../servlet/AwsHttpServletRequest.java | 4 +- .../servlet/AwsHttpServletResponse.java | 21 ++- .../internal/servlet/AwsHttpSession.java | 1 - .../AwsLambdaServletContainerHandler.java | 1 - .../servlet/AwsProxyHttpServletRequest.java | 138 ++++++++++------ .../internal/servlet/AwsProxyRequestPart.java | 21 ++- .../internal/servlet/AwsServletContext.java | 35 ++-- .../internal/servlet/FilterChainHolder.java | 10 +- .../internal/servlet/FilterChainManager.java | 19 ++- .../proxy/internal/servlet/FilterHolder.java | 11 +- .../servlet/filters/UrlPathValidator.java | 19 ++- .../testutils/AwsProxyRequestBuilder.java | 2 + .../proxy/model/ContainerConfig.java | 37 +++++ .../jaxrs/AwsProxySecurityContextTest.java | 8 +- aws-serverless-java-container-jersey/pom.xml | 74 +++++++++ .../proxy/jersey/JerseyHandlerFilter.java | 7 +- .../jersey/JerseyServletResponseWriter.java | 4 + .../AwsProxyServletContextFactory.java | 9 +- aws-serverless-java-container-spark/pom.xml | 69 ++++++++ .../spark/SparkLambdaContainerHandler.java | 74 +++++---- .../LambdaEmbeddedServerFactory.java | 10 +- aws-serverless-java-container-spring/pom.xml | 69 ++++++++ .../LambdaSpringApplicationInitializer.java | 37 +++-- .../proxy/spring/StaticAppProxyTest.java | 3 + .../proxy/spring/staticapp/MyController.java | 1 - pom.xml | 8 + 32 files changed, 789 insertions(+), 160 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 13b2c9b4..9794788d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -65,4 +65,78 @@ + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + ${project.build.directory}/findbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + + + + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java index 9a38bbf2..1929d3a4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java @@ -28,7 +28,7 @@ public class AwsProxySecurityContextWriter implements SecurityContextWriter 0xfff) { + buffer.append("\\u" + Integer.toHexString(ch).toUpperCase(Locale.ENGLISH)); + } else if (ch > 0xff) { + buffer.append("\\u0" + Integer.toHexString(ch).toUpperCase(Locale.ENGLISH)); + } else if (ch > 0x7f) { + buffer.append("\\u00" + Integer.toHexString(ch).toUpperCase(Locale.ENGLISH)); + } else if (ch < 32) { + switch (ch) { + case '\b': + buffer.append('\\'); + buffer.append('b'); + break; + case '\n': + buffer.append('\\'); + buffer.append('n'); + break; + case '\t': + buffer.append('\\'); + buffer.append('t'); + break; + case '\f': + buffer.append('\\'); + buffer.append('f'); + break; + case '\r': + buffer.append('\\'); + buffer.append('r'); + break; + default: + if (ch > 0xf) { + buffer.append("\\u00" + Integer.toHexString(ch).toUpperCase(Locale.ENGLISH)); + } else { + buffer.append("\\u000" + Integer.toHexString(ch).toUpperCase(Locale.ENGLISH)); + } + break; + } + } else { + switch (ch) { + case '\'': + + buffer.append('\''); + break; + case '"': + buffer.append('\\'); + buffer.append('"'); + break; + case '\\': + buffer.append('\\'); + buffer.append('\\'); + break; + case '/': + buffer.append('/'); + break; + default: + buffer.append(ch); + break; + } + } + } + + return buffer.toString(); + } + + public static String getValidFilePath(String inputPath) { + return getValidFilePath(inputPath, false); + } + + /** + * Returns an absolute file path given an input path and validates that it is not trying + * to write/read from a directory other than /tmp. + * @param inputPath The input path + * @return The absolute path to the file + * @throws IllegalArgumentException If the given path is not valid or outside of /tmp + */ + @SuppressFBWarnings("PATH_TRAVERSAL_IN") + public static String getValidFilePath(String inputPath, boolean isWrite) { + if (inputPath == null || "".equals(inputPath.trim())) { + return null; + } + + File f = new File(inputPath); + try { + String canonicalPath = f.getCanonicalPath(); + + if (isWrite && canonicalPath.startsWith("/var/task")) { + throw new IllegalArgumentException("Trying to write to /var/task folder"); + } + + boolean isAllowed = false; + for (String allowedPath : LambdaContainerHandler.getContainerConfig().getValidFilePaths()) { + if (canonicalPath.startsWith(allowedPath)) { + isAllowed = true; + break; + } + } + if (!isAllowed) { + throw new IllegalArgumentException("File path not allowed: " + encode(canonicalPath)); + } + + return canonicalPath; + } catch (IOException e) { + log.error("Invalid file path: {}", encode(inputPath)); + throw new IllegalArgumentException("Invalid file path", e); + } + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 0e561a22..5d91e142 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -43,10 +43,19 @@ public class AwsProxySecurityContext // Variables - Private //------------------------------------------------------------- - protected Context lambdaContext; - protected AwsProxyRequest event; + private Context lambdaContext; + private AwsProxyRequest event; + public Context getLambdaContext() { + return lambdaContext; + } + + + public AwsProxyRequest getEvent() { + return event; + } + //------------------------------------------------------------- // Constructors //------------------------------------------------------------- @@ -119,7 +128,7 @@ public String getAuthenticationScheme() { * Custom object for request authorized with a Cognito User Pool authorizer. By casting the Principal * object to this you can extract the Claims object included in the token. */ - public class CognitoUserPoolPrincipal implements Principal { + public static class CognitoUserPoolPrincipal implements Principal { private CognitoAuthorizerClaims claims; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 59143d91..2530d67b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; @@ -31,6 +32,7 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.security.Security; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; @@ -335,7 +337,7 @@ protected String decodeRequestPath(String requestPath, ContainerConfig config) { try { return URLDecoder.decode(requestPath, config.getUriEncoding()); } catch (UnsupportedEncodingException ex) { - log.error("Could not URL decode the request path, configured encoding not supported: " + config.getUriEncoding(), ex); + log.error("Could not URL decode the request path, configured encoding not supported: {}", SecurityUtils.encode(config.getUriEncoding())); // we do not fail at this. return requestPath; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 52b6b80a..45e272ca 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -13,7 +13,9 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +27,9 @@ import javax.ws.rs.core.MultivaluedHashMap; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.CountDownLatch; @@ -82,6 +86,7 @@ public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { //------------------------------------------------------------- + @SuppressFBWarnings("COOKIE_USAGE") @Override public void addCookie(Cookie cookie) { String cookieData = cookie.getName() + "=" + cookie.getValue(); @@ -300,7 +305,9 @@ public void write(int b) throws IOException { bodyOutputStream.write(b); } catch (Exception e) { log.error("Cannot write to output stream", e); - listener.onError(e); + if (listener != null) { + listener.onError(e); + } } } @@ -318,7 +325,7 @@ public void close() @Override public PrintWriter getWriter() throws IOException { if (null == writer) { - writer = new PrintWriter(bodyOutputStream); + writer = new PrintWriter(new OutputStreamWriter(bodyOutputStream, StandardCharsets.UTF_8)); } return writer; } @@ -365,7 +372,7 @@ public void flushBuffer() throws IOException { if (null != writer) { writer.flush(); } - responseBody = new String(bodyOutputStream.toByteArray()); + responseBody = new String(bodyOutputStream.toByteArray(), StandardCharsets.UTF_8); log.debug("Response buffer flushed with {} bytes, latch={}", responseBody.length(), writersCountDownLatch.getCount()); isCommitted = true; writersCountDownLatch.countDown(); @@ -450,14 +457,16 @@ Map getAwsResponseHeaders() { //------------------------------------------------------------- private void setHeader(String key, String value, boolean overwrite) { - List values = headers.get(key); + String encodedKey = SecurityUtils.crlf(key); + String encodedValue = SecurityUtils.crlf(value); + List values = headers.get(encodedKey); if (values == null || overwrite) { values = new ArrayList<>(); } - values.add(value); + values.add(encodedValue); - headers.put(key, values); + headers.put(encodedKey, values); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 76f56416..2b7b4257 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -38,7 +38,6 @@ public AwsHttpSession(String id) { if (null == id) { throw new RuntimeException("HTTP session id (from request ID) cannot be null"); } - log.debug("Creating session " + id); this.id = id; attributes = new HashMap<>(); creationTime = Instant.now().getEpochSecond(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index c8347caf..c3909452 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -188,7 +188,6 @@ protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet) */ protected void doFilter(ContainerRequestType request, ContainerResponseType response, Servlet servlet) throws IOException, ServletException { FilterChain chain = getFilterChain(request, servlet); - log.debug("FilterChainHolder.doFilter {}", chain); chain.doFilter(request, response); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 88909ef7..a3c9c62b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -14,10 +14,12 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; @@ -43,9 +45,11 @@ import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.security.Principal; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -82,15 +86,16 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; - //------------------------------------------------------------- // Constructors //------------------------------------------------------------- + public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext) { this(awsProxyRequest, lambdaContext, awsSecurityContext, ContainerConfig.defaultConfig()); } + public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext, ContainerConfig config) { super(lambdaContext); this.request = awsProxyRequest; @@ -101,15 +106,16 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.multipartFormParameters = getMultipartFormParametersMap(); } + public AwsProxyRequest getAwsProxyRequest() { return this.request; } - //------------------------------------------------------------- // Implementation - HttpServletRequest //------------------------------------------------------------- + @Override public String getAuthType() { return securityContext.getAuthenticationScheme(); @@ -239,6 +245,7 @@ public Principal getUserPrincipal() { return securityContext.getUserPrincipal(); } + @Override public String getRequestURI() { return cleanUri(getContextPath()) + cleanUri(request.getPath()); @@ -262,6 +269,7 @@ public String getServletPath() { return ""; } + @Override public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { @@ -275,6 +283,7 @@ public void login(String s, String s1) throw new UnsupportedOperationException(); } + @Override public void logout() throws ServletException { @@ -302,11 +311,11 @@ public T upgrade(Class aClass) return null; } - //------------------------------------------------------------- // Implementation - ServletRequest //------------------------------------------------------------- + @Override public String getCharacterEncoding() { // we only look at content-type because content-encoding should only be used for @@ -335,7 +344,8 @@ public String getCharacterEncoding() { @Override - public void setCharacterEncoding(String s) throws UnsupportedEncodingException { + public void setCharacterEncoding(String s) + throws UnsupportedEncodingException { String currentContentType = request.getHeaders().get(HttpHeaders.CONTENT_TYPE); if (currentContentType == null) { request.getHeaders().put( @@ -364,6 +374,7 @@ public void setCharacterEncoding(String s) throws UnsupportedEncodingException { } } + @Override public int getContentLength() { String headerValue = getHeaderCaseInsensitive(HttpHeaders.CONTENT_LENGTH); @@ -391,51 +402,19 @@ public String getContentType() { @Override - public ServletInputStream getInputStream() throws IOException { + public ServletInputStream getInputStream() + throws IOException { if (request.getBody() == null) { return null; } - byte[] bodyBytes = request.getBody().getBytes(); + byte[] bodyBytes = null; if (request.isBase64Encoded()) { bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); + } else { + bodyBytes = request.getBody().getBytes(StandardCharsets.UTF_8); } ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); - return new ServletInputStream() { - - private ReadListener listener; - - @Override - public boolean isFinished() { - return true; - } - - - @Override - public boolean isReady() { - return true; - } - - - @Override - public void setReadListener(ReadListener readListener) { - listener = readListener; - try { - listener.onDataAvailable(); - } catch (IOException e) { - log.error("Data not available on input stream", e); - } - } - - - @Override - public int read() throws IOException { - int readByte = requestBodyStream.read(); - if (requestBodyStream.available() == 0 && listener != null) { - listener.onAllDataRead(); - } - return readByte; - } - }; + return new AwsServletInputStream(requestBodyStream); } @@ -480,7 +459,7 @@ public String[] getParameterValues(String s) { } if (values.size() == 0) { - return null; + return new String[0]; } else { String[] valuesArray = new String[values.size()]; valuesArray = values.toArray(valuesArray); @@ -535,6 +514,7 @@ public String getScheme() { return headerValue; } + @Override public String getServerName() { String name = getHeaderCaseInsensitive(HttpHeaders.HOST); @@ -545,6 +525,7 @@ public String getServerName() { return name; } + @Override public BufferedReader getReader() throws IOException { @@ -563,6 +544,7 @@ public String getRemoteHost() { return getHeaderCaseInsensitive(HttpHeaders.HOST); } + @Override public Locale getLocale() { List> values = this.parseHeaderValue( @@ -604,6 +586,7 @@ public RequestDispatcher getRequestDispatcher(String s) { return getServletContext().getRequestDispatcher(s); } + @Override @Deprecated public String getRealPath(String s) { @@ -611,19 +594,23 @@ public String getRealPath(String s) { return null; } + @Override public int getRemotePort() { return 0; } + @Override - public AsyncContext startAsync() throws IllegalStateException { + public AsyncContext startAsync() + throws IllegalStateException { return null; } @Override - public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { return null; } @@ -631,12 +618,13 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se // Methods - Private //------------------------------------------------------------- + private String getHeaderCaseInsensitive(String key) { if (request.getHeaders() == null) { return null; } for (String requestHeaderKey : request.getHeaders().keySet()) { - if (key.toLowerCase().equals(requestHeaderKey.toLowerCase())) { + if (key.toLowerCase(Locale.ENGLISH).equals(requestHeaderKey.toLowerCase(Locale.ENGLISH))) { return request.getHeaders().get(requestHeaderKey); } } @@ -650,7 +638,7 @@ private String getQueryStringParameterCaseInsensitive(String key) { } for (String requestParamKey : request.getQueryStringParameters().keySet()) { - if (key.toLowerCase().equals(requestParamKey.toLowerCase())) { + if (key.toLowerCase(Locale.ENGLISH).equals(requestParamKey.toLowerCase(Locale.ENGLISH))) { return request.getQueryStringParameters().get(requestParamKey); } } @@ -665,11 +653,12 @@ private String[] getFormBodyParameterCaseInsensitive(String key) { valuesArray = values.toArray(valuesArray); return valuesArray; } else { - return null; + return new String[0]; } } + @SuppressFBWarnings("FILE_UPLOAD_FILENAME") private Map getMultipartFormParametersMap() { if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type return new HashMap<>(); @@ -681,8 +670,9 @@ private Map getMultipartFormParametersMap() { try { List items = upload.parseRequest(this); for (FileItem item : items) { + String fileName = SecurityUtils.getValidFilePath(item.getName(), true); AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(item.getName()); + newPart.setName(fileName); newPart.setSubmittedFileName(item.getFieldName()); newPart.setContentType(item.getContentType()); newPart.setSize(item.getSize()); @@ -704,6 +694,7 @@ private Map getMultipartFormParametersMap() { return output; } + private String cleanUri(String uri) { String finalUri = uri; @@ -726,7 +717,7 @@ private Map> getFormUrlEncodedParametersMap() { if (contentType == null) { return new HashMap<>(); } - if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase().equals("post")) { + if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase(Locale.ENGLISH).equals("post")) { return new HashMap<>(); } @@ -749,6 +740,7 @@ private Map> getFormUrlEncodedParametersMap() { return output; } + public static String decodeValueIfEncoded(String value) { if (value == null) { return null; @@ -761,4 +753,50 @@ public static String decodeValueIfEncoded(String value) { return value; } } + + + public static class AwsServletInputStream extends ServletInputStream { + + private InputStream bodyStream; + private ReadListener listener; + + public AwsServletInputStream(InputStream body) { + bodyStream = body; + } + + + @Override + public boolean isFinished() { + return true; + } + + + @Override + public boolean isReady() { + return true; + } + + + @Override + public void setReadListener(ReadListener readListener) { + listener = readListener; + try { + listener.onDataAvailable(); + } catch (IOException e) { + log.error("Data not available on input stream", e); + } + } + + + @Override + public int read() + throws IOException { + int readByte = bodyStream.read(); + if (bodyStream.available() == 0 && listener != null) { + listener.onAllDataRead(); + } + return readByte; + } + + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java index 18012850..ff46314c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java @@ -12,6 +12,10 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import javax.servlet.http.Part; import javax.ws.rs.core.MultivaluedHashMap; import java.io.ByteArrayInputStream; @@ -19,6 +23,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.Collections; + public class AwsProxyRequestPart implements Part { @@ -40,7 +46,7 @@ public class AwsProxyRequestPart //------------------------------------------------------------- public AwsProxyRequestPart(byte[] content) { - this.content = content; + this.content = content.clone(); } @@ -79,9 +85,11 @@ public long getSize() { } + @SuppressFBWarnings("PATH_TRAVERSAL_OUT") @Override public void write(String s) throws IOException { - FileOutputStream fos = new FileOutputStream(s); + String canonicalFilePath = SecurityUtils.getValidFilePath(s); + FileOutputStream fos = new FileOutputStream(canonicalFilePath); try { fos.write(content); } finally { @@ -98,18 +106,27 @@ public void delete() throws IOException { @Override public String getHeader(String s) { + if (headers == null) { + return null; + } return headers.getFirst(s); } @Override public Collection getHeaders(String s) { + if (headers == null) { + return Collections.EMPTY_LIST; + } return headers.get(s); } @Override public Collection getHeaderNames() { + if (headers == null) { + return Collections.EMPTY_LIST; + } return headers.keySet(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 4385cfd3..7cc73aad 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -14,8 +14,9 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -140,18 +141,19 @@ public int getEffectiveMinorVersion() { @Override + @SuppressFBWarnings("PATH_TRAVERSAL_IN") // suppressing because we are using the getValidFilePath public String getMimeType(String s) { try { - + String validatedPath = SecurityUtils.getValidFilePath(s); if (s.startsWith("file:")) { // Support paths such as file:/D:/something/hello.txt - return Files.probeContentType(Paths.get(URI.create(s))); + return Files.probeContentType(Paths.get(URI.create(validatedPath))); } else if (s.startsWith("/")) { // Support paths such as file:/D:/something/hello.txt - return Files.probeContentType(Paths.get(URI.create("file://" + s))); + return Files.probeContentType(Paths.get(URI.create("file://" + validatedPath))); } else { - return Files.probeContentType(Paths.get(s)); + return Files.probeContentType(Paths.get(validatedPath)); } } catch (IOException e) { - log.warn("Could not find content type for file {}", s, e); + log.warn("Could not find content type for file: " + SecurityUtils.encode(s), e); return null; } } @@ -167,13 +169,13 @@ public Set getResourcePaths(String s) { @Override public URL getResource(String s) throws MalformedURLException { - return getClass().getResource(s); + return AwsServletContext.class.getResource(s); } @Override public InputStream getResourceAsStream(String s) { - return getClass().getResourceAsStream(s); + return AwsServletContext.class.getResourceAsStream(s); } @@ -212,20 +214,20 @@ public Enumeration getServletNames() { @Override public void log(String s) { - log.info(s); + log.info(SecurityUtils.encode(s)); } @Override @Deprecated public void log(Exception e, String s) { - log.error(s, e); + log.error(SecurityUtils.encode(s), e); } @Override public void log(String s, Throwable throwable) { - log.error(s, throwable); + log.error(SecurityUtils.encode(s), throwable); } @@ -237,7 +239,7 @@ public String getRealPath(String s) { try { absPath = new File(fileUrl.toURI()).getAbsolutePath(); } catch (URISyntaxException e) { - log.error("Error while looking for real path: " + s, e); + log.error("Error while looking for real path: {}", SecurityUtils.encode(s), SecurityUtils.encode(e.getMessage())); } } return absPath; @@ -373,7 +375,7 @@ public FilterRegistration.Dynamic addFilter(String name, Filter filter) { if (filters.containsKey(name)) { return null; } else { - log.debug("Adding filter '{}' from {}", name, filter); + log.debug("Adding filter '{}' from {}", SecurityUtils.encode(name), SecurityUtils.encode(filter.toString())); } FilterHolder newFilter = new FilterHolder(name, filter, this); @@ -386,7 +388,7 @@ public FilterRegistration.Dynamic addFilter(String name, Filter filter) { @Override public FilterRegistration.Dynamic addFilter(String name, Class filterClass) { try { - log.debug("Adding filter '{}' from {}", name, filterClass.getName()); + log.debug("Adding filter '{}' from {}", SecurityUtils.encode(name), SecurityUtils.encode(filterClass.getName())); Filter newFilter = createFilter(filterClass); return addFilter(name, newFilter); } catch (ServletException e) { @@ -422,9 +424,10 @@ public FilterRegistration getFilterRegistration(String s) { @Override public Map getFilterRegistrations() { Map registrations = new LinkedHashMap<>(); - for (String filter : filters.keySet()) { - registrations.put(filter, filters.get(filter).getRegistration()); + for (Map.Entry entry : filters.entrySet()) { + registrations.put(entry.getKey(), entry.getValue().getRegistration()); } + return registrations; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index af7ba7a7..3b018815 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -65,6 +66,7 @@ public class FilterChainHolder implements FilterChain { // Implementation - FilterChain //------------------------------------------------------------- + @SuppressFBWarnings("CRLF_INJECTION_LOGS") @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException { currentFilter++; @@ -78,11 +80,11 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (!holder.isFilterInitialized()) { holder.init(); } - log.debug("Starting {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), - currentFilter, holder.getFilterName(), holder.getFilter()); + log.debug("Starting {}: filter {}-{}", servletRequest.getDispatcherType(), + currentFilter, holder.getFilterName()); holder.getFilter().doFilter(servletRequest, servletResponse, this); - log.debug("Executed {} {} : filter {}-{} {}", servletRequest.getDispatcherType(), ((HttpServletRequest) servletRequest).getRequestURI(), - currentFilter, holder.getFilterName(), holder.getFilter()); + log.debug("Executed {}: filter {}-{}", servletRequest.getDispatcherType(), + currentFilter, holder.getFilterName()); } // if for some reason the response wasn't flushed yet, we force it here. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 21bdd239..bd7087fa 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -12,6 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -27,6 +29,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; /** @@ -110,8 +113,8 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl } return chainHolder; } - for (String name : registrations.keySet()) { - FilterHolder holder = registrations.get(name); + for (Map.Entry entry : registrations.entrySet()) { + FilterHolder holder = entry.getValue(); // we only check the dispatcher type if it's not empty. Otherwise we assume it's a REQUEST as per section 6.2.5 // of servlet specs if (holder.getRegistration().getDispatcherTypes().size() > 0 && !holder.getRegistration().getDispatcherTypes().contains(type)) { @@ -198,7 +201,7 @@ private void putFilterChainCache(final DispatcherType type, final String targetP */ boolean pathMatches(final String target, final String mapping) { // easiest case, they are exactly the same - if (target.toLowerCase().equals(mapping.toLowerCase())) { + if (target.toLowerCase(Locale.ENGLISH).equals(mapping.toLowerCase(Locale.ENGLISH))) { return true; } @@ -300,7 +303,14 @@ public int hashCode() { @Override public boolean equals(Object key) { - return key.getClass().isAssignableFrom(TargetCacheKey.class) && hashCode() == key.hashCode(); + if (key == null) { + return false; + } + if (key.getClass().equals(this.getClass())) { + return this.hashCode() == key.hashCode(); + } + + return false; } @@ -318,6 +328,7 @@ void setDispatcherType(DispatcherType dispatcherType) { } } + @SuppressFBWarnings("URF_UNREAD_FIELD") private class ServletExecutionFilter implements Filter { private FilterConfig config; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index a8446b14..60978969 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -12,6 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; @@ -213,6 +215,7 @@ private WebFilter getAnnotation() { * Registration class for the filter. This object stores the servlet names and the url patterns the filter is * associated with. */ + @SuppressFBWarnings("URF_UNREAD_FIELD") protected class Registration implements FilterRegistration.Dynamic { //------------------------------------------------------------- @@ -350,11 +353,11 @@ public String getInitParameter(String s) { @Override public Set setInitParameters(Map map) { Set conflicts = new LinkedHashSet<>(); - for (String newParamKey : map.keySet()) { - if (initParameters.get(newParamKey) != null) { - conflicts.add(newParamKey); + for (Map.Entry entry : map.entrySet()) { + if (initParameters.get(entry.getKey()) != null) { + conflicts.add(entry.getKey()); } else { - initParameters.put(newParamKey, map.get(newParamKey)); + initParameters.put(entry.getKey(), entry.getValue()); } } return conflicts; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index f9523158..e4e38914 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -20,6 +20,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; import java.util.regex.Pattern; /** @@ -34,7 +36,7 @@ public class UrlPathValidator implements Filter { //------------------------------------------------------------- public static final int DEFAULT_ERROR_CODE = 404; - public static final Pattern PATH_PATTERN = Pattern.compile("^(/[-\\w:@&?=+,.!/~*'%$_;]*)?$"); + //public static final Pattern PATH_PATTERN = Pattern.compile("^(/[-\\w:@&?=+,.!/~*'%$_;]*)?$"); public static final String PARAM_INVALID_STATUS_CODE = "invalid_status_code"; @@ -67,20 +69,29 @@ public void init(FilterConfig filterConfig) throws ServletException { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - // the getServletPath method of the AwsProxyHttpServletRequest returns the request path - String path = ((HttpServletRequest)servletRequest).getServletPath(); + // the getPathInfo method of the AwsProxyHttpServletRequest returns the request path with the correct base path stripped + String path = ((HttpServletRequest)servletRequest).getPathInfo(); if (path == null) { setErrorResponse(servletResponse); return; } - if (!PATH_PATTERN.matcher(path).matches()) { + // switching to this mechanism to avoid ReDOS attacks on the path pattern regex + try { + URI uriPath = new URI(path); + } catch (URISyntaxException e) { + log.error("Invalid uri path in doFilter", e); setErrorResponse(servletResponse); return; } + //if (!PATH_PATTERN.matcher(path).matches()) { + // setErrorResponse(servletResponse); + // return; + //} // Logic taken from the Apache UrlValidator. I opted not to include Apache lib as a dependency to save space // in the final Lambda function package + // https://github.com/apache/commons-validator/blob/trunk/src/main/java/org/apache/commons/validator/UrlValidator.java int slashCount = countStrings("/", path); int dot2Count = countStrings("..", path); int slash2Count = countStrings("//", path); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 54bd0ebe..b9c839f1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; import javax.ws.rs.core.HttpHeaders; @@ -241,6 +242,7 @@ public AwsProxyRequestBuilder fromJsonString(String jsonContent) return this; } + @SuppressFBWarnings("PATH_TRAVERSAL_IN") public AwsProxyRequestBuilder fromJsonPath(String filePath) throws IOException { request = LambdaContainerHandler.getObjectMapper().readValue(new File(filePath), AwsProxyRequest.class); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 668f25e0..04344d3d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -3,12 +3,16 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import java.util.ArrayList; +import java.util.List; + /** * Configuration parameters for the framework */ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; + private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); @@ -16,6 +20,7 @@ public static ContainerConfig defaultConfig() { configuration.setUriEncoding(DEFAULT_URI_ENCODING); configuration.setConsolidateSetCookieHeaders(true); configuration.setUseStageAsServletContext(false); + configuration.setValidFilePaths(DEFAULT_FILE_PATHS); return configuration; } @@ -29,6 +34,11 @@ public static ContainerConfig defaultConfig() { private String uriEncoding; private boolean consolidateSetCookieHeaders; private boolean useStageAsServletContext; + private List validFilePaths; + + public ContainerConfig() { + validFilePaths = new ArrayList<>(); + } //------------------------------------------------------------- @@ -131,4 +141,31 @@ public boolean isUseStageAsServletContext() { public void setUseStageAsServletContext(boolean useStageAsServletContext) { this.useStageAsServletContext = useStageAsServletContext; } + + + /** + * Returns the list of file paths that the servlet accepts read/write requests to + * @return A List of file paths. By default this is set to /tmp and /var/task + */ + public List getValidFilePaths() { + return validFilePaths; + } + + + /** + * Sets a list of valid file paths for the servlet to read/write from. + * @param validFilePaths A populated list of base paths + */ + public void setValidFilePaths(List validFilePaths) { + this.validFilePaths = validFilePaths; + } + + + /** + * Adds a new base path to the list of allowed paths. + * @param filePath The base path + */ + public void addValidFilePath(String filePath) { + validFilePaths.add(filePath); + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index da9f1168..5f4f2857 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -19,15 +19,15 @@ public class AwsProxySecurityContextTest { @Test public void localVars_constructor_nullValues() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, null); - assertNull(context.event); - assertNull(context.lambdaContext); + assertNull(context.getEvent()); + assertNull(context.getLambdaContext()); } @Test public void localVars_constructor_ValidRequest() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_NO_AUTH); - assertEquals(REQUEST_NO_AUTH, context.event); - assertNull(context.lambdaContext); + assertEquals(REQUEST_NO_AUTH, context.getEvent()); + assertNull(context.getLambdaContext()); } @Test diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9bd904e8..920c8d40 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -70,4 +70,78 @@ + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + ${project.build.directory}/findbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + + + + diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index db455ad2..1f765535 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -4,6 +4,7 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.glassfish.jersey.internal.MapPropertiesDelegate; import org.glassfish.jersey.internal.PropertiesDelegate; import org.glassfish.jersey.server.ApplicationHandler; @@ -30,6 +31,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Enumeration; +import java.util.Locale; import java.util.concurrent.CountDownLatch; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; @@ -88,6 +90,9 @@ public void destroy() { jersey.onShutdown(this); } + // suppressing warnings because I expect headers and query strings to be checked by the underlying + // servlet implementation + @SuppressFBWarnings({ "SERVLET_HEADER", "SERVLET_QUERY_STRING" }) private ContainerRequest servletRequestToContainerRequest(ServletRequest request) { URI basePathUri; URI requestPathUri; @@ -119,7 +124,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request ContainerRequest requestContext = new ContainerRequest( basePathUri, requestPathUri, - servletRequest.getMethod().toUpperCase(), + servletRequest.getMethod().toUpperCase(Locale.ENGLISH), (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), apiGatewayProperties); diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java index 93ecc900..af042d44 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java @@ -13,6 +13,9 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.glassfish.jersey.server.ContainerException; import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.spi.ContainerResponseWriter; @@ -72,6 +75,7 @@ public JerseyServletResponseWriter(ServletResponse resp, CountDownLatch latch) { * @return An OutputStream for Jersey to write the response body to * @throws ContainerException default Jersey declaration */ + @SuppressFBWarnings("HTTP_RESPONSE_SPLITTING") // suppress this because headers are sanitized in the setHeader method of the servlet response public OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerResponse containerResponse) throws ContainerException { servletResponse.setStatus(containerResponse.getStatusInfo().getStatusCode()); diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java index e0f93f17..126e72e8 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java @@ -18,6 +18,7 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.core.Context; import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; @@ -47,14 +48,12 @@ public class AwsProxyServletContextFactory implements Factory { @Override public ServletContext provide() { HttpServletRequest req = (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); + if (req == null) { - System.out.println("req is null"); + throw new InternalServerErrorException("Could not find servlet request in context"); } - System.out.println(req.getPathInfo()); + ServletContext ctx = req.getServletContext(); - if (ctx == null) { - System.out.println("ServletContext is null"); - } return ctx; } diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9fae1699..bc1a1adf 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -41,6 +41,36 @@ + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + @@ -52,6 +82,45 @@ always + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + ${project.build.directory}/findbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 590633af..aa00bff1 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.spark; + import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; @@ -40,18 +41,23 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; import java.util.EnumSet; import java.util.concurrent.CountDownLatch; + /** * Implementation of the LambdaContainerHandler object that supports the Spark framework: http://sparkjava.com/ - * + *

* Because of the way this container is implemented, using reflection to change accessibility of methods in the Spark * framework and inserting itself as the default embedded container, it is important that you initialize the Handler * before declaring your spark routes. - * + *

* This implementation uses the default AwsProxyHttpServletRequest and Response implementations. - * + *

*

  * {@code
  *     // always initialize the handler first
@@ -64,10 +70,12 @@
  *     });
  * }
  * 
+ * * @param The request object used by the RequestReader implementation passed to the constructor * @param The response object produced by the ResponseWriter implementation in the constructor */ -public class SparkLambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class SparkLambdaContainerHandler + extends AwsLambdaServletContainerHandler { //------------------------------------------------------------- // Constants @@ -75,26 +83,27 @@ public class SparkLambdaContainerHandler extends AwsL private static final String LAMBDA_EMBEDDED_SERVER_CODE = "AWS_LAMBDA"; - //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- private LambdaEmbeddedServer embeddedServer; + private LambdaEmbeddedServerFactory lambdaServerFactory; private Logger log = LoggerFactory.getLogger(SparkLambdaContainerHandler.class); - //------------------------------------------------------------- // Methods - Public - Static //------------------------------------------------------------- + /** * Returns a new instance of an SparkLambdaContainerHandler initialized to work with AwsProxyRequest * and AwsProxyResponse objects. * * @return a new instance of SparkLambdaContainerHandler + * * @throws ContainerInitializationException Throws this exception if we fail to initialize the Spark container. - * This could be caused by the introspection used to insert the library as the default embedded container + * This could be caused by the introspection used to insert the library as the default embedded container */ public static SparkLambdaContainerHandler getAwsProxyHandler() throws ContainerInitializationException { @@ -105,51 +114,56 @@ public static SparkLambdaContainerHandler get new LambdaEmbeddedServerFactory()); } - //------------------------------------------------------------- // Constructors //------------------------------------------------------------- + public SparkLambdaContainerHandler(RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, - EmbeddedServerFactory embeddedServerFactory) + LambdaEmbeddedServerFactory embeddedServerFactory) throws ContainerInitializationException { super(requestReader, responseWriter, securityContextWriter, exceptionHandler); EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, embeddedServerFactory); + this.lambdaServerFactory = embeddedServerFactory; // TODO: This is pretty bad but we are not given access to the embeddedServerIdentifier property of the // Service object try { - log.debug("Changing visibility of getInstance method and embeddedServerIdentifier properties"); - Method serviceInstanceMethod = Spark.class.getDeclaredMethod("getInstance"); - serviceInstanceMethod.setAccessible(true); - Service sparkService = (Service) serviceInstanceMethod.invoke(null); - Field serverIdentifierField = Service.class.getDeclaredField("embeddedServerIdentifier"); - serverIdentifierField.setAccessible(true); - serverIdentifierField.set(sparkService, LAMBDA_EMBEDDED_SERVER_CODE); - } catch (NoSuchFieldException e) { - log.error("Could not fine embeddedServerIdentifier field in Service class", e); - throw new ContainerInitializationException("Cannot find embeddedServerIdentifier field in Service class", e); - } catch (NoSuchMethodException e) { - log.error("Could not find getInstance method in Spark class", e); - throw new ContainerInitializationException("Cannot find getInstance method in Spark class", e); - } catch (IllegalAccessException e) { - log.error("Could not access getInstance method in Spark class", e); - throw new ContainerInitializationException("Cannot access getInstance method in Spark class", e); - } catch (InvocationTargetException e) { - log.error("Could not invoke getInstance method in Spark class", e); - throw new ContainerInitializationException("Cannot invoke getInstance method in Spark class", e); + AccessController.doPrivileged((PrivilegedExceptionAction) () -> { + log.debug("Changing visibility of getInstance method and embeddedServerIdentifier properties"); + Method serviceInstanceMethod = Spark.class.getDeclaredMethod("getInstance"); + serviceInstanceMethod.setAccessible(true); + Service sparkService = (Service) serviceInstanceMethod.invoke(null); + Field serverIdentifierField = Service.class.getDeclaredField("embeddedServerIdentifier"); + serverIdentifierField.setAccessible(true); + serverIdentifierField.set(sparkService, LAMBDA_EMBEDDED_SERVER_CODE); + return null; + }); + } catch (PrivilegedActionException e) { + if (e.getException() instanceof NoSuchFieldException) { + log.error("Could not fine embeddedServerIdentifier field in Service class", e.getException()); + } else if (e.getException() instanceof NoSuchMethodException) { + log.error("Could not find getInstance method in Spark class", e.getException()); + } else if (e.getException() instanceof IllegalAccessException) { + log.error("Could not access getInstance method in Spark class", e.getException()); + } else if (e.getException() instanceof InvocationTargetException) { + log.error("Could not invoke getInstance method in Spark class", e.getException()); + } else { + log.error("Unknown exception while modifying Spark class", e.getException()); + } + throw new ContainerInitializationException("Could not initialize Spark server", e.getException()); } } - //------------------------------------------------------------- // Methods - Implementation //------------------------------------------------------------- + @Override protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); @@ -173,7 +187,7 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH // condition and solve GitHub issue #71. Spark.awaitInitialization(); - embeddedServer = LambdaEmbeddedServerFactory.getServerInstance(); + embeddedServer = lambdaServerFactory.getServerInstance(); // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index 3bf02a71..c2545be8 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -1,5 +1,6 @@ package com.amazonaws.serverless.proxy.spark.embeddedserver; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import spark.embeddedserver.EmbeddedServer; import spark.embeddedserver.EmbeddedServerFactory; import spark.route.Routes; @@ -11,7 +12,7 @@ public class LambdaEmbeddedServerFactory implements EmbeddedServerFactory { // Variables - Private - Static //------------------------------------------------------------- - private static LambdaEmbeddedServer embeddedServer; + private static volatile LambdaEmbeddedServer embeddedServer; /** @@ -24,8 +25,9 @@ public LambdaEmbeddedServerFactory() {} * Constructor used in unit tests to inject a mocked embedded server * @param server The mocked server */ + @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") // suppressing the warining as this constructor is only used for unit tests public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { - embeddedServer = server; + LambdaEmbeddedServerFactory.embeddedServer = server; } @@ -37,7 +39,7 @@ public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { @Override public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFilesConfiguration, boolean multipleHandlers) { if (embeddedServer == null) { - embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, multipleHandlers); + LambdaEmbeddedServerFactory.embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, multipleHandlers); } return embeddedServer; @@ -48,7 +50,7 @@ public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFiles // Methods - Getter/Setter //------------------------------------------------------------- - public static LambdaEmbeddedServer getServerInstance() { + public LambdaEmbeddedServer getServerInstance() { return embeddedServer; } } diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1b31f4b5..b12554d3 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -79,6 +79,36 @@ + + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + @@ -90,6 +120,45 @@ always + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.5 + + + Max + + Low + + true + + ${project.build.directory}/findbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index e4414753..47d1d9a6 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.spring; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEvent; @@ -43,25 +44,34 @@ * `currentResponse` private property to the value of the new `HttpServletResponse` object. This is used to intercept * Spring notifications for the `ServletRequestHandledEvent` and call the flush method to release the latch. */ +@SuppressFBWarnings("MTIA_SUSPECT_SERVLET_INSTANCE_FIELD") // we assume we are running in a "single threaded" environment - AWS Lambda public class LambdaSpringApplicationInitializer extends HttpServlet implements WebApplicationInitializer { public static final String ERROR_NO_CONTEXT = "No application context or configuration classes provided"; private static final String DEFAULT_SERVLET_NAME = "aws-servless-java-container"; + private static final long serialVersionUID = 42L; + + // all of these variables are declared as volatile for correctness, technically this class is an implementation of + // HttpServlet and could live in a multi-threaded environment. Because the library runs inside AWS Lambda, we can + // assume we will be in a single-threaded environment. + // Configuration variables that can be passed in - private ConfigurableWebApplicationContext applicationContext; - private boolean refreshContext = true; - private List contextListeners; - private List springProfiles; + @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") + private transient volatile ConfigurableWebApplicationContext applicationContext; + private volatile boolean refreshContext = true; + @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") + private transient volatile List contextListeners; + private volatile ArrayList springProfiles; // Dynamically instantiated properties - private ServletConfig dispatcherConfig; - private DispatcherServlet dispatcherServlet; + private volatile DispatcherServlet dispatcherServlet; // The current response is used to release the latch when Spring emits the request handled event - private HttpServletResponse currentResponse; + private transient volatile HttpServletResponse currentResponse; - private Logger log = LoggerFactory.getLogger(LambdaSpringApplicationInitializer.class); + @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") + private transient Logger log = LoggerFactory.getLogger(LambdaSpringApplicationInitializer.class); /** * Creates a new instance of the WebApplicationInitializer @@ -99,7 +109,6 @@ public void dispatch(HttpServletRequest request, HttpServletResponse response) dispatcherServlet.service(request, response); } - /** * Gets the initialized Spring dispatcher servlet instance. * @return The Spring dispatcher servlet @@ -123,7 +132,8 @@ public void onStartup(ServletContext servletContext) throws ServletException { } applicationContext.setServletContext(servletContext); - dispatcherConfig = new DefaultDispatcherConfig(servletContext); + + DefaultDispatcherConfig dispatcherConfig = new DefaultDispatcherConfig(servletContext); applicationContext.setServletConfig(dispatcherConfig); // Configure the listener for the request handled events. All we do here is release the latch @@ -170,6 +180,13 @@ private void notifyStartListeners(ServletContext context) { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + if (!(req instanceof HttpServletRequest)) { + throw new ServletException("Cannot service request that is not instance of HttpServletRequest"); + } + + if (!(res instanceof HttpServletResponse)) { + throw new ServletException("Cannot work with response that is not instance of HttpServletResponse"); + } dispatch((HttpServletRequest)req, (HttpServletResponse)res); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index 8299402e..08a496dd 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; @@ -22,6 +23,8 @@ public class StaticAppProxyTest { @Test public void staticPage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/sample/page", "GET").build(); + // we temporarily allow the container to read from any path + LambdaContainerHandler.getContainerConfig().addValidFilePath("/"); AwsProxyResponse resp = lambdaHandler.handleRequest(req, new MockLambdaContext()); assertEquals(200, resp.getStatusCode()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java index d4dffc37..eae65a09 100755 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/staticapp/MyController.java @@ -8,7 +8,6 @@ @EnableWebMvc @Controller public class MyController { - @RequestMapping({ "/sample/page" }) public String showPage() { return "sample"; diff --git a/pom.xml b/pom.xml index 46858067..d0456781 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,14 @@ 1.10.19 test + + + + com.google.code.findbugs + annotations + 3.0.1 + provided + From 22ef1d60aaf9d4de8e654f8fe2eb841d996e1a89 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 16 Jan 2018 09:35:11 -0800 Subject: [PATCH 0078/1214] Performance improvements in Jersey by initializing the ApplicationHandler in the filter constructor (absorbed by Lambda) and not in the filter init method --- .../proxy/internal/testutils/Timer.java | 63 +++++++++++++++++++ .../proxy/jersey/JerseyHandlerFilter.java | 13 ++-- .../jersey/JerseyLambdaContainerHandler.java | 9 ++- 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java new file mode 100644 index 00000000..5ad703d6 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.proxy.internal.testutils; + + +import java.util.LinkedHashMap; +import java.util.Map; + + +public final class Timer { + private volatile static Map timers = new LinkedHashMap<>(); + + public static void start(String timerName) { + timers.put(timerName, new TimerInfo(System.currentTimeMillis())); + } + + public static long stop(String timerName) { + TimerInfo info = timers.get(timerName); + if (info == null) { + throw new IllegalArgumentException("Could not find timer " + timerName); + } + + long stopTime = System.currentTimeMillis(); + info.stop(stopTime); + + return stopTime; + } + + + public static Map getTimers() { + return timers; + } + + public static TimerInfo getTimer(String timerName) { + return timers.get(timerName); + } + + private static class TimerInfo { + private long startTime; + private long stopTime; + private long duration; + + public TimerInfo(long start) { + startTime = start; + } + + public void stop(long stop) { + stopTime = stop; + duration = stopTime - startTime; + } + + public long getStartTime() { + return startTime; + } + + public long getStopTime() { + return stopTime; + } + + + public long getDuration() { + return duration; + } + } +} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 1f765535..3c55d4e6 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -1,8 +1,8 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.glassfish.jersey.internal.MapPropertiesDelegate; @@ -49,22 +49,25 @@ public class JerseyHandlerFilter implements Filter, Container { private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class); public JerseyHandlerFilter(Application jaxApplication) { + Timer.start("JERSEY_FILTER_INIT"); app = jaxApplication; + + jersey = new ApplicationHandler(app); + jersey.onStartup(this); + Timer.stop("JERSEY_FILTER_INIT"); } @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("Initialize Jersey application handler"); - jersey = new ApplicationHandler(app); - jersey.onStartup(this); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - log.debug("Called Jersey filter"); + Timer.start("JERSEY_FILTER_DOFILTER"); // we use a latch to make the processing inside Jersey synchronous CountDownLatch jerseyLatch = new CountDownLatch(1); @@ -80,7 +83,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo log.error("Interrupted while processing request", e); throw new InternalServerErrorException(e); } - + Timer.stop("JERSEY_FILTER_DOFILTER"); filterChain.doFilter(servletRequest, servletResponse); } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 2eaaeec9..e080d4b5 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -25,6 +25,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -120,11 +121,13 @@ public JerseyLambdaContainerHandler(RequestReader securityContextWriter, ExceptionHandler exceptionHandler, Application jaxRsApplication) { - super(requestReader, responseWriter, securityContextWriter, exceptionHandler); + super(requestReader, responseWriter, securityContextWriter, exceptionHandler); + Timer.start("JERSEY_START_TIMER"); this.jaxRsApplication = jaxRsApplication; this.initialized = false; this.jerseyFilter = new JerseyHandlerFilter(this.jaxRsApplication); + Timer.stop("JERSEY_START_TIMER"); } //------------------------------------------------------------- @@ -140,10 +143,12 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { + Timer.start("JERSEY_HANDLE_REQUEST"); // this method of the AwsLambdaServletContainerHandler sets the request context super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); if (!initialized) { + Timer.start("JERSEY_INITIALIZATION"); // call the onStartup event if set to give developers a chance to set filters in the context if (startupHandler != null) { startupHandler.onStartup(getServletContext()); @@ -154,10 +159,12 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH jerseyFilterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); initialized = true; + Timer.stop("JERSEY_INITIALIZATION"); } httpServletRequest.setServletContext(getServletContext()); doFilter(httpServletRequest, httpServletResponse, null); + Timer.stop("JERSEY_HANDLE_REQUEST"); } } From 0179bd1edec600ece4227c9473b8a2f1b57d0c75 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 16 Jan 2018 10:55:03 -0800 Subject: [PATCH 0079/1214] Added variable to disable timer. Added timer call to all important actions. Added Timer enabled to all samples. Removed POJO handler from samples since we recommend the stream handler --- .../servlet/AwsProxyHttpServletRequest.java | 9 ++-- .../AwsProxyHttpServletResponseWriter.java | 4 +- .../proxy/internal/testutils/Timer.java | 17 +++++++ .../proxy/jersey/JerseyHandlerFilter.java | 18 +++++--- .../jersey/JerseyLambdaContainerHandler.java | 8 ++-- .../jersey/JerseyServletResponseWriter.java | 5 ++ .../spark/SparkLambdaContainerHandler.java | 11 +++-- .../embeddedserver/LambdaEmbeddedServer.java | 23 ++++------ .../LambdaEmbeddedServerFactory.java | 5 +- .../LambdaSpringApplicationInitializer.java | 8 ++++ .../SpringBootLambdaContainerHandler.java | 7 +++ .../spring/SpringLambdaContainerHandler.java | 7 +++ .../sample/jersey/LambdaHandler.java | 34 -------------- .../sample/jersey/StreamLambdaHandler.java | 9 ++++ .../sample/spark/LambdaHandler.java | 46 ------------------- .../sample/spark/StreamLambdaHandler.java | 9 ++++ .../sample/spring/LambdaHandler.java | 41 ----------------- .../sample/spring/StreamLambdaHandler.java | 9 ++++ .../sample/springboot/LambdaHandler.java | 46 ------------------- .../springboot/StreamLambdaHandler.java | 9 ++++ 20 files changed, 125 insertions(+), 200 deletions(-) delete mode 100644 samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/LambdaHandler.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java delete mode 100644 samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index a3c9c62b..a964a1b4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -15,6 +15,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; @@ -663,7 +664,7 @@ private Map getMultipartFormParametersMap() { if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type return new HashMap<>(); } - + Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); Map output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); @@ -689,8 +690,10 @@ private Map getMultipartFormParametersMap() { output.put(item.getFieldName(), newPart); } } catch (FileUploadException e) { + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); log.error("Could not read multipart upload file", e); } + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); return output; } @@ -720,7 +723,7 @@ private Map> getFormUrlEncodedParametersMap() { if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase(Locale.ENGLISH).equals("post")) { return new HashMap<>(); } - + Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS"); String rawBodyContent = request.getBody(); Map> output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); @@ -736,7 +739,7 @@ private Map> getFormUrlEncodedParametersMap() { values.add(decodeValueIfEncoded(parameterKeyValue[1])); output.put(decodeValueIfEncoded(parameterKeyValue[0]), values); } - + Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS"); return output; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index d03c4018..cb0dd73c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -15,6 +15,7 @@ import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; @@ -33,6 +34,7 @@ public class AwsProxyHttpServletResponseWriter extends ResponseWriter timers = new LinkedHashMap<>(); + private volatile static boolean enabled = false; public static void start(String timerName) { + if (!enabled) { + return; + } + timers.put(timerName, new TimerInfo(System.currentTimeMillis())); } public static long stop(String timerName) { + if (!enabled) { + return 0L; + } + TimerInfo info = timers.get(timerName); if (info == null) { throw new IllegalArgumentException("Could not find timer " + timerName); @@ -33,6 +42,14 @@ public static TimerInfo getTimer(String timerName) { return timers.get(timerName); } + public static void enable() { + enabled = true; + } + + public static void disable() { + enabled = false; + } + private static class TimerInfo { private long startTime; private long stopTime; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 3c55d4e6..e36a044f 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -48,18 +48,17 @@ public class JerseyHandlerFilter implements Filter, Container { private Application app; private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class); - public JerseyHandlerFilter(Application jaxApplication) { - Timer.start("JERSEY_FILTER_INIT"); + JerseyHandlerFilter(Application jaxApplication) { + Timer.start("JERSEY_FILTER_CONSTRUCTOR"); app = jaxApplication; jersey = new ApplicationHandler(app); jersey.onStartup(this); - Timer.stop("JERSEY_FILTER_INIT"); + Timer.stop("JERSEY_FILTER_CONSTRUCTOR"); } @Override - public void init(FilterConfig filterConfig) - throws ServletException { + public void init(FilterConfig filterConfig) { log.info("Initialize Jersey application handler"); } @@ -97,6 +96,7 @@ public void destroy() { // servlet implementation @SuppressFBWarnings({ "SERVLET_HEADER", "SERVLET_QUERY_STRING" }) private ContainerRequest servletRequestToContainerRequest(ServletRequest request) { + Timer.start("JERSEY_SERVLET_REQUEST_TO_CONTAINER"); URI basePathUri; URI requestPathUri; String basePath = "/"; @@ -131,7 +131,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), apiGatewayProperties); - InputStream requestInputStream = null; + InputStream requestInputStream; try { requestInputStream = servletRequest.getInputStream(); if (requestInputStream != null) { @@ -147,7 +147,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request String headerKey = headerNames.nextElement(); requestContext.header(headerKey, servletRequest.getHeader(headerKey)); } - + Timer.stop("JERSEY_SERVLET_REQUEST_TO_CONTAINER"); return requestContext; } @@ -175,12 +175,14 @@ public ApplicationHandler getApplicationHandler() { */ @Override public void reload() { + Timer.start("JERSEY_RELOAD_DEFAULT"); jersey.onShutdown(this); jersey = new ApplicationHandler(app); jersey.onReload(this); jersey.onStartup(this); + Timer.stop("JERSEY_RELOAD_DEFAULT"); } @@ -191,6 +193,7 @@ public void reload() { */ @Override public void reload(ResourceConfig resourceConfig) { + Timer.start("JERSEY_RELOAD_CONFIG"); jersey.onShutdown(this); app = resourceConfig; @@ -198,5 +201,6 @@ public void reload(ResourceConfig resourceConfig) { jersey.onReload(this); jersey.onStartup(this); + Timer.stop("JERSEY_RELOAD_CONFIG"); } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index e080d4b5..ec34f7d0 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -123,11 +123,11 @@ public JerseyLambdaContainerHandler(RequestReader> e : containerResponse.getStringHeaders().entrySet()) { for (final String value : e.getValue()) { @@ -85,11 +87,14 @@ public OutputStream writeResponseStatusAndHeaders(long contentLength, ContainerR } } try { + Timer.stop("JERSEY_WRITE_RESPONSE"); return servletResponse.getOutputStream(); } catch (IOException e) { log.error("Could not get servlet response output stream", e); + Timer.stop("JERSEY_WRITE_RESPONSE"); throw new InternalServerErrorException("Could not get servlet response output stream", e); } + } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index aa00bff1..300dc57e 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -20,6 +20,7 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; @@ -32,7 +33,6 @@ import org.slf4j.LoggerFactory; import spark.Service; import spark.Spark; -import spark.embeddedserver.EmbeddedServerFactory; import spark.embeddedserver.EmbeddedServers; import javax.servlet.DispatcherType; @@ -42,7 +42,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.AccessController; -import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.EnumSet; @@ -126,6 +125,7 @@ public SparkLambdaContainerHandler(RequestReader webSocketHa @Override - public void join() - throws InterruptedException { + public void join() { log.info("Called join method, nothing to do here since Lambda only runs a single event per container"); } @@ -93,12 +94,6 @@ public int activeThreadCount() { // Methods - Public //------------------------------------------------------------- - public void handle(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - sparkFilter.doFilter(request, response, null); - } - - /** * Returns the initialized instance of the main Spark filter. * @return The spark filter instance. diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index c2545be8..255e442a 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -1,5 +1,7 @@ package com.amazonaws.serverless.proxy.spark.embeddedserver; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; + import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import spark.embeddedserver.EmbeddedServer; import spark.embeddedserver.EmbeddedServerFactory; @@ -38,10 +40,11 @@ public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { @Override public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFilesConfiguration, boolean multipleHandlers) { + Timer.start("SPARK_SERVER_FACTORY_CREATE"); if (embeddedServer == null) { LambdaEmbeddedServerFactory.embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, multipleHandlers); } - + Timer.stop("SPARK_SERVER_FACTORY_CREATE"); return embeddedServer; } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 47d1d9a6..26914ae0 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -12,6 +12,8 @@ */ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; + import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -127,6 +129,7 @@ public void setSpringProfiles(List springProfiles) { @Override public void onStartup(ServletContext servletContext) throws ServletException { + Timer.start("SPRING_INITIALIZER_ONSTARTUP"); if (springProfiles != null) { applicationContext.getEnvironment().setActiveProfiles(springProfiles.toArray(new String[0])); } @@ -163,6 +166,7 @@ public void onApplicationEvent(ServletRequestHandledEvent servletRequestHandledE dispatcherServlet.init(dispatcherConfig); notifyStartListeners(servletContext); + Timer.stop("SPRING_INITIALIZER_ONSTARTUP"); } private void notifyStartListeners(ServletContext context) { @@ -180,6 +184,8 @@ private void notifyStartListeners(ServletContext context) { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + Timer.start("SPRING_INITIALIZER_SERVICE"); + Timer.start("SPRING_INITIALIZER_SERVICE_CAST"); if (!(req instanceof HttpServletRequest)) { throw new ServletException("Cannot service request that is not instance of HttpServletRequest"); } @@ -187,7 +193,9 @@ public void service(ServletRequest req, ServletResponse res) throws ServletExcep if (!(res instanceof HttpServletResponse)) { throw new ServletException("Cannot work with response that is not instance of HttpServletResponse"); } + Timer.stop("SPRING_INITIALIZER_SERVICE_CAST"); dispatch((HttpServletRequest)req, (HttpServletResponse)res); + Timer.stop("SPRING_INITIALIZER_SERVICE"); } /** diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 164e8e1d..fd961ee3 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -19,6 +19,7 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; @@ -90,7 +91,9 @@ public SpringBootLambdaContainerHandler(RequestReader springBootInitializer) throws ContainerInitializationException { super(requestReader, responseWriter, securityContextWriter, exceptionHandler); + Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); this.springBootInitializer = springBootInitializer; + Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); } public void activateSpringProfiles(String... profiles) { @@ -107,12 +110,14 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest @Override protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { // this method of the AwsLambdaServletContainerHandler sets the servlet context + Timer.start("SPRINGBOOT_HANDLE_REQUEST"); if (getServletContext() == null) { setServletContext(new SpringBootAwsServletContext()); } // wire up the application context on the first invocation if (!initialized) { + Timer.start("SPRINGBOOT_COLD_START"); if (springProfiles != null && springProfiles.length > 0) { System.setProperty("spring.profiles.active", String.join(",", springProfiles)); } @@ -128,6 +133,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt } initialized = true; + Timer.stop("SPRINGBOOT_COLD_START"); } containerRequest.setServletContext(getServletContext()); @@ -137,6 +143,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt DispatcherServlet dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); // process filters & invoke servlet doFilter(containerRequest, containerResponse, dispatcherServlet); + Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); } private class SpringBootAwsServletContext extends AwsServletContext { diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 76df8bbc..108cb384 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -19,6 +19,7 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; @@ -95,7 +96,9 @@ public SpringLambdaContainerHandler(RequestReader { - private final ResourceConfig jerseyApplication = new ResourceConfig() - .packages("com.amazonaws.serverless.sample.jersey") - .register(JacksonFeature.class); - private final JerseyLambdaContainerHandler handler - = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - return handler.proxy(awsProxyRequest, context); - } -} \ No newline at end of file diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java index 6195e653..34567ce7 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java @@ -2,6 +2,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -23,6 +24,11 @@ public class StreamLambdaHandler implements RequestStreamHandler { private final JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { @@ -32,6 +38,9 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co AwsProxyResponse resp = handler.proxy(request, context); LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + + System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers())); + // just in case it wasn't closed by the mapper outputStream.close(); } diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java deleted file mode 100644 index bfc795c8..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/LambdaHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spark; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.Spark; - -public class LambdaHandler implements RequestHandler { - private boolean isInitialized = false; - private SparkLambdaContainerHandler handler; - private Logger log = LoggerFactory.getLogger(LambdaHandler.class); - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - if (!isInitialized) { - isInitialized = true; - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - SparkResources.defineResources(); - Spark.awaitInitialization(); - } catch (ContainerInitializationException e) { - log.error("Cannot initialize Spark application", e); - return null; - } - } - return handler.proxy(awsProxyRequest, context); - } -} \ No newline at end of file diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java index c7c1b3bd..c30c895e 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; @@ -23,6 +24,11 @@ public class StreamLambdaHandler implements RequestStreamHandler { private SparkLambdaContainerHandler handler; private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { @@ -43,6 +49,9 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co AwsProxyResponse resp = handler.proxy(request, context); LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + + System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers())); + // just in case it wasn't closed by the mapper outputStream.close(); } diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java deleted file mode 100644 index 0aa89126..00000000 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/LambdaHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spring; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class LambdaHandler implements RequestHandler { - private SpringLambdaContainerHandler handler; - private Logger log = LoggerFactory.getLogger(LambdaHandler.class); - - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - if (handler == null) { - try { - handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); - } catch (ContainerInitializationException e) { - log.error("Cannot initialize spring handler", e); - return null; - } - } - return handler.proxy(awsProxyRequest, context); - } -} diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 8e08830a..790fc13c 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; @@ -21,6 +22,11 @@ public class StreamLambdaHandler implements RequestStreamHandler { private SpringLambdaContainerHandler handler; private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { @@ -39,6 +45,9 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co AwsProxyResponse resp = handler.proxy(request, context); LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + + System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers())); + // just in case it wasn't closed by the mapper outputStream.close(); } diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java deleted file mode 100644 index 4e272ab7..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/LambdaHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.amazonaws.serverless.sample.springboot; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class LambdaHandler implements RequestStreamHandler { - private SpringBootLambdaContainerHandler handler; - private static ObjectMapper mapper = new ObjectMapper(); - private Logger log = LoggerFactory.getLogger(LambdaHandler.class); - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - if (handler == null) { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - - } catch (ContainerInitializationException e) { - e.printStackTrace(); - outputStream.close(); - return; - } - } - - AwsProxyRequest request = mapper.readValue(inputStream, AwsProxyRequest.class); - - AwsProxyResponse resp = handler.proxy(request, context); - mapper.writeValue(outputStream, resp); - // just in case it wasn't closed by the mapper - outputStream.close(); - } -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java index 1cf57452..abc03895 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; @@ -21,6 +22,11 @@ public class StreamLambdaHandler implements RequestStreamHandler { private SpringBootLambdaContainerHandler handler; private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class); + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { @@ -39,6 +45,9 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co AwsProxyResponse resp = handler.proxy(request, context); LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp); + + System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers())); + // just in case it wasn't closed by the mapper outputStream.close(); } From c40ac370ea3cf11df5db7d51ac577346d0e63a1f Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 18 Jan 2018 06:56:12 -0800 Subject: [PATCH 0080/1214] Fixed JavaDoc comments on servlet response factory class for Jersey --- .../jersey/factory/AwsProxyServletResponseFactory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java index 79768aaf..1b9de98c 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java @@ -27,8 +27,8 @@ /** - * Implementation of Jersey's Factory object for HttpServletRequest objects. This can be used - * by Jersey to generate a Servlet request given an AwsProxyRequest event. + * Implementation of Jersey's Factory object for HttpServletResponse objects. This can be used + * to write data directly to the servlet response for the method, without using Jersey's ContainerResponse * *
  * 
@@ -36,8 +36,8 @@
  *         .register(new AbstractBinder() {
  *             {@literal @}Override
  *             protected void configure() {
- *                 bindFactory(AwsProxyServletRequestFactory.class)
- *                     .to(HttpServletRequest.class)
+ *                 bindFactory(AwsProxyServletResponseFactory.class)
+ *                     .to(HttpServletResponse.class)
  *                     .in(RequestScoped.class);
  *            }
  *       });

From 9f9f139de5993a1f261d2be586aef0c64cf2fb00 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Mon, 22 Jan 2018 14:21:13 -0800
Subject: [PATCH 0081/1214] Cleanup for README preparing for 0.9 release.
 Documentation is now in the wiki

---
 README.md | 212 ++++--------------------------------------------------
 1 file changed, 14 insertions(+), 198 deletions(-)

diff --git a/README.md b/README.md
index fedd49f7..31fbb296 100644
--- a/README.md
+++ b/README.md
@@ -1,205 +1,20 @@
 # Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container)
-The `aws-serverless-java-container` is collection of interfaces and their implementations that let you run Java application written with frameworks such as [Jersey](https://jersey.java.net/) or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
+The `aws-serverless-java-container` makes it easy to run Java applications written wih frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
 
-The library contains a core artifact called `aws-serverless-java-container-core` that defines the interfaces and base classes required as well as default implementation of the Java servlet `HttpServletRequest` and `HttpServletResponse`.
-The library also includes two initial implementations of the interfaces to support Jersey apps (`aws-serverless-java-container-jersey`) and Spark (`aws-serverless-java-container-spark`).
+Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings.
 
-To include the library in your Maven project, add the desired implementation to your `pom.xml` file, for example:
+Follow the quick started guides in [our wiki](wiki) to integrate Serverless Java Container with your project:
+* [Spring quick start](wiki/Quick-start---Spring)
+* [Spring Boot quick start](wiki/Quick-start---Spring-Boot)
+* [Jersey quick start](wiki/Quick-start---Jersey)
+* [Spark quick start](wiki/Quick-start---Spark)   
 
-```
-
-    com.amazonaws.serverless
-    aws-serverless-java-container-jersey
-    0.8
-
-```
-
-## Integrating with Lambda
-The simplest way to run your application serverlessly is to configure [API Gateway](https://aws.amazon.com/api-gateway/) to use the
-[`AWS_PROXY`](http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on-proxy-resource) integration type and
-configure your desired `LambdaContainerHandler` implementation to use `AwsProxyRequest`/`AwsProxyResponse` readers and writers. Both Spark and Jersey implementations provide static helper methods that
-pre-configure this for you. 
-
-When using a Cognito User Pool authorizer, use the Lambda `RequestStreamHandler` instead of the POJO-based `RequestHandler` handler. An example of this is included at the bottom of this file. The POJO handler does not support Jackson annotations required for the `CognitoAuthorizerClaims` class. 
-
-### Jersey support
-The library expects to receive a valid [JAX-RS](https://jax-rs-spec.java.net) application object. For the Jersey implementation this is the `ResourceConfig` object.
-
-```java
-public class LambdaHandler implements RequestHandler {
-    private ResourceConfig jerseyApplication = new ResourceConfig().packages("my.jersey.app.package");
-    private JerseyLambdaContainerHandler handler
-        = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication);
-
-    public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
-        return handler.proxy(awsProxyRequest, context);
-    }
-}
-```
-
-### Spring support
-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.
-
-```java
-@Configuration
-@ComponentScan("com.amazonaws.serverless.proxy.spring.echoapp")
-public class EchoSpringAppConfig {
-}
-```
-
-Once you have declared a configuration class, you can initialize the library with the class name:
-```java
-public class LambdaHandler implements RequestHandler {
-    SpringLambdaContainerHandler handler = 
-        SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class);
-    
-    public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
-        return handler.proxy(awsProxyRequest, context);
-    }
-}
-```
-
-#### Spring Profiles
-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.
-
-#### Spring Boot
-You can also use this framework to start Spring Boot applications inside Lambda. The framework does not recognize classes annotated with `@SpringBootApplication` automatically. However, you can wrap the Spring Boot application class in a regular `ConfigurableWebApplicationContext` object. In your handler class, instead of initializing the `SpringLambdaContainerHandler` with the Spring Boot application class, initialize another context and set the Spring Boot app as a parent:
-
-```java
-SpringApplication springBootApplication = new SpringApplication(SpringBootApplication.class);
-springBootApplication.setWebEnvironment(false);
-springBootApplication.setBannerMode(Banner.Mode.OFF);
-
-// create a new empty context and set the spring boot application as a parent of it
-ConfigurableWebApplicationContext wrappingContext = new AnnotationConfigWebApplicationContext();
-wrappingContext.setParent(springBootApplication.run());
-
-// now we can initialize the framework with the wrapping context
-SpringLambdaContainerHandler handler = 
-    SpringLambdaContainerHandler.getAwsProxyHandler(wrappingContext);
-```    
-
-When using Spring Boot, make sure to configure the shade plugin in your pom file to exclude the embedded container and all unnecessary libraries to reduce the size of your built jar.
-
-### Spark support
-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.
-
-```java
-public class LambdaHandler implements RequestHandler {
-    private SparkLambdaContainerHandler handler = 
-            SparkLambdaContainerHandler.getAwsProxyHandler();
-    private boolean initialized = false;
-    
-    public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) {
-        if (!initialized) {
-            defineRoutes();
-            // it's important to call the awaitInitialization method not to run into race 
-            // conditions as routes are loaded asynchronously
-            Spark.awaitInitialization();
-            initialized = true;
-        }
-        return handler.proxy(awsProxyRequest, context);
-    }
-    
-    private void defineRoutes() {
-        get("/hello", (req, res) -> "Hello World");
-    }
-}
-```
-
-If you configure an [`initExceptionHandler` method](http://sparkjava.com/documentation#stopping-the-server), make sure that you call `System.exit` at the end of the method. This framework keeps a `CountDownLatch` on the request
-and unless you forcefully exit from the thread, the Lambda function will hang waiting for a latch that is never released.
-
-```java
-initExceptionHandler((e) -> {
-    LOG.error("ignite failed", e);
-    System.exit(100);
-});
-```
-
-# Security context
-The `aws-serverless-java-container-core` contains a default implementation of the `SecurityContextWriter` that supports API Gateway's proxy integration. The generated security context uses the API Gateway `$context` object to establish the request security context. The context looks for the following values in order and returns the first matched type:
-
-1. Cognito My User Pools
-2. Custom authorizers
-3. IAM auth.
-
-The String values for these are exposed as static variables in the `AwsProxySecurityContext` object.
-
-1. `AUTH_SCHEME_COGNITO_POOL`
-2. `AUTH_SCHEME_CUSTOM`
-3. `AUTH_SCHEME_IAM`
-
-# Supporting other event types
-The `RequestReader` and `ResponseWriter` interfaces in the core package can be used to support event types and generate different responses. For example, ff you have configured mapping templates in
-API Gateway to create a custom event body or response you can create your own implementation of the `RequestReader` and `ResponseWriter` to handle these.
-
-The `LambdaContainerHandler` also requires a `SecurityContextWriter` and an `ExceptionHandler`. You can also create custom implementations of these interfaces.
- 
-The `RequestReader`, `ResponseWriter`, `SecurityContextWriter`, and `ExceptionHandler` objects are passed to the constructor of the `LambdaContainerHandler` implementation:
- 
-```java
-JerseyLambdaContainerHandler handler =
-    new JerseyLambdaContainerHandler<>(new MyCustomRequestReader(),
-                                       new MyCustomResponseWriter(),
-                                       new MyCustomSecurityContextWriter(),
-                                       new MyCustomExceptionHandler(),
-                                       jaxRsApplication);
-```
- 
-# Jersey Servlet injection
-The `aws-serverless-java-container-jersey` includes Jersey factory classes to produce `HttpServletRequest` and `ServletContext` objects for your methods. First, you will need to register the factory with your Jersey application.
-
-```java
-ResourceConfig app = new ResourceConfig()
-    .packages("com.amazonaws.serverless.proxy.test.jersey")
-    .register(new AbstractBinder() {
-        @Override
-        protected void configure() {
-            bindFactory(AwsProxyServletRequestFactory.class)
-                .to(HttpServletRequest.class)
-                .in(RequestScoped.class);
-            bindFactory(AwsProxyServletContextFactory.class)
-                .to(ServletContext.class)
-                .in(RequestScoped.class);
-        }
-    });
-```
-
-Once the factory is registered, you can receive `HttpServletRequest` and `ServletContext` objects in your methods using the `@Context` annotation.
-
-```java
-@Path("/my-servlet") @GET
-public String echoServletHeaders(@Context HttpServletRequest context) {
-    Enumeration headerNames = context.getHeaderNames();
-    while (headerNames.hasMoreElements()) {
-        String headerName = headerNames.nextElement();
-    }
-    return "servlet";
-}
-```
-
-## Servlet Filters
-You can register [`Filter`](https://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html) implementations by implementing a `StartupsHandler` as defined in the `AwsLambdaServletContainerHandler` class. The `onStartup` methods receives a reference to the current `ServletContext`.
-
-```java
-handler.onStartup(c -> {
-    FilterRegistration.Dynamic registration = c.addFilter("CustomHeaderFilter", CustomHeaderFilter.class);
-    // update the registration to map to a path
-    registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
-    // servlet name mappings are disabled and will throw an exception
-});
-```
-
-# Using the Lambda Stream handler
-By default, Lambda does not use Jackson annotations when marshalling and unmarhsalling JSON. This can cause issues when receiving requests that include the claims object from a Cognito User Pool authorizer. To support these type of requests, use Lambda's `RequestStreamHandler` interface instead of the POJO-based `RequestHandler`. This allows you to use a custom version of Jackson with support for annotations. 
-
-This library uses Jackson annotations in the `com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims` object. The example below shows how to do this with a `SpringLambdaContainerHandler`, you can use the same methodology with all of the other implementations.
+Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). 
 
 ```java
 public class StreamLambdaHandler implements RequestStreamHandler {
     private SpringLambdaContainerHandler handler;
-    private static ObjectMapper mapper = new ObjectMapper();
+    private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
 
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
@@ -208,18 +23,19 @@ public class StreamLambdaHandler implements RequestStreamHandler {
             try {
                 handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class);
             } catch (ContainerInitializationException e) {
-                e.printStackTrace();
+                log.error("Cannot initialize Spring container", e);
                 outputStream.close();
+                throw new RuntimeException(e);
             }
         }
 
-        AwsProxyRequest request = mapper.readValue(inputStream, AwsProxyRequest.class);
+        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
 
         AwsProxyResponse resp = handler.proxy(request, context);
 
-        mapper.writeValue(outputStream, resp);
+        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
         // just in case it wasn't closed by the mapper
         outputStream.close();
     }
 }
-```
+``` 
\ No newline at end of file

From 6893a4ccd88b2f8587d540f694fb42866b2c283b Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Mon, 22 Jan 2018 14:23:20 -0800
Subject: [PATCH 0082/1214] Fixed README to use absolute links

---
 README.md | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index 31fbb296..94cb648c 100644
--- a/README.md
+++ b/README.md
@@ -3,13 +3,13 @@ The `aws-serverless-java-container` makes it easy to run Java applications writt
 
 Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings.
 
-Follow the quick started guides in [our wiki](wiki) to integrate Serverless Java Container with your project:
-* [Spring quick start](wiki/Quick-start---Spring)
-* [Spring Boot quick start](wiki/Quick-start---Spring-Boot)
-* [Jersey quick start](wiki/Quick-start---Jersey)
-* [Spark quick start](wiki/Quick-start---Spark)   
+Follow the quick started guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project:
+* [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring)
+* [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot)
+* [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey)
+* [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark)   
 
-Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). 
+Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). 
 
 ```java
 public class StreamLambdaHandler implements RequestStreamHandler {

From 83e65be488a8c05c6b5f32e2c72469a2d3cc1160 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Mon, 22 Jan 2018 15:03:55 -0800
Subject: [PATCH 0083/1214] [maven-release-plugin] prepare release
 aws-serverless-java-container-0.9

---
 aws-serverless-java-container-core/pom.xml   | 4 ++--
 aws-serverless-java-container-jersey/pom.xml | 6 +++---
 aws-serverless-java-container-spark/pom.xml  | 6 +++---
 aws-serverless-java-container-spring/pom.xml | 6 +++---
 pom.xml                                      | 2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index 9794788d..ac507b06 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Core
     Allows Java applications written for a servlet container to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9-SNAPSHOT
+    0.9
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9-SNAPSHOT
+        0.9
     
 
     
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index 920c8d40..73ae219b 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Jersey implementation
     Allows Java applications written for Jersey to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9-SNAPSHOT
+    0.9
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9-SNAPSHOT
+        0.9
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9-SNAPSHOT
+            0.9
             
                 
                     com.fasterxml.jackson.core
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index bc1a1adf..d6b3b10c 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spark implementation
     Allows Java applications written for Spark to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9-SNAPSHOT
+    0.9
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9-SNAPSHOT
+        0.9
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9-SNAPSHOT
+            0.9
         
 
         
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index b12554d3..6db31810 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spring implementation
     Allows Java applications written for the Spring framework to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9-SNAPSHOT
+    0.9
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9-SNAPSHOT
+        0.9
     
 
     
@@ -24,7 +24,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9-SNAPSHOT
+            0.9
         
 
         
diff --git a/pom.xml b/pom.xml
index d0456781..f5da7d1a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     com.amazonaws.serverless
     aws-serverless-java-container
     pom
-    0.9-SNAPSHOT
+    0.9
     AWS Serverless Java container
 
     

From ccab5b6f675d08836ff0e9d6d555b86880bc64df Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Mon, 22 Jan 2018 15:03:56 -0800
Subject: [PATCH 0084/1214] [maven-release-plugin] prepare for next development
 iteration

---
 aws-serverless-java-container-core/pom.xml   | 4 ++--
 aws-serverless-java-container-jersey/pom.xml | 6 +++---
 aws-serverless-java-container-spark/pom.xml  | 6 +++---
 aws-serverless-java-container-spring/pom.xml | 6 +++---
 pom.xml                                      | 2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index ac507b06..8cb3133f 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Core
     Allows Java applications written for a servlet container to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9
+        1.0-SNAPSHOT
     
 
     
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index 73ae219b..9e1532d8 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Jersey implementation
     Allows Java applications written for Jersey to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9
+        1.0-SNAPSHOT
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9
+            1.0-SNAPSHOT
             
                 
                     com.fasterxml.jackson.core
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index d6b3b10c..91738601 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spark implementation
     Allows Java applications written for Spark to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9
+        1.0-SNAPSHOT
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9
+            1.0-SNAPSHOT
         
 
         
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 6db31810..a0ff669b 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spring implementation
     Allows Java applications written for the Spring framework to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9
+        1.0-SNAPSHOT
     
 
     
@@ -24,7 +24,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9
+            1.0-SNAPSHOT
         
 
         
diff --git a/pom.xml b/pom.xml
index f5da7d1a..49775a8d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     com.amazonaws.serverless
     aws-serverless-java-container
     pom
-    0.9
+    1.0-SNAPSHOT
     AWS Serverless Java container
 
     

From c46b68b6186f90f1cab063f8277f923b3a1e4d0a Mon Sep 17 00:00:00 2001
From: Rosseyn 
Date: Tue, 23 Jan 2018 17:06:19 -0800
Subject: [PATCH 0085/1214] Quick typo fixes

---
 README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index 94cb648c..36726d72 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
 # Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container)
-The `aws-serverless-java-container` makes it easy to run Java applications written wih frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
+The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
 
 Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings.
 
-Follow the quick started guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project:
+Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project:
 * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring)
 * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot)
 * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey)
@@ -38,4 +38,4 @@ public class StreamLambdaHandler implements RequestStreamHandler {
         outputStream.close();
     }
 }
-``` 
\ No newline at end of file
+``` 

From 5fbba8e19d90457f88bb295b79463643a89058fc Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 24 Jan 2018 15:25:42 -0800
Subject: [PATCH 0086/1214] Removed print of Principal from sample method

---
 .../serverless/sample/springboot/controller/PetsController.java  | 1 -
 1 file changed, 1 deletion(-)

diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java
index cd879543..2680d111 100644
--- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java
+++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java
@@ -45,7 +45,6 @@ public Pet createPet(@RequestBody Pet newPet) {
 
     @RequestMapping(path = "/pets", method = RequestMethod.GET)
     public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) {
-        System.out.println(principal.getName());
         int queryLimit = 10;
         if (limit.isPresent()) {
             queryLimit = limit.get();

From 68658d83a132dcdd6745e548ff5590a6f2a4c3b9 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 07:11:47 -0800
Subject: [PATCH 0087/1214] Fixes to address Jersey routing issue reported in
 #112. This is a new bug introduced with the fixes for #84. Added unit tests

---
 .../proxy/jersey/JerseyHandlerFilter.java     | 14 +----------
 .../proxy/jersey/JerseyAwsProxyTest.java      | 24 +++++++++++++++++++
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
index e36a044f..ee682dbf 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
@@ -97,22 +97,10 @@ public void destroy() {
     @SuppressFBWarnings({ "SERVLET_HEADER", "SERVLET_QUERY_STRING" })
     private ContainerRequest servletRequestToContainerRequest(ServletRequest request) {
         Timer.start("JERSEY_SERVLET_REQUEST_TO_CONTAINER");
-        URI basePathUri;
         URI requestPathUri;
         String basePath = "/";
         HttpServletRequest servletRequest = (HttpServletRequest)request;
 
-        try {
-            if (servletRequest.getContextPath().equals("")) {
-                basePathUri = URI.create(basePath);
-            } else {
-                basePathUri = new URI(servletRequest.getContextPath());
-            }
-        } catch (URISyntaxException e) {
-            log.error("Could not read base path URI", e);
-            basePathUri = URI.create(basePath);
-        }
-
         UriBuilder uriBuilder = UriBuilder.fromPath(servletRequest.getPathInfo());
         uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString()));
 
@@ -125,7 +113,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
         apiGatewayProperties.setProperty(JERSEY_SERVLET_REQUEST_PROPERTY, servletRequest);
 
         ContainerRequest requestContext = new ContainerRequest(
-                basePathUri,
+                URI.create(basePath), // for routing within Jersey we always assume the base path is "/"
                 requestPathUri,
                 servletRequest.getMethod().toUpperCase(Locale.ENGLISH),
                 (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY),
diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
index bbb28853..055d6313 100644
--- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
+++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
@@ -278,6 +278,30 @@ public void exception_mapException_mapToNotImplemented() {
         assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode());
     }
 
+    @Test
+    public void stripBasePath_route_shouldRouteCorrectly() {
+        AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET")
+                                          .json()
+                                          .queryString("status", "201")
+                                          .build();
+        handler.stripBasePath("/custompath");
+        AwsProxyResponse output = handler.proxy(request, lambdaContext);
+        assertEquals(201, output.getStatusCode());
+        handler.stripBasePath("");
+    }
+
+    @Test
+    public void stripBasePath_route_shouldReturn404() {
+        AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET")
+                                          .json()
+                                          .queryString("status", "201")
+                                          .build();
+        handler.stripBasePath("/custom");
+        AwsProxyResponse output = handler.proxy(request, lambdaContext);
+        assertEquals(404, output.getStatusCode());
+        handler.stripBasePath("");
+    }
+
     private void validateMapResponseModel(AwsProxyResponse output) {
         validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE);
     }

From 54bcef56ee1861301e8716c03a3e45916510a7c5 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 14:46:45 -0800
Subject: [PATCH 0088/1214] Added unit test to validate the proposed solution
 for #111 and warning log messages in request object when a framework tries to
 access the session

---
 .../servlet/AwsHttpServletRequest.java        |  7 ++
 aws-serverless-java-container-spring/pom.xml  | 67 +++++++++++++++++++
 .../proxy/spring/SpringBootAppTest.java       | 43 ++++++++++++
 .../spring/springbootapp/LambdaHandler.java   | 37 ++++++++++
 .../spring/springbootapp/TestApplication.java | 12 ++++
 .../spring/springbootapp/TestController.java  | 30 +++++++++
 6 files changed, 196 insertions(+)
 create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
 create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java
 create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java
 create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index 2530d67b..b2e61430 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -107,6 +107,7 @@ public String getRequestedSessionId() {
 
     @Override
     public HttpSession getSession(boolean b) {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         if (b && null == this.session) {
             ApiGatewayRequestContext requestContext = (ApiGatewayRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY);
             this.session = new AwsHttpSession(requestContext.getRequestId());
@@ -117,30 +118,35 @@ public HttpSession getSession(boolean b) {
 
     @Override
     public HttpSession getSession() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return this.session;
     }
 
 
     @Override
     public String changeSessionId() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return null;
     }
 
 
     @Override
     public boolean isRequestedSessionIdValid() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
 
     @Override
     public boolean isRequestedSessionIdFromCookie() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
 
     @Override
     public boolean isRequestedSessionIdFromURL() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
@@ -148,6 +154,7 @@ public boolean isRequestedSessionIdFromURL() {
     @Override
     @Deprecated
     public boolean isRequestedSessionIdFromUrl() {
+        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index a0ff669b..56e71048 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -16,6 +16,7 @@
 
     
         4.3.13.RELEASE
+        4.2.4.RELEASE
         2.9.3
     
 
@@ -77,6 +78,72 @@
             2.2.4
             test
         
+        
+            org.springframework.boot
+            spring-boot-autoconfigure
+            1.5.9.RELEASE
+            test
+        
+        
+            org.springframework.security
+            spring-security-config
+            ${spring-security.version}
+            test
+            
+                
+                    org.springframework
+                    spring-aop
+                
+                
+                    org.springframework
+                    spring-expression
+                
+                
+                    org.springframework
+                    spring-context
+                
+                
+                    org.springframework
+                    spring-beans
+                
+                
+                    org.springframework
+                    spring-core
+                
+            
+        
+        
+            org.springframework.security
+            spring-security-web
+            ${spring-security.version}
+            test
+            
+                
+                    org.springframework
+                    spring-aop
+                
+                
+                    org.springframework
+                    spring-expression
+                
+                
+                    org.springframework
+                    spring-context
+                
+                
+                    org.springframework
+                    spring-beans
+                
+                
+                    org.springframework
+                    spring-core
+                
+                
+                    org.springframework
+                    spring-web
+                
+            
+        
     
 
     
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
new file mode 100644
index 00000000..f6829c47
--- /dev/null
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
@@ -0,0 +1,43 @@
+package com.amazonaws.serverless.proxy.spring;
+
+
+import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
+import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel;
+import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler;
+import com.amazonaws.serverless.proxy.spring.springbootapp.TestController;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.*;
+
+
+public class SpringBootAppTest {
+    private LambdaHandler handler = new LambdaHandler();
+    private MockLambdaContext context = new MockLambdaContext();
+    private ObjectMapper mapper = new ObjectMapper();
+
+    @Test
+    public void testMethod_springSecurity_doesNotThrowException() {
+        AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").build();
+        AwsProxyResponse resp = handler.handleRequest(req, context);
+        assertNotNull(resp);
+        validateSingleValueModel(resp, TestController.TEST_VALUE);
+    }
+
+    private void validateSingleValueModel(AwsProxyResponse output, String value) {
+        try {
+            SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class);
+            assertNotNull(response.getValue());
+            assertEquals(value, response.getValue());
+        } catch (IOException e) {
+            fail("Exception while parsing response body: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java
new file mode 100644
index 00000000..1451b9c0
--- /dev/null
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java
@@ -0,0 +1,37 @@
+package com.amazonaws.serverless.proxy.spring.springbootapp;
+
+
+import com.amazonaws.serverless.exceptions.ContainerInitializationException;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
+import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler;
+import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+
+import org.springframework.web.context.support.XmlWebApplicationContext;
+
+
+public class LambdaHandler
+        implements RequestHandler
+{
+    SpringBootLambdaContainerHandler handler;
+    boolean isinitialized = false;
+
+    public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context)
+    {
+        if (!isinitialized) {
+            isinitialized = true;
+            try {
+                handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class);
+            } catch (ContainerInitializationException e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+        AwsProxyResponse res = handler.proxy(awsProxyRequest, context);
+        return res;
+    }
+}
+
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java
new file mode 100644
index 00000000..d203a56e
--- /dev/null
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java
@@ -0,0 +1,12 @@
+package com.amazonaws.serverless.proxy.spring.springbootapp;
+
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
+
+
+@SpringBootApplication
+@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp")
+public class TestApplication extends SpringBootServletInitializer {
+}
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java
new file mode 100644
index 00000000..39433db3
--- /dev/null
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java
@@ -0,0 +1,30 @@
+package com.amazonaws.serverless.proxy.spring.springbootapp;
+
+
+import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel;
+
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@EnableWebSecurity
+public class TestController extends WebSecurityConfigurerAdapter{
+    public static final String TEST_VALUE = "test";
+
+    @RequestMapping(path = "/test", method = { RequestMethod.GET })
+    public SingleValueModel testGet() {
+        SingleValueModel value = new SingleValueModel();
+        value.setValue(TEST_VALUE);
+        return value;
+    }
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http.sessionManagement().disable();
+    }
+}

From 64ab945f4e2a9c708732fbe4a9a1561e54eb5b76 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 14:54:25 -0800
Subject: [PATCH 0089/1214] Changing version to 0.9.1-SNAPSHOT and preparing
 for release

---
 aws-serverless-java-container-core/pom.xml   | 4 ++--
 aws-serverless-java-container-jersey/pom.xml | 4 ++--
 aws-serverless-java-container-spark/pom.xml  | 4 ++--
 aws-serverless-java-container-spring/pom.xml | 4 ++--
 pom.xml                                      | 2 +-
 5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index 8cb3133f..e9c14b3b 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Core
     Allows Java applications written for a servlet container to run in AWS Lambda
     https://aws.amazon.com/lambda
-    1.0-SNAPSHOT
+    0.9.1-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        1.0-SNAPSHOT
+        0.9.1-SNAPSHOT
     
 
     
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index 9e1532d8..d1084a04 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Jersey implementation
     Allows Java applications written for Jersey to run in AWS Lambda
     https://aws.amazon.com/lambda
-    1.0-SNAPSHOT
+    0.9.1-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        1.0-SNAPSHOT
+        0.9.1-SNAPSHOT
     
 
     
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index 91738601..45aef5c7 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spark implementation
     Allows Java applications written for Spark to run in AWS Lambda
     https://aws.amazon.com/lambda
-    1.0-SNAPSHOT
+    0.9.1-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        1.0-SNAPSHOT
+        0.9.1-SNAPSHOT
     
 
     
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 56e71048..338edd5c 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spring implementation
     Allows Java applications written for the Spring framework to run in AWS Lambda
     https://aws.amazon.com/lambda
-    1.0-SNAPSHOT
+    0.9.1-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        1.0-SNAPSHOT
+        0.9.1-SNAPSHOT
     
 
     
diff --git a/pom.xml b/pom.xml
index 49775a8d..0e8ab641 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     com.amazonaws.serverless
     aws-serverless-java-container
     pom
-    1.0-SNAPSHOT
+    0.9.1-SNAPSHOT
     AWS Serverless Java container
 
     

From d852cc5fb86fe06e325903135026bf68b5266c0f Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 14:58:48 -0800
Subject: [PATCH 0090/1214] Changed dependencies to core 0.9.1-SNAPSHOT

---
 aws-serverless-java-container-jersey/pom.xml | 2 +-
 aws-serverless-java-container-spark/pom.xml  | 2 +-
 aws-serverless-java-container-spring/pom.xml | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index d1084a04..eb7d4ca1 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            1.0-SNAPSHOT
+            0.9.1-SNAPSHOT
             
                 
                     com.fasterxml.jackson.core
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index 45aef5c7..25c0aad5 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            1.0-SNAPSHOT
+            0.9.1-SNAPSHOT
         
 
         
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 338edd5c..a2453f9c 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -25,7 +25,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            1.0-SNAPSHOT
+            0.9.1-SNAPSHOT
         
 
         

From 06dbd5294e91312a2a1ad3300e6a7602b3351c52 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 15:06:59 -0800
Subject: [PATCH 0091/1214] [maven-release-plugin] prepare release
 aws-serverless-java-container-0.9.1

---
 aws-serverless-java-container-core/pom.xml   | 4 ++--
 aws-serverless-java-container-jersey/pom.xml | 6 +++---
 aws-serverless-java-container-spark/pom.xml  | 6 +++---
 aws-serverless-java-container-spring/pom.xml | 6 +++---
 pom.xml                                      | 2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index e9c14b3b..e0c9888e 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Core
     Allows Java applications written for a servlet container to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1-SNAPSHOT
+    0.9.1
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1-SNAPSHOT
+        0.9.1
     
 
     
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index eb7d4ca1..a42d846f 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Jersey implementation
     Allows Java applications written for Jersey to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1-SNAPSHOT
+    0.9.1
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1-SNAPSHOT
+        0.9.1
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1-SNAPSHOT
+            0.9.1
             
                 
                     com.fasterxml.jackson.core
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index 25c0aad5..a83f43f4 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spark implementation
     Allows Java applications written for Spark to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1-SNAPSHOT
+    0.9.1
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1-SNAPSHOT
+        0.9.1
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1-SNAPSHOT
+            0.9.1
         
 
         
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index a2453f9c..050de1d5 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spring implementation
     Allows Java applications written for the Spring framework to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1-SNAPSHOT
+    0.9.1
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1-SNAPSHOT
+        0.9.1
     
 
     
@@ -25,7 +25,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1-SNAPSHOT
+            0.9.1
         
 
         
diff --git a/pom.xml b/pom.xml
index 0e8ab641..511480ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     com.amazonaws.serverless
     aws-serverless-java-container
     pom
-    0.9.1-SNAPSHOT
+    0.9.1
     AWS Serverless Java container
 
     

From 3e3481c7f678cb19e76446cc67703a574ef084d1 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 15:07:00 -0800
Subject: [PATCH 0092/1214] [maven-release-plugin] prepare for next development
 iteration

---
 aws-serverless-java-container-core/pom.xml   | 4 ++--
 aws-serverless-java-container-jersey/pom.xml | 6 +++---
 aws-serverless-java-container-spark/pom.xml  | 6 +++---
 aws-serverless-java-container-spring/pom.xml | 6 +++---
 pom.xml                                      | 2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index e0c9888e..8cb3133f 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Core
     Allows Java applications written for a servlet container to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1
+        1.0-SNAPSHOT
     
 
     
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index a42d846f..9e1532d8 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Jersey implementation
     Allows Java applications written for Jersey to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1
+        1.0-SNAPSHOT
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1
+            1.0-SNAPSHOT
             
                 
                     com.fasterxml.jackson.core
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index a83f43f4..91738601 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spark implementation
     Allows Java applications written for Spark to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1
+        1.0-SNAPSHOT
     
 
     
@@ -23,7 +23,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1
+            1.0-SNAPSHOT
         
 
         
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 050de1d5..56e71048 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -6,12 +6,12 @@
     AWS Serverless Java container support - Spring implementation
     Allows Java applications written for the Spring framework to run in AWS Lambda
     https://aws.amazon.com/lambda
-    0.9.1
+    1.0-SNAPSHOT
 
     
         com.amazonaws.serverless
         aws-serverless-java-container
-        0.9.1
+        1.0-SNAPSHOT
     
 
     
@@ -25,7 +25,7 @@
         
             com.amazonaws.serverless
             aws-serverless-java-container-core
-            0.9.1
+            1.0-SNAPSHOT
         
 
         
diff --git a/pom.xml b/pom.xml
index 511480ac..49775a8d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     com.amazonaws.serverless
     aws-serverless-java-container
     pom
-    0.9.1
+    1.0-SNAPSHOT
     AWS Serverless Java container
 
     

From b8d468e209b04a7f11633e031f3f77341425c710 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Wed, 31 Jan 2018 15:11:53 -0800
Subject: [PATCH 0093/1214] Added maven badge to README

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 36726d72..b25ff061 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container)
+# Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container)
 The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
 
 Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings.

From 7d4718bc2d38c95174ba4974d9aabf0a4ad70b74 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Thu, 1 Feb 2018 08:14:59 -0800
Subject: [PATCH 0094/1214] Removed principal logging from sample to address
 #104

---
 .../com/amazonaws/serverless/sample/spring/PetsController.java   | 1 -
 1 file changed, 1 deletion(-)

diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
index df622b10..a84f4232 100644
--- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
+++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
@@ -37,7 +37,6 @@ public Pet createPet(@RequestBody Pet newPet) {
 
     @RequestMapping(path = "/pets", method = RequestMethod.GET)
     public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) {
-        System.out.println(principal.getName());
         int queryLimit = 10;
         if (limit.isPresent()) {
             queryLimit = limit.get();

From 65b62c277b7f24595201277a95ff82067647ac96 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 2 Feb 2018 10:53:30 -0800
Subject: [PATCH 0095/1214] Addressed java.lang.ClassCastException:
 org.springframework.boot.web.support.ErrorPageFilter cannot be cast to
 com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse
 mentioned in issue #105.

---
 .../AwsLambdaServletContainerHandler.java     | 23 +++++++++++++++++--
 .../servlet/AwsProxyRequestDispatcher.java    |  4 ++++
 .../jersey/JerseyServletResponseWriter.java   |  1 +
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index c3909452..00489abb 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -19,6 +19,7 @@
 import com.amazonaws.serverless.proxy.SecurityContextWriter;
 import com.amazonaws.services.lambda.runtime.Context;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,8 +27,11 @@
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
+import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
 import java.io.IOException;
 
 /**
@@ -85,7 +89,7 @@ protected AwsLambdaServletContainerHandler(RequestReaderonStartup to intercept the ServletContext as the Spring application is
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
index 4080e1c7..1c719e02 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
@@ -1,6 +1,8 @@
 package com.amazonaws.serverless.proxy.internal.servlet;
 
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletException;
@@ -48,6 +50,7 @@ public AwsProxyRequestDispatcher(final String path, final AwsLambdaServletContai
 
     @Override
     @SuppressWarnings("unchecked")
+    @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
     public void forward(ServletRequest servletRequest, ServletResponse servletResponse)
             throws ServletException, IOException {
         if (!(servletRequest instanceof AwsProxyHttpServletRequest)) {
@@ -67,6 +70,7 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon
 
     @Override
     @SuppressWarnings("unchecked")
+    @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
     public void include(ServletRequest servletRequest, ServletResponse servletResponse)
             throws ServletException, IOException {
         if (!(servletRequest instanceof AwsProxyHttpServletRequest)) {
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java
index 8e15112e..a7df1f18 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java
@@ -60,6 +60,7 @@ class JerseyServletResponseWriter
      * @param resp The current ServletResponse from the container
      */
     public JerseyServletResponseWriter(ServletResponse resp, CountDownLatch latch) {
+        assert resp instanceof HttpServletResponse;
         servletResponse = (HttpServletResponse)resp;
         jerseyLatch = latch;
     }

From 28242b7e42d8e1e0f5bd0d585d4f38dec58e6541 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 2 Feb 2018 10:56:42 -0800
Subject: [PATCH 0096/1214] Addressed FB unchecked cast warnings

---
 .../proxy/internal/servlet/AwsProxyRequestDispatcher.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
index 1c719e02..8faa16c9 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java
@@ -50,7 +50,6 @@ public AwsProxyRequestDispatcher(final String path, final AwsLambdaServletContai
 
     @Override
     @SuppressWarnings("unchecked")
-    @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
     public void forward(ServletRequest servletRequest, ServletResponse servletResponse)
             throws ServletException, IOException {
         if (!(servletRequest instanceof AwsProxyHttpServletRequest)) {
@@ -64,13 +63,13 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon
         ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.FORWARD);
         ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath);
 
+        assert servletResponse instanceof HttpServletResponse : servletResponse.getClass();
         lambdaContainerHandler.forward((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse);
     }
 
 
     @Override
     @SuppressWarnings("unchecked")
-    @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
     public void include(ServletRequest servletRequest, ServletResponse servletResponse)
             throws ServletException, IOException {
         if (!(servletRequest instanceof AwsProxyHttpServletRequest)) {
@@ -84,6 +83,7 @@ public void include(ServletRequest servletRequest, ServletResponse servletRespon
         ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.INCLUDE);
         ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath);
 
+        assert servletResponse instanceof HttpServletResponse : servletResponse.getClass();
         lambdaContainerHandler.include((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse);
     }
 }

From e345b1dc0f491b5b18b1be867599f1b955615374 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 2 Feb 2018 13:36:08 -0800
Subject: [PATCH 0097/1214] Moved the flushBuffer call on the servlet response
 to the handler, outside of the chain holder. This enables forwards/includes
 requests and partly addresses on of the issues highlighted in #105

---
 .../servlet/AwsHttpServletRequest.java        |  2 +-
 .../AwsLambdaServletContainerHandler.java     |  7 ++++-
 .../internal/servlet/FilterChainHolder.java   |  6 -----
 .../servlet/AwsHttpServletResponseTest.java   |  8 ++++--
 .../proxy/spring/SpringBootAppTest.java       | 26 +++++++++++++++++++
 5 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index b2e61430..349c06e0 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -101,7 +101,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
 
     @Override
     public String getRequestedSessionId() {
-        throw new UnsupportedOperationException();
+        return null;
     }
 
 
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index 00489abb..bce33e3a 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -19,10 +19,10 @@
 import com.amazonaws.serverless.proxy.SecurityContextWriter;
 import com.amazonaws.services.lambda.runtime.Context;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.DispatcherType;
 import javax.servlet.FilterChain;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContext;
@@ -208,6 +208,11 @@ protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet)
     protected void doFilter(ContainerRequestType request, ContainerResponseType response, Servlet servlet) throws IOException, ServletException {
         FilterChain chain = getFilterChain(request, servlet);
         chain.doFilter(request, response);
+
+        // if for some reason the response wasn't flushed yet, we force it here.
+        if (request.getDispatcherType() != DispatcherType.FORWARD && request.getDispatcherType() != DispatcherType.INCLUDE && !response.isCommitted()) {
+            response.flushBuffer();
+        }
     }
 
     //-------------------------------------------------------------
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java
index 3b018815..682230dd 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java
@@ -17,7 +17,6 @@
 import org.slf4j.LoggerFactory;
 
 import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -86,11 +85,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
             log.debug("Executed {}: filter {}-{}", servletRequest.getDispatcherType(),
                       currentFilter, holder.getFilterName());
         }
-
-        // if for some reason the response wasn't flushed yet, we force it here.
-        if (!servletResponse.isCommitted()) {
-            servletResponse.flushBuffer();
-        }
     }
 
 
diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java
index d4771354..553b7c61 100644
--- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java
+++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java
@@ -17,6 +17,9 @@
 
 
 public class AwsHttpServletResponseTest {
+    // we use this int to compare the cookie expiration time in the tests. The date we generate to compare to
+    // may be slight off compared to the date generated during the request processing
+    private static final int COOKIE_GRACE_COMPARE_MILLIS = 2000;
     private static final String COOKIE_NAME = "session_id";
     private static final String COOKIE_VALUE = "123";
     private static final String COOKIE_PATH = "/api";
@@ -121,8 +124,9 @@ public void cookie_addCookie_positiveMaxAgeExpiresDate() {
         Calendar expiration = getExpires(cookieHeader);
         System.out.println("Cookie date: " + dateFormat.format(expiration.getTime()));
         System.out.println("Test date: " + dateFormat.format(testExpiration.getTime()));
-        // we need to compare strings because the millis time will be off
-        assertEquals(dateFormat.format(testExpiration.getTime()), dateFormat.format(expiration.getTime()));
+
+        long dateDiff = testExpiration.getTimeInMillis() - expiration.getTimeInMillis();
+        assertTrue(Math.abs(dateDiff) < COOKIE_GRACE_COMPARE_MILLIS);
     }
 
     @Test
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
index f6829c47..5fdabec6 100644
--- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java
@@ -9,10 +9,13 @@
 import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler;
 import com.amazonaws.serverless.proxy.spring.springbootapp.TestController;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.Map;
 
 import static org.junit.Assert.*;
 
@@ -30,6 +33,29 @@ public void testMethod_springSecurity_doesNotThrowException() {
         validateSingleValueModel(resp, TestController.TEST_VALUE);
     }
 
+    @Test
+    public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() {
+        AwsProxyRequest req = new AwsProxyRequestBuilder("/test2", "GET").build();
+        AwsProxyResponse resp = handler.handleRequest(req, context);
+        assertNotNull(resp);
+        assertEquals(404, resp.getStatusCode());
+        assertNotNull(resp.getHeaders());
+        assertTrue(resp.getHeaders().containsKey("Content-Type"));
+        assertEquals("application/json;charset=UTF-8", resp.getHeaders().get("Content-Type"));
+        try {
+            JsonNode errorData = mapper.readTree(resp.getBody());
+            assertNotNull(errorData.findValue("status"));
+            assertEquals(404, errorData.findValue("status").asInt());
+            assertNotNull(errorData.findValue("message"));
+            assertEquals("No message available", errorData.findValue("message").asText());
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail();
+        }
+
+    }
+
     private void validateSingleValueModel(AwsProxyResponse output, String value) {
         try {
             SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class);

From c70c4dcc4b55f25f1e0e665cb6d468b8eba4f725 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 9 Feb 2018 11:59:39 -0800
Subject: [PATCH 0098/1214] Added request logging from #116. Includes a
 LogFormatter interface and its default implementation

---
 .../serverless/proxy/LogFormatter.java        |  24 ++++
 .../internal/LambdaContainerHandler.java      |  17 +++
 .../ApacheCombinedServletLogFormatter.java    | 105 ++++++++++++++++++
 .../AwsLambdaServletContainerHandler.java     |   3 +
 .../servlet/AwsProxyHttpServletRequest.java   |  11 +-
 .../testutils/AwsProxyRequestBuilder.java     |  25 +++++
 .../proxy/model/ApiGatewayRequestContext.java |  11 ++
 .../AwsProxyHttpServletRequestTest.java       |  17 +++
 8 files changed, 211 insertions(+), 2 deletions(-)
 create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java
 create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java
new file mode 100644
index 00000000..cef0514d
--- /dev/null
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java
@@ -0,0 +1,24 @@
+package com.amazonaws.serverless.proxy;
+
+
+import javax.ws.rs.core.SecurityContext;
+
+
+/**
+ * Implementations of the log formatter interface are used by {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler} class to log each request
+ * processed in the container. You can set the log formatter using the {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler#setLogFormatter(LogFormatter)}
+ * method. The servlet implementation of the container ({@link com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler} includes a
+ * default log formatter that produces Apache combined logs. {@link com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter}.
+ * @param  The request type used by the underlying framework
+ * @param  The response type produced by the underlying framework
+ */
+public interface LogFormatter {
+    /**
+     * The format method is called by the container handler to produce the log line that should be written to the logs.
+     * @param req The incoming request
+     * @param res The completed response
+     * @param ctx The security context produced based on the request
+     * @return The log line
+     */
+    String format(ContainerRequestType req, ContainerResponseType res, SecurityContext ctx);
+}
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
index d9729a22..7f5fd4ea 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
@@ -13,6 +13,8 @@
 package com.amazonaws.serverless.proxy.internal;
 
 
+import com.amazonaws.serverless.proxy.LogFormatter;
+import com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter;
 import com.amazonaws.serverless.proxy.model.ContainerConfig;
 import com.amazonaws.serverless.proxy.ExceptionHandler;
 import com.amazonaws.serverless.proxy.RequestReader;
@@ -56,10 +58,12 @@ public abstract class LambdaContainerHandler exceptionHandler;
 
     protected Context lambdaContext;
+    protected LogFormatter logFormatter;
 
     private Logger log = LoggerFactory.getLogger(LambdaContainerHandler.class);
 
 
+
     //-------------------------------------------------------------
     // Variables - Private - Static
     //-------------------------------------------------------------
@@ -119,6 +123,15 @@ public void stripBasePath(String basePath) {
         config.setServiceBasePath(basePath);
     }
 
+    /**
+     * Sets the formatter used to log request data in CloudWatch. By default this is set to use an Apache
+     * combined log format based on the servlet request and response object {@link ApacheCombinedServletLogFormatter}.
+     * @param formatter The log formatter object
+     */
+    public void setLogFormatter(LogFormatter formatter) {
+        this.logFormatter = formatter;
+    }
+
 
     /**
      * Proxies requests to the underlying container given the incoming Lambda request. This method returns a populated
@@ -140,6 +153,10 @@ public ResponseType proxy(RequestType request, Context context) {
 
             latch.await();
 
+            if (logFormatter != null) {
+                log.info(SecurityUtils.crlf(logFormatter.format(containerRequest, containerResponse, securityContext)));
+            }
+
             return responseWriter.writeResponse(containerResponse, context);
         } catch (Exception e) {
             log.error("Error while handling request", e);
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
new file mode 100644
index 00000000..b43e2169
--- /dev/null
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
@@ -0,0 +1,105 @@
+package com.amazonaws.serverless.proxy.internal.servlet;
+
+
+import com.amazonaws.serverless.proxy.LogFormatter;
+import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.SecurityContext;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+
+import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
+
+
+/**
+ * Default implementation of the log formatter. Based on an HttpServletRequest and HttpServletResponse implementations produced
+ * a log line in the Apache combined log format: https://httpd.apache.org/docs/2.4/logs.html
+ * @param  An implementation of HttpServletRequest
+ * @param  An implementation of HttpServletResponse
+ */
+public class ApacheCombinedServletLogFormatter
+        implements LogFormatter {
+    SimpleDateFormat dateFormat;
+
+    public ApacheCombinedServletLogFormatter() {
+        dateFormat = new SimpleDateFormat("[dd/MM/yyyy:hh:mm:ss Z]");
+    }
+
+    @Override
+    @SuppressFBWarnings({ "SERVLET_HEADER_REFERER", "SERVLET_HEADER_USER_AGENT" })
+    public String format(ContainerRequestType servletRequest, ContainerResponseType servletResponse, SecurityContext ctx) {
+        //LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
+        StringBuilder logLineBuilder = new StringBuilder();
+
+        // %h
+        logLineBuilder.append(servletRequest.getRemoteAddr());
+        logLineBuilder.append(" ");
+
+        // %l
+        if (servletRequest instanceof AwsProxyHttpServletRequest && servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY) != null) {
+            ApiGatewayRequestContext gatewayContext = (ApiGatewayRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY);
+            logLineBuilder.append(gatewayContext.getIdentity().getUserArn());
+            logLineBuilder.append(" ");
+        } else {
+            logLineBuilder.append("- ");
+        }
+
+        // %u
+        if (ctx != null) {
+            logLineBuilder.append(ctx.getUserPrincipal().getName());
+        }
+        logLineBuilder.append(" ");
+
+
+        // %t
+        logLineBuilder.append(dateFormat.format(Calendar.getInstance().getTime()));
+        logLineBuilder.append(" ");
+
+        // %r
+        logLineBuilder.append("\"");
+        logLineBuilder.append(servletRequest.getMethod().toUpperCase(Locale.ENGLISH));
+        logLineBuilder.append(" ");
+        logLineBuilder.append(servletRequest.getPathInfo());
+        logLineBuilder.append(" ");
+        logLineBuilder.append(servletRequest.getProtocol());
+        logLineBuilder.append(" \" ");
+
+        // %>s
+        logLineBuilder.append(servletResponse.getStatus());
+        logLineBuilder.append(" ");
+
+        // %b
+        if (servletResponse instanceof AwsHttpServletResponse) {
+            AwsHttpServletResponse awsResponse = (AwsHttpServletResponse)servletResponse;
+            if (awsResponse.getAwsResponseBodyBytes().length > 0) {
+                logLineBuilder.append(awsResponse.getAwsResponseBodyBytes().length);
+            } else {
+                logLineBuilder.append("-");
+            }
+        } else {
+            logLineBuilder.append("-");
+        }
+        logLineBuilder.append(" ");
+
+        // \"%{Referer}i\"
+        logLineBuilder.append("\"");
+        logLineBuilder.append(servletRequest.getHeader("referer"));
+        logLineBuilder.append("\"");
+
+        // \"%{User-agent}i\"
+        logLineBuilder.append("\"");
+        logLineBuilder.append(servletRequest.getHeader("user-agent"));
+        logLineBuilder.append("\"");
+
+        logLineBuilder.append(" combined");
+
+
+        return logLineBuilder.toString();
+    }
+}
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index bce33e3a..fa29e94e 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -34,6 +34,7 @@
 
 import java.io.IOException;
 
+
 /**
  * Abstract extension of the code LambdaContainerHandler object that adds protected variables for the
  * ServletContext and FilterChainManager. This object should be extended by the framework-specific
@@ -73,6 +74,8 @@ protected AwsLambdaServletContainerHandler(RequestReader securityContextWriter,
                                      ExceptionHandler exceptionHandler) {
         super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        // set the default log formatter for servlet implementations
+        setLogFormatter(new ApacheCombinedServletLogFormatter<>());
     }
 
     //-------------------------------------------------------------
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
index a964a1b4..9c8a19ed 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
@@ -501,8 +501,7 @@ public Map getParameterMap() {
 
     @Override
     public String getProtocol() {
-        // TODO: We should have a cloudfront protocol header
-        return null;
+        return request.getRequestContext().getProtocol();
     }
 
 
@@ -621,6 +620,14 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se
 
 
     private String getHeaderCaseInsensitive(String key) {
+        // special cases for referer and user agent headers
+        if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) {
+            return request.getRequestContext().getIdentity().getCaller();
+        }
+        if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) {
+            return request.getRequestContext().getIdentity().getUserAgent();
+        }
+
         if (request.getHeaders() == null) {
             return null;
         }
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
index b9c839f1..abda6933 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
@@ -68,6 +68,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) {
         this.request.setRequestContext(new ApiGatewayRequestContext());
         this.request.getRequestContext().setRequestId("test-invoke-request");
         this.request.getRequestContext().setStage("test");
+        this.request.getRequestContext().setProtocol("HTTP/1.1");
         ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity();
         identity.setSourceIp("127.0.0.1");
         this.request.getRequestContext().setIdentity(identity);
@@ -236,6 +237,30 @@ public AwsProxyRequestBuilder serverName(String serverName) {
         return this;
     }
 
+    public AwsProxyRequestBuilder userAgent(String agent) {
+        if (request.getRequestContext() == null) {
+            request.setRequestContext(new ApiGatewayRequestContext());
+        }
+        if (request.getRequestContext().getIdentity() == null) {
+            request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity());
+        }
+
+        request.getRequestContext().getIdentity().setUserAgent(agent);
+        return this;
+    }
+
+    public AwsProxyRequestBuilder referer(String referer) {
+        if (request.getRequestContext() == null) {
+            request.setRequestContext(new ApiGatewayRequestContext());
+        }
+        if (request.getRequestContext().getIdentity() == null) {
+            request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity());
+        }
+
+        request.getRequestContext().getIdentity().setCaller(referer);
+        return this;
+    }
+
     public AwsProxyRequestBuilder fromJsonString(String jsonContent)
             throws IOException {
         request = LambdaContainerHandler.getObjectMapper().readValue(jsonContent, AwsProxyRequest.class);
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
index 657bde19..8f52f542 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
@@ -43,6 +43,7 @@ public class ApiGatewayRequestContext {
     private ApiGatewayAuthorizerContext authorizer;
     private String stage;
     private String path;
+    private String protocol;
 
 
     //-------------------------------------------------------------
@@ -146,4 +147,14 @@ public ApiGatewayAuthorizerContext getAuthorizer() {
     public void setAuthorizer(ApiGatewayAuthorizerContext authorizer) {
         this.authorizer = authorizer;
     }
+
+
+    public String getProtocol() {
+        return protocol;
+    }
+
+
+    public void setProtocol(String protocol) {
+        this.protocol = protocol;
+    }
 }
diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
index fc104432..b2342efe 100644
--- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
+++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
@@ -23,6 +23,8 @@ public class AwsProxyHttpServletRequestTest {
     private static final String FORM_PARAM_TEST = "test_cookie_param";
     private static final String QUERY_STRING_NAME_VALUE = "Bob";
     private static final String REQUEST_SCHEME_HTTP = "http";
+    private static final String USER_AGENT = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0";
+    private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox";
 
     private static final AwsProxyRequest REQUEST_WITH_HEADERS = new AwsProxyRequestBuilder("/hello", "GET")
             .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
@@ -46,6 +48,9 @@ public class AwsProxyHttpServletRequestTest {
     private static final AwsProxyRequest REQUEST_MULTIPLE_FORM_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST")
             .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE)
             .queryString(FORM_PARAM_TEST, QUERY_STRING_NAME_VALUE).build();
+    private static final AwsProxyRequest REQUEST_USER_AGENT_REFERER = new AwsProxyRequestBuilder("/hello", "POST")
+            .userAgent(USER_AGENT)
+            .referer(REFERER).build();
 
     private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING;
     static {
@@ -66,6 +71,18 @@ public void headers_getHeader_validRequest() {
         assertEquals(MediaType.APPLICATION_JSON, request.getContentType());
     }
 
+    @Test
+    public void headers_getRefererAndUserAgent_returnsContextValues() {
+        HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_USER_AGENT_REFERER, null, null);
+        assertNotNull(request.getHeader("Referer"));
+        assertEquals(REFERER, request.getHeader("Referer"));
+        assertEquals(REFERER, request.getHeader("referer"));
+
+        assertNotNull(request.getHeader("User-Agent"));
+        assertEquals(USER_AGENT, request.getHeader("User-Agent"));
+        assertEquals(USER_AGENT, request.getHeader("user-agent"));
+    }
+
     @Test
     public void formParams_getParameter_validForm() {
         HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED, null, null);

From 62d96002174ff1930055551dc212b4e8c75e9f27 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 9 Feb 2018 13:06:23 -0800
Subject: [PATCH 0099/1214] Added new fields to request context and fixed a
 couple of issues with log formatter for #116

---
 .../ApacheCombinedServletLogFormatter.java    | 46 +++++++++++++------
 .../proxy/model/ApiGatewayRequestContext.java | 22 +++++++++
 2 files changed, 54 insertions(+), 14 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
index b43e2169..66b8fc1b 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
@@ -11,7 +11,9 @@
 import javax.ws.rs.core.SecurityContext;
 
 import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.util.Calendar;
+import java.util.Date;
 import java.util.Locale;
 
 import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
@@ -36,29 +38,37 @@ public ApacheCombinedServletLogFormatter() {
     public String format(ContainerRequestType servletRequest, ContainerResponseType servletResponse, SecurityContext ctx) {
         //LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
         StringBuilder logLineBuilder = new StringBuilder();
+        ApiGatewayRequestContext gatewayContext = (ApiGatewayRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY);
 
         // %h
         logLineBuilder.append(servletRequest.getRemoteAddr());
         logLineBuilder.append(" ");
 
         // %l
-        if (servletRequest instanceof AwsProxyHttpServletRequest && servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY) != null) {
-            ApiGatewayRequestContext gatewayContext = (ApiGatewayRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY);
-            logLineBuilder.append(gatewayContext.getIdentity().getUserArn());
-            logLineBuilder.append(" ");
+        if (gatewayContext != null) {
+            if (gatewayContext.getIdentity().getUserArn() != null) {
+                logLineBuilder.append(gatewayContext.getIdentity().getUserArn());
+            } else {
+                logLineBuilder.append("-");
+            }
         } else {
-            logLineBuilder.append("- ");
+            logLineBuilder.append("-");
         }
+        logLineBuilder.append(" ");
 
         // %u
-        if (ctx != null) {
+        if (ctx != null && ctx.getUserPrincipal().getName() != null) {
             logLineBuilder.append(ctx.getUserPrincipal().getName());
+            logLineBuilder.append(" ");
         }
-        logLineBuilder.append(" ");
 
 
         // %t
-        logLineBuilder.append(dateFormat.format(Calendar.getInstance().getTime()));
+        if (gatewayContext != null) {
+            logLineBuilder.append(dateFormat.format(Date.from(Instant.ofEpochMilli(gatewayContext.getRequestTimeEpoch()))));
+        } else {
+            logLineBuilder.append(dateFormat.format(Calendar.getInstance().getTime()));
+        }
         logLineBuilder.append(" ");
 
         // %r
@@ -68,7 +78,7 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
         logLineBuilder.append(servletRequest.getPathInfo());
         logLineBuilder.append(" ");
         logLineBuilder.append(servletRequest.getProtocol());
-        logLineBuilder.append(" \" ");
+        logLineBuilder.append("\" ");
 
         // %>s
         logLineBuilder.append(servletResponse.getStatus());
@@ -89,15 +99,23 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
 
         // \"%{Referer}i\"
         logLineBuilder.append("\"");
-        logLineBuilder.append(servletRequest.getHeader("referer"));
-        logLineBuilder.append("\"");
+        if (servletRequest.getHeader("referer") != null) {
+            logLineBuilder.append(servletRequest.getHeader("referer"));
+        } else {
+            logLineBuilder.append("-");
+        }
+        logLineBuilder.append("\" ");
 
         // \"%{User-agent}i\"
         logLineBuilder.append("\"");
-        logLineBuilder.append(servletRequest.getHeader("user-agent"));
-        logLineBuilder.append("\"");
+        if (servletRequest.getHeader("user-agent") != null) {
+            logLineBuilder.append(servletRequest.getHeader("user-agent"));
+        } else {
+            logLineBuilder.append("-");
+        }
+        logLineBuilder.append("\" ");
 
-        logLineBuilder.append(" combined");
+        logLineBuilder.append("combined");
 
 
         return logLineBuilder.toString();
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
index 8f52f542..edf28e05 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
@@ -44,6 +44,8 @@ public class ApiGatewayRequestContext {
     private String stage;
     private String path;
     private String protocol;
+    private String requestTime;
+    private long requestTimeEpoch;
 
 
     //-------------------------------------------------------------
@@ -157,4 +159,24 @@ public String getProtocol() {
     public void setProtocol(String protocol) {
         this.protocol = protocol;
     }
+
+
+    public String getRequestTime() {
+        return requestTime;
+    }
+
+
+    public void setRequestTime(String requestTime) {
+        this.requestTime = requestTime;
+    }
+
+
+    public long getRequestTimeEpoch() {
+        return requestTimeEpoch;
+    }
+
+
+    public void setRequestTimeEpoch(long requestTimeEpoch) {
+        this.requestTimeEpoch = requestTimeEpoch;
+    }
 }

From 1ad723f6c89b47b838ecdbfa190045c64eef25d8 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 9 Feb 2018 13:11:27 -0800
Subject: [PATCH 0100/1214] Changed warning messages when trying to access the
 session to debug to avoid cluttering CloudWatch logs when used with Spring

---
 .../internal/servlet/AwsHttpServletRequest.java    | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index 349c06e0..67c962c2 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -107,7 +107,7 @@ public String getRequestedSessionId() {
 
     @Override
     public HttpSession getSession(boolean b) {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         if (b && null == this.session) {
             ApiGatewayRequestContext requestContext = (ApiGatewayRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY);
             this.session = new AwsHttpSession(requestContext.getRequestId());
@@ -118,35 +118,35 @@ public HttpSession getSession(boolean b) {
 
     @Override
     public HttpSession getSession() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return this.session;
     }
 
 
     @Override
     public String changeSessionId() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return null;
     }
 
 
     @Override
     public boolean isRequestedSessionIdValid() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
 
     @Override
     public boolean isRequestedSessionIdFromCookie() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
 
     @Override
     public boolean isRequestedSessionIdFromURL() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 
@@ -154,7 +154,7 @@ public boolean isRequestedSessionIdFromURL() {
     @Override
     @Deprecated
     public boolean isRequestedSessionIdFromUrl() {
-        log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+        log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
         return false;
     }
 

From da248d9f9a24f6ecc8cf796836359e63f0ae99ec Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 9 Feb 2018 13:29:20 -0800
Subject: [PATCH 0101/1214] Moved from findbugs to spotbugs (#120) and addresse
 new issue discovered by spotbugs

---
 aws-serverless-java-container-core/pom.xml    | 40 +++----------------
 .../servlet/AwsHttpServletRequest.java        |  4 +-
 aws-serverless-java-container-jersey/pom.xml  | 40 +++----------------
 aws-serverless-java-container-spark/pom.xml   | 40 +++----------------
 aws-serverless-java-container-spring/pom.xml  | 40 +++----------------
 5 files changed, 22 insertions(+), 142 deletions(-)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index 8cb3133f..7fac3be7 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -65,42 +65,12 @@
         
     
 
-    
-        
-            
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
-                
-                    
-                    Max
-                    
-                    Low
-                    
-                    true
-
-                    
-                        
-                            com.h3xstream.findsecbugs
-                            findsecbugs-plugin
-                            1.7.1
-                        
-                    
-                
-            
-        
-    
-
     
         
             
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
+                com.github.spotbugs
+                spotbugs-maven-plugin
+                3.1.1
                 
                     
                     true
                     
-                    ${project.build.directory}/findbugs
+                    ${project.build.directory}/spotbugs
 
                     
                         
@@ -125,7 +95,7 @@
                 
                 
                     
                     
                         analyze-compile
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index 67c962c2..925ce973 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -275,7 +275,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) {
 
         return parsedHeaders.stream()
                             .filter(e -> e.getKey() != null)
-                            .map(e -> new Cookie(e.getKey(), e.getValue()))
+                            .map(e -> new Cookie(SecurityUtils.crlf(e.getKey()), SecurityUtils.crlf(e.getValue())))
                             .toArray(Cookie[]::new);
     }
 
@@ -304,7 +304,7 @@ protected String generateQueryString(Map parameters) {
                             newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name());
                         }
                     } catch (UnsupportedEncodingException e) {
-                        log.error("Could not URLEncode: " + newKey, e);
+                        log.error(SecurityUtils.crlf("Could not URLEncode: " + newKey), e);
 
                     }
                     return newKey + "=" + newValue;
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index 9e1532d8..bcdbdcbf 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -70,42 +70,12 @@
 
     
 
-    
-        
-            
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
-                
-                    
-                    Max
-                    
-                    Low
-                    
-                    true
-
-                    
-                        
-                            com.h3xstream.findsecbugs
-                            findsecbugs-plugin
-                            1.7.1
-                        
-                    
-                
-            
-        
-    
-
     
         
             
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
+                com.github.spotbugs
+                spotbugs-maven-plugin
+                3.1.1
                 
                     
                     true
                     
-                    ${project.build.directory}/findbugs
+                    ${project.build.directory}/spotbugs
 
                     
                         
@@ -130,7 +100,7 @@
                 
                 
                     
                     
                         analyze-compile
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index 91738601..f534b090 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -41,36 +41,6 @@
         
     
 
-    
-        
-            
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
-                
-                    
-                    Max
-                    
-                    Low
-                    
-                    true
-
-                    
-                        
-                            com.h3xstream.findsecbugs
-                            findsecbugs-plugin
-                            1.7.1
-                        
-                    
-                
-            
-        
-    
-
     
         
             
@@ -83,9 +53,9 @@
                 
             
             
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
+                com.github.spotbugs
+                spotbugs-maven-plugin
+                3.1.1
                 
                     
                     true
                     
-                    ${project.build.directory}/findbugs
+                    ${project.build.directory}/spotbugs
 
                     
                         
@@ -110,7 +80,7 @@
                 
                 
                     
                     
                         analyze-compile
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 56e71048..9814c0f8 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -146,36 +146,6 @@
         
     
 
-    
-        
-            
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
-                
-                    
-                    Max
-                    
-                    Low
-                    
-                    true
-
-                    
-                        
-                            com.h3xstream.findsecbugs
-                            findsecbugs-plugin
-                            1.7.1
-                        
-                    
-                
-            
-        
-    
-
     
         
             
@@ -188,9 +158,9 @@
                 
             
             
-                org.codehaus.mojo
-                findbugs-maven-plugin
-                3.0.5
+                com.github.spotbugs
+                spotbugs-maven-plugin
+                3.1.1
                 
                     
                     true
                     
-                    ${project.build.directory}/findbugs
+                    ${project.build.directory}/spotbugs
 
                     
                         
@@ -215,7 +185,7 @@
                 
                 
                     
                     
                         analyze-compile

From 361ae5a1646916291f0bc08105b245cada2f0512 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Fri, 9 Feb 2018 17:49:04 -0800
Subject: [PATCH 0102/1214] Added  method to simplify the implementation of
 Lambda's . This addresses #118.

---
 .../internal/LambdaContainerHandler.java      |  40 ++++++-
 .../AwsLambdaServletContainerHandler.java     |   5 +-
 .../testutils/AwsProxyRequestBuilder.java     |  12 ++
 .../jersey/JerseyLambdaContainerHandler.java  |   9 +-
 .../spark/SparkLambdaContainerHandler.java    |   8 +-
 .../spark/HelloWorldSparkStreamTest.java      | 108 ++++++++++++++++++
 .../proxy/spark/InitExceptionHandlerTest.java |  12 +-
 .../SpringBootLambdaContainerHandler.java     |   7 +-
 .../spring/SpringLambdaContainerHandler.java  |   8 +-
 .../sample/jersey/StreamLambdaHandler.java    |  13 +--
 .../sample/spark/StreamLambdaHandler.java     |  13 +--
 .../sample/spring/StreamLambdaHandler.java    |   9 +-
 .../springboot/StreamLambdaHandler.java       |   9 +-
 13 files changed, 197 insertions(+), 56 deletions(-)
 create mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
index 7f5fd4ea..9e268d2f 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
@@ -22,12 +22,17 @@
 import com.amazonaws.serverless.proxy.SecurityContextWriter;
 import com.amazonaws.services.lambda.runtime.Context;
 
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.ws.rs.core.SecurityContext;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.concurrent.CountDownLatch;
 
 
@@ -56,9 +61,10 @@ public abstract class LambdaContainerHandler responseWriter;
     private SecurityContextWriter securityContextWriter;
     private ExceptionHandler exceptionHandler;
+    private Class requestTypeClass;
 
     protected Context lambdaContext;
-    protected LogFormatter logFormatter;
+    private LogFormatter logFormatter;
 
     private Logger log = LoggerFactory.getLogger(LambdaContainerHandler.class);
 
@@ -77,11 +83,13 @@ public abstract class LambdaContainerHandler requestReader,
+    protected LambdaContainerHandler(Class requestClass,
+                                     RequestReader requestReader,
                                      ResponseWriter responseWriter,
                                      SecurityContextWriter securityContextWriter,
                                      ExceptionHandler exceptionHandler) {
         log.info("Starting Lambda Container Handler");
+        requestTypeClass = requestClass;
         this.requestReader = requestReader;
         this.responseWriter = responseWriter;
         this.securityContextWriter = securityContextWriter;
@@ -166,6 +174,34 @@ public ResponseType proxy(RequestType request, Context context) {
     }
 
 
+    /**
+     * Handles Lambda RequestStreamHandler method. The method uses an ObjectMapper
+     * to transform the incoming input stream into the given {@link RequestType} and then calls the
+     * {@link #proxy(Object, Context)} method to handle the request. The output from the proxy method is
+     * written on the given output stream.
+     * @param input Lambda's incoming input stream
+     * @param output Lambda's response output stream
+     * @param context Lambda's context object
+     * @throws IOException If an error occurs during the stream processing
+     */
+    public void proxyStream(InputStream input, OutputStream output, Context context)
+            throws IOException {
+
+        try {
+            RequestType request = getObjectMapper().readValue(input, requestTypeClass);
+            ResponseType resp = proxy(request, context);
+
+            getObjectMapper().writeValue(output, resp);
+        } catch (JsonParseException e) {
+            log.error("Error while parsing request object stream", e);
+            getObjectMapper().writeValue(output, exceptionHandler.handle(e));
+        } catch (JsonMappingException e) {
+            log.error("Error while mapping object to RequestType class", e);
+            getObjectMapper().writeValue(output, exceptionHandler.handle(e));
+        }
+    }
+
+
     //-------------------------------------------------------------
     // Methods - Getter/Setter
     //-------------------------------------------------------------
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index fa29e94e..4839ce7d 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -69,11 +69,12 @@ public abstract class AwsLambdaServletContainerHandler requestReader,
+    protected AwsLambdaServletContainerHandler(Class requestTypeClass,
+                                     RequestReader requestReader,
                                      ResponseWriter responseWriter,
                                      SecurityContextWriter securityContextWriter,
                                      ExceptionHandler exceptionHandler) {
-        super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         // set the default log formatter for servlet implementations
         setLogFormatter(new ApacheCombinedServletLogFormatter<>());
     }
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
index abda6933..6b88074c 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
@@ -27,9 +27,12 @@
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 import java.util.HashMap;
 
@@ -277,4 +280,13 @@ public AwsProxyRequestBuilder fromJsonPath(String filePath)
     public AwsProxyRequest build() {
         return this.request;
     }
+
+    public InputStream buildStream() {
+        try {
+            String requestJson = LambdaContainerHandler.getObjectMapper().writeValueAsString(request);
+            return new ByteArrayInputStream(requestJson.getBytes(StandardCharsets.UTF_8));
+        } catch (JsonProcessingException e) {
+            return null;
+        }
+    }
 }
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
index ec34f7d0..3caef5fe 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
@@ -95,7 +95,8 @@ public class JerseyLambdaContainerHandler extends Aws
      * @return A JerseyLambdaContainerHandler object
      */
     public static JerseyLambdaContainerHandler getAwsProxyHandler(Application jaxRsApplication) {
-        return new JerseyLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(),
+        return new JerseyLambdaContainerHandler<>(AwsProxyRequest.class,
+                                                  new AwsProxyHttpServletRequestReader(),
                                                   new AwsProxyHttpServletResponseWriter(),
                                                   new AwsProxySecurityContextWriter(),
                                                   new AwsProxyExceptionHandler(),
@@ -110,19 +111,21 @@ public static JerseyLambdaContainerHandler ge
     /**
      * Private constructor for a LambdaContainer. Sets the application object, sets the ApplicationHandler,
      * and initializes the application using the onStartup method.
+     * @param requestTypeClass The class for the expected event type
      * @param requestReader A request reader instance
      * @param responseWriter A response writer instance
      * @param securityContextWriter A security context writer object
      * @param exceptionHandler An exception handler
      * @param jaxRsApplication The JaxRs application
      */
-    public JerseyLambdaContainerHandler(RequestReader requestReader,
+    public JerseyLambdaContainerHandler(Class requestTypeClass,
+                                        RequestReader requestReader,
                                         ResponseWriter responseWriter,
                                         SecurityContextWriter securityContextWriter,
                                         ExceptionHandler exceptionHandler,
                                         Application jaxRsApplication) {
 
-        super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("JERSEY_CONTAINER_CONSTRUCTOR");
         this.jaxRsApplication = jaxRsApplication;
         this.initialized = false;
diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
index 300dc57e..b4d6a53a 100644
--- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
@@ -106,7 +106,8 @@ public class SparkLambdaContainerHandler
      */
     public static SparkLambdaContainerHandler getAwsProxyHandler()
             throws ContainerInitializationException {
-        return new SparkLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(),
+        return new SparkLambdaContainerHandler<>(AwsProxyRequest.class,
+                                                 new AwsProxyHttpServletRequestReader(),
                                                  new AwsProxyHttpServletResponseWriter(),
                                                  new AwsProxySecurityContextWriter(),
                                                  new AwsProxyExceptionHandler(),
@@ -118,13 +119,14 @@ public static SparkLambdaContainerHandler get
     //-------------------------------------------------------------
 
 
-    public SparkLambdaContainerHandler(RequestReader requestReader,
+    public SparkLambdaContainerHandler(Class requestTypeClass,
+                                       RequestReader requestReader,
                                        ResponseWriter responseWriter,
                                        SecurityContextWriter securityContextWriter,
                                        ExceptionHandler exceptionHandler,
                                        LambdaEmbeddedServerFactory embeddedServerFactory)
             throws ContainerInitializationException {
-        super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPARK_CONTAINER_HANDLER_CONSTRUCTOR");
 
         EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, embeddedServerFactory);
diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java
new file mode 100644
index 00000000..cbcfb377
--- /dev/null
+++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java
@@ -0,0 +1,108 @@
+package com.amazonaws.serverless.proxy.spark;
+
+
+import com.amazonaws.serverless.exceptions.ContainerInitializationException;
+import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
+import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
+import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import spark.Spark;
+
+import javax.servlet.http.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static spark.Spark.get;
+
+// This class doesn't actually test Spark. Instead it tests the proxyStream method of the
+// LambdaContainerHandler object. We use the Spark implementation for this because it's the
+// fastest to start
+public class HelloWorldSparkStreamTest {
+    private static final String CUSTOM_HEADER_KEY = "X-Custom-Header";
+    private static final String CUSTOM_HEADER_VALUE = "My Header Value";
+    private static final String BODY_TEXT_RESPONSE = "Hello World";
+
+    private static final String COOKIE_NAME = "MyCookie";
+    private static final String COOKIE_VALUE = "CookieValue";
+    private static final String COOKIE_DOMAIN = "mydomain.com";
+    private static final String COOKIE_PATH = "/";
+
+    private static SparkLambdaContainerHandler handler;
+
+    @BeforeClass
+    public static void initializeServer() {
+        try {
+            handler = SparkLambdaContainerHandler.getAwsProxyHandler();
+
+            configureRoutes();
+            Spark.awaitInitialization();
+        } catch (RuntimeException | ContainerInitializationException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    @AfterClass
+    public static void stopSpark() {
+        Spark.stop();
+    }
+
+    @Test
+    public void helloRequest_basicStream_populatesOutputSuccessfully() {
+        InputStream req = new AwsProxyRequestBuilder().method("GET").path("/hello").buildStream();
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        try {
+            handler.proxyStream(req, outputStream, new MockLambdaContext());
+            AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class);
+
+            assertEquals(200, response.getStatusCode());
+            assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY));
+            assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY));
+            assertEquals(BODY_TEXT_RESPONSE, response.getBody());
+        } catch (IOException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    private static void configureRoutes() {
+        get("/hello", (req, res) -> {
+            res.status(200);
+            res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE);
+            return BODY_TEXT_RESPONSE;
+        });
+
+        get("/cookie", (req, res) -> {
+            Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
+            testCookie.setDomain(COOKIE_DOMAIN);
+            testCookie.setPath(COOKIE_PATH);
+            res.raw().addCookie(testCookie);
+            return BODY_TEXT_RESPONSE;
+        });
+
+        get("/multi-cookie", (req, res) -> {
+            Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
+            testCookie.setDomain(COOKIE_DOMAIN);
+            testCookie.setPath(COOKIE_PATH);
+            Cookie testCookie2 = new Cookie(COOKIE_NAME + "2", COOKIE_VALUE + "2");
+            testCookie2.setDomain(COOKIE_DOMAIN);
+            testCookie2.setPath(COOKIE_PATH);
+            res.raw().addCookie(testCookie);
+            res.raw().addCookie(testCookie2);
+            return BODY_TEXT_RESPONSE;
+        });
+    }
+}
diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
index 1781b212..28f1e808 100644
--- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
+++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
@@ -6,6 +6,7 @@
 import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter;
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader;
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
 import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer;
 import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory;
 
@@ -37,11 +38,12 @@ public void initException_mockException_expectHandlerToRun() {
             when(embeddedServer.ignite(anyString(), anyInt(), anyObject(), anyInt(), anyInt(), anyInt()))
                     .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null));
             LambdaEmbeddedServerFactory serverFactory = new LambdaEmbeddedServerFactory(embeddedServer);
-            new SparkLambdaContainerHandler<>(new AwsProxyHttpServletRequestReader(),
-                                                      new AwsProxyHttpServletResponseWriter(),
-                                                      new AwsProxySecurityContextWriter(),
-                                                      new AwsProxyExceptionHandler(),
-                                                      serverFactory);
+            new SparkLambdaContainerHandler<>(AwsProxyRequest.class,
+                                              new AwsProxyHttpServletRequestReader(),
+                                              new AwsProxyHttpServletResponseWriter(),
+                                              new AwsProxySecurityContextWriter(),
+                                              new AwsProxyExceptionHandler(),
+                                              serverFactory);
 
             configureRoutes();
             Spark.awaitInitialization();
diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
index fd961ee3..6e8edc87 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
@@ -66,6 +66,7 @@ public class SpringBootLambdaContainerHandler extends
     public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer)
             throws ContainerInitializationException {
         return new SpringBootLambdaContainerHandler<>(
+                AwsProxyRequest.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -77,6 +78,7 @@ public static SpringBootLambdaContainerHandler requestReader,
+    public SpringBootLambdaContainerHandler(Class requestTypeClass,
+                                            RequestReader requestReader,
                                             ResponseWriter responseWriter,
                                             SecurityContextWriter securityContextWriter,
                                             ExceptionHandler exceptionHandler,
                                             Class springBootInitializer)
             throws ContainerInitializationException {
-        super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR");
         this.springBootInitializer = springBootInitializer;
         Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR");
diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
index 108cb384..6d7ef180 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
@@ -55,6 +55,7 @@ public static SpringLambdaContainerHandler ge
         applicationContext.register(config);
 
         return new SpringLambdaContainerHandler<>(
+                AwsProxyRequest.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -72,6 +73,7 @@ public static SpringLambdaContainerHandler ge
     public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext)
             throws ContainerInitializationException {
         return new SpringLambdaContainerHandler<>(
+                AwsProxyRequest.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -83,19 +85,21 @@ public static SpringLambdaContainerHandler ge
     /**
      * Creates a new container handler with the given reader and writer objects
      *
+     * @param requestTypeClass The class for the incoming Lambda event
      * @param requestReader An implementation of `RequestReader`
      * @param responseWriter An implementation of `ResponseWriter`
      * @param securityContextWriter An implementation of `SecurityContextWriter`
      * @param exceptionHandler An implementation of `ExceptionHandler`
      * @throws ContainerInitializationException
      */
-    public SpringLambdaContainerHandler(RequestReader requestReader,
+    public SpringLambdaContainerHandler(Class requestTypeClass,
+                                        RequestReader requestReader,
                                         ResponseWriter responseWriter,
                                         SecurityContextWriter securityContextWriter,
                                         ExceptionHandler exceptionHandler,
                                         ConfigurableWebApplicationContext applicationContext)
             throws ContainerInitializationException {
-        super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR");
         initializer = new LambdaSpringApplicationInitializer(applicationContext);
         Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR");
diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
index 34567ce7..860a4157 100644
--- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
+++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
@@ -1,7 +1,6 @@
 package com.amazonaws.serverless.sample.jersey;
 
 
-import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
 import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
@@ -18,10 +17,10 @@
 
 
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private final ResourceConfig jerseyApplication = new ResourceConfig()
+    private static final ResourceConfig jerseyApplication = new ResourceConfig()
                                                              .packages("com.amazonaws.serverless.sample.jersey")
                                                              .register(JacksonFeature.class);
-    private final JerseyLambdaContainerHandler handler
+    private static final JerseyLambdaContainerHandler handler
             = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication);
 
     public StreamLambdaHandler() {
@@ -33,13 +32,7 @@ public StreamLambdaHandler() {
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
 
-        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
-
-        AwsProxyResponse resp = handler.proxy(request, context);
-
-        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
-
-        System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers()));
+        handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
         outputStream.close();
diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
index c30c895e..f8a53240 100644
--- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
+++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
@@ -2,7 +2,6 @@
 
 
 import com.amazonaws.serverless.exceptions.ContainerInitializationException;
-import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
 import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
@@ -20,7 +19,6 @@
 
 
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private boolean isInitialized = false;
     private SparkLambdaContainerHandler handler;
     private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
 
@@ -32,8 +30,7 @@ public StreamLambdaHandler() {
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-        if (!isInitialized) {
-            isInitialized = true;
+        if (handler == null) {
             try {
                 handler = SparkLambdaContainerHandler.getAwsProxyHandler();
                 SparkResources.defineResources();
@@ -44,13 +41,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co
             }
         }
 
-        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
-
-        AwsProxyResponse resp = handler.proxy(request, context);
-
-        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
-
-        System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers()));
+        handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
         outputStream.close();
diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
index 790fc13c..96a71105 100644
--- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
+++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
@@ -2,7 +2,6 @@
 
 
 import com.amazonaws.serverless.exceptions.ContainerInitializationException;
-import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
 import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
@@ -40,13 +39,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co
             }
         }
 
-        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
-
-        AwsProxyResponse resp = handler.proxy(request, context);
-
-        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
-
-        System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers()));
+        handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
         outputStream.close();
diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
index abc03895..507a5238 100644
--- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
+++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
@@ -2,7 +2,6 @@
 
 
 import com.amazonaws.serverless.exceptions.ContainerInitializationException;
-import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
 import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
@@ -40,13 +39,7 @@ public void handleRequest(InputStream inputStream, OutputStream outputStream, Co
             }
         }
 
-        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
-
-        AwsProxyResponse resp = handler.proxy(request, context);
-
-        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
-
-        System.err.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(Timer.getTimers()));
+        handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
         outputStream.close();

From 2b962c89a15d4e5df54b2677578420100708eac8 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Sun, 11 Feb 2018 08:12:18 -0800
Subject: [PATCH 0103/1214] Updated samples to use a static block to declared
 the handler (#109) and moved them all to the new streamProxy method (#118).

---
 README.md                                     | 27 ++++++++-----------
 .../sample/jersey/StreamLambdaHandler.java    |  1 -
 .../sample/spark/StreamLambdaHandler.java     | 27 +++++++++----------
 .../sample/spring/StreamLambdaHandler.java    | 25 +++++++----------
 .../springboot/StreamLambdaHandler.java       | 25 +++++++----------
 5 files changed, 43 insertions(+), 62 deletions(-)

diff --git a/README.md b/README.md
index b25ff061..752dca60 100644
--- a/README.md
+++ b/README.md
@@ -13,27 +13,22 @@ Below is the most basic AWS Lambda handler example that launches a Spring applic
 
 ```java
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private SpringLambdaContainerHandler handler;
-    private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
+    private static SpringLambdaContainerHandler handler;
+    static {
+        try {
+            handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class);
+        } catch (ContainerInitializationException e) {
+            // if we fail here. We re-throw the exception to force another cold start
+            e.printStackTrace();
+            throw new RuntimeException("Could not initialize Spring framework", e);
+        }
+    }
 
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-        if (handler == null) {
-            try {
-                handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class);
-            } catch (ContainerInitializationException e) {
-                log.error("Cannot initialize Spring container", e);
-                outputStream.close();
-                throw new RuntimeException(e);
-            }
-        }
-
-        AwsProxyRequest request = LambdaContainerHandler.getObjectMapper().readValue(inputStream, AwsProxyRequest.class);
-
-        AwsProxyResponse resp = handler.proxy(request, context);
+        handler.proxyStream(inputStream, outputStream, context);
 
-        LambdaContainerHandler.getObjectMapper().writeValue(outputStream, resp);
         // just in case it wasn't closed by the mapper
         outputStream.close();
     }
diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
index 860a4157..96276958 100644
--- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
+++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java
@@ -31,7 +31,6 @@ public StreamLambdaHandler() {
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-
         handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
index f8a53240..a5f2f110 100644
--- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
+++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java
@@ -9,8 +9,6 @@
 import com.amazonaws.services.lambda.runtime.Context;
 import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import spark.Spark;
 
 import java.io.IOException;
@@ -19,8 +17,18 @@
 
 
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private SparkLambdaContainerHandler handler;
-    private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
+    private static SparkLambdaContainerHandler handler;
+    static {
+        try {
+            handler = SparkLambdaContainerHandler.getAwsProxyHandler();
+            SparkResources.defineResources();
+            Spark.awaitInitialization();
+        } catch (ContainerInitializationException e) {
+            // if we fail here. We re-throw the exception to force another cold start
+            e.printStackTrace();
+            throw new RuntimeException("Could not initialize Spark container", e);
+        }
+    }
 
     public StreamLambdaHandler() {
         // we enable the timer for debugging. This SHOULD NOT be enabled in production.
@@ -30,17 +38,6 @@ public StreamLambdaHandler() {
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-        if (handler == null) {
-            try {
-                handler = SparkLambdaContainerHandler.getAwsProxyHandler();
-                SparkResources.defineResources();
-                Spark.awaitInitialization();
-            } catch (ContainerInitializationException e) {
-                log.error("Cannot initialize Spark application", e);
-                return;
-            }
-        }
-
         handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
index 96a71105..11fddada 100644
--- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
+++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java
@@ -9,17 +9,22 @@
 import com.amazonaws.services.lambda.runtime.Context;
 import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
 
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private SpringLambdaContainerHandler handler;
-    private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
+    private static SpringLambdaContainerHandler handler;
+    static {
+        try {
+            handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class);
+        } catch (ContainerInitializationException e) {
+            // if we fail here. We re-throw the exception to force another cold start
+            e.printStackTrace();
+            throw new RuntimeException("Could not initialize Spring framework", e);
+        }
+    }
 
     public StreamLambdaHandler() {
         // we enable the timer for debugging. This SHOULD NOT be enabled in production.
@@ -29,16 +34,6 @@ public StreamLambdaHandler() {
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-        if (handler == null) {
-            try {
-                handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class);
-            } catch (ContainerInitializationException e) {
-                log.error("Cannot initialize Spring container", e);
-                outputStream.close();
-                throw new RuntimeException(e);
-            }
-        }
-
         handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper
diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
index 507a5238..1fc50549 100644
--- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
+++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java
@@ -9,17 +9,22 @@
 import com.amazonaws.services.lambda.runtime.Context;
 import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
 
 public class StreamLambdaHandler implements RequestStreamHandler {
-    private SpringBootLambdaContainerHandler handler;
-    private Logger log = LoggerFactory.getLogger(StreamLambdaHandler.class);
+    private static SpringBootLambdaContainerHandler handler;
+    static {
+        try {
+            handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class);
+        } catch (ContainerInitializationException e) {
+            // if we fail here. We re-throw the exception to force another cold start
+            e.printStackTrace();
+            throw new RuntimeException("Could not initialize Spring Boot application", e);
+        }
+    }
 
     public StreamLambdaHandler() {
         // we enable the timer for debugging. This SHOULD NOT be enabled in production.
@@ -29,16 +34,6 @@ public StreamLambdaHandler() {
     @Override
     public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
             throws IOException {
-        if (handler == null) {
-            try {
-                handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class);
-            } catch (ContainerInitializationException e) {
-                log.error("Cannot initialize Spring container", e);
-                outputStream.close();
-                throw new RuntimeException(e);
-            }
-        }
-
         handler.proxyStream(inputStream, outputStream, context);
 
         // just in case it wasn't closed by the mapper

From 498e98985a1f2cb9f782cdb53d96f7f26e896987 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Sun, 11 Feb 2018 08:30:41 -0800
Subject: [PATCH 0104/1214] Added unit test for Jersey principal injection.

---
 .../internal/testutils/AwsProxyRequestBuilder.java |  4 ++++
 .../proxy/jersey/EchoJerseyResource.java           | 14 ++++++++++++++
 .../proxy/jersey/JerseyAwsProxyTest.java           | 11 +++++++++++
 3 files changed, 29 insertions(+)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
index 6b88074c..60a028aa 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
@@ -168,6 +168,10 @@ public AwsProxyRequestBuilder authorizerPrincipal(String principal) {
             this.request.getRequestContext().setAuthorizer(new ApiGatewayAuthorizerContext());
         }
         this.request.getRequestContext().getAuthorizer().setPrincipalId(principal);
+        if (this.request.getRequestContext().getAuthorizer().getClaims() == null) {
+            this.request.getRequestContext().getAuthorizer().setClaims(new CognitoAuthorizerClaims());
+        }
+        this.request.getRequestContext().getAuthorizer().getClaims().setSubject(principal);
         return this;
     }
 
diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java
index 86bac4f3..d3681b91 100644
--- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java
+++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java
@@ -25,6 +25,7 @@
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
 import javax.ws.rs.core.UriInfo;
 import java.util.Enumeration;
 import java.util.Random;
@@ -37,6 +38,9 @@ public class EchoJerseyResource {
     public static final String SERVLET_RESP_HEADER_KEY = "X-HttpServletResponse";
     public static final String EXCEPTION_MESSAGE = "Fake exception";
 
+    @Context
+    SecurityContext securityCtx;
+
     @Path("/headers") @GET
     @Produces(MediaType.APPLICATION_JSON)
     public MapResponseModel echoHeaders(@Context ContainerRequestContext context) {
@@ -48,6 +52,16 @@ public MapResponseModel echoHeaders(@Context ContainerRequestContext context) {
         return headers;
     }
 
+    @Path("/security-context") @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public SingleValueModel getPrincipal() {
+        SingleValueModel output = new SingleValueModel();
+        if (securityCtx != null) {
+            output.setValue(securityCtx.getUserPrincipal().getName());
+        }
+        return output;
+    }
+
     @Path("/servlet-headers") @GET
     @Produces(MediaType.APPLICATION_JSON)
     public MapResponseModel echoServletHeaders(@Context HttpServletRequest context) {
diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
index 055d6313..6945a102 100644
--- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
+++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java
@@ -54,6 +54,7 @@ public class JerseyAwsProxyTest {
     private static final String QUERY_STRING_KEY = "identifier";
     private static final String QUERY_STRING_NON_ENCODED_VALUE = "Space Test";
     private static final String QUERY_STRING_ENCODED_VALUE = "Space%20Test";
+    private static final String USER_PRINCIPAL = "user1";
 
 
     private static ObjectMapper objectMapper = new ObjectMapper();
@@ -302,6 +303,16 @@ public void stripBasePath_route_shouldReturn404() {
         handler.stripBasePath("");
     }
 
+    @Test
+    public void securityContext_injectPrincipal_expectPrincipalName() {
+        AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/security-context", "GET")
+                                          .authorizerPrincipal(USER_PRINCIPAL).build();
+
+        AwsProxyResponse resp = handler.proxy(request, lambdaContext);
+        assertEquals(200, resp.getStatusCode());
+        validateSingleValueModel(resp, USER_PRINCIPAL);
+    }
+
     private void validateMapResponseModel(AwsProxyResponse output) {
         validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE);
     }

From 7dbb3f2a015dee17923ec58ec9e0d490135d9b8b Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Tue, 13 Feb 2018 11:17:53 -0800
Subject: [PATCH 0105/1214] Performance improvements all around. This addresses
 #99.

---
 .../internal/LambdaContainerHandler.java      | 24 +++++++---
 .../ApacheCombinedServletLogFormatter.java    | 42 +++++++++++++----
 .../servlet/AwsHttpServletRequest.java        |  7 ++-
 .../AwsLambdaServletContainerHandler.java     |  3 +-
 .../servlet/AwsProxyHttpServletRequest.java   | 47 ++++++++++---------
 .../AwsProxyHttpServletRequestFormTest.java   | 16 -------
 .../proxy/jersey/JerseyHandlerFilter.java     | 39 +++++++++++----
 .../jersey/JerseyLambdaContainerHandler.java  | 17 +++----
 .../spark/SparkLambdaContainerHandler.java    |  4 +-
 .../proxy/spark/InitExceptionHandlerTest.java |  2 +
 .../SpringBootLambdaContainerHandler.java     |  4 +-
 .../spring/SpringLambdaContainerHandler.java  |  5 +-
 12 files changed, 132 insertions(+), 78 deletions(-)

diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
index 9e268d2f..23c37e6e 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
@@ -25,6 +25,8 @@
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.fasterxml.jackson.databind.ObjectWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,20 +64,22 @@ public abstract class LambdaContainerHandler securityContextWriter;
     private ExceptionHandler exceptionHandler;
     private Class requestTypeClass;
+    private Class responseTypeClass;
 
     protected Context lambdaContext;
     private LogFormatter logFormatter;
 
     private Logger log = LoggerFactory.getLogger(LambdaContainerHandler.class);
 
-
+    private ObjectReader objectReader;
+    private ObjectWriter objectWriter;
 
     //-------------------------------------------------------------
     // Variables - Private - Static
     //-------------------------------------------------------------
 
     private static ContainerConfig config = ContainerConfig.defaultConfig();
-    private static volatile ObjectMapper objectMapper;
+    private static ObjectMapper objectMapper = new ObjectMapper();
 
 
 
@@ -84,12 +88,14 @@ public abstract class LambdaContainerHandler requestClass,
+                                     Class responseClass,
                                      RequestReader requestReader,
                                      ResponseWriter responseWriter,
                                      SecurityContextWriter securityContextWriter,
                                      ExceptionHandler exceptionHandler) {
         log.info("Starting Lambda Container Handler");
         requestTypeClass = requestClass;
+        responseTypeClass = responseClass;
         this.requestReader = requestReader;
         this.responseWriter = responseWriter;
         this.securityContextWriter = securityContextWriter;
@@ -113,9 +119,6 @@ protected abstract void handleRequest(ContainerRequestType containerRequest, Con
     //-------------------------------------------------------------
 
     public static ObjectMapper getObjectMapper() {
-        if (objectMapper == null) {
-            objectMapper = new ObjectMapper();
-        }
         return objectMapper;
     }
 
@@ -188,10 +191,17 @@ public void proxyStream(InputStream input, OutputStream output, Context context)
             throws IOException {
 
         try {
-            RequestType request = getObjectMapper().readValue(input, requestTypeClass);
+            if (objectReader == null) {
+                objectReader = getObjectMapper().readerFor(requestTypeClass);
+            }
+            RequestType request = objectReader.readValue(input);
             ResponseType resp = proxy(request, context);
 
-            getObjectMapper().writeValue(output, resp);
+            if (objectWriter == null) {
+                objectWriter = getObjectMapper().writerFor(responseTypeClass);
+            }
+
+            objectWriter.writeValue(output, resp);
         } catch (JsonParseException e) {
             log.error("Error while parsing request object stream", e);
             getObjectMapper().writeValue(output, exceptionHandler.handle(e));
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
index 66b8fc1b..37895dd3 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
@@ -10,13 +10,19 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.SecurityContext;
 
-import java.text.SimpleDateFormat;
-import java.time.Instant;
-import java.util.Calendar;
-import java.util.Date;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
 import java.util.Locale;
 
 import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
+import static java.time.temporal.ChronoField.DAY_OF_MONTH;
+import static java.time.temporal.ChronoField.HOUR_OF_DAY;
+import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
+import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
+import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
+import static java.time.temporal.ChronoField.YEAR;
 
 
 /**
@@ -27,10 +33,30 @@
  */
 public class ApacheCombinedServletLogFormatter
         implements LogFormatter {
-    SimpleDateFormat dateFormat;
+    DateTimeFormatter dateFormat;
 
     public ApacheCombinedServletLogFormatter() {
-        dateFormat = new SimpleDateFormat("[dd/MM/yyyy:hh:mm:ss Z]");
+        dateFormat = new DateTimeFormatterBuilder()
+            .parseCaseInsensitive()
+            .appendLiteral("[")
+            .appendValue(DAY_OF_MONTH, 2)
+            .appendLiteral("/")
+            .appendValue(MONTH_OF_YEAR, 2)
+            .appendLiteral("/")
+            .appendValue(YEAR, 4)
+            .appendLiteral(":")
+            .appendValue(HOUR_OF_DAY, 2)
+            .appendLiteral(":")
+            .appendValue(MINUTE_OF_HOUR, 2)
+            .appendLiteral(":")
+            .appendValue(SECOND_OF_MINUTE, 2)
+            .optionalStart()
+            .appendOffset("+HHMM", "Z")
+            .optionalEnd()
+            .appendLiteral("]")
+            .toFormatter();
+        //DateTimeFormatter.ofPattern("dd/MM/yyyy:hh:mm:ss Z");
+        //DateTimeFormatter.BASIC_ISO_DATE
     }
 
     @Override
@@ -65,9 +91,9 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
 
         // %t
         if (gatewayContext != null) {
-            logLineBuilder.append(dateFormat.format(Date.from(Instant.ofEpochMilli(gatewayContext.getRequestTimeEpoch()))));
+            logLineBuilder.append(dateFormat.format(LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC)));
         } else {
-            logLineBuilder.append(dateFormat.format(Calendar.getInstance().getTime()));
+            logLineBuilder.append(dateFormat.format(LocalDateTime.now()));
         }
         logLineBuilder.append(" ");
 
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index 925ce973..3e447c73 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -74,6 +74,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
     private Map attributes;
     private ServletContext servletContext;
     private AwsHttpSession session;
+    private String queryString;
 
     protected DispatcherType dispatcherType;
 
@@ -290,8 +291,11 @@ protected String generateQueryString(Map parameters) {
         if (parameters == null || parameters.size() == 0) {
             return null;
         }
+        if (queryString != null) {
+            return queryString;
+        }
 
-        return parameters.keySet().stream()
+        queryString =  parameters.keySet().stream()
                 .map(key -> {
                     String newKey = key;
                     String newValue = parameters.get(key);
@@ -310,6 +314,7 @@ protected String generateQueryString(Map parameters) {
                     return newKey + "=" + newValue;
                 })
                 .collect(Collectors.joining("&"));
+        return queryString;
     }
 
 
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index 4839ce7d..cf1f80ff 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -70,11 +70,12 @@ public abstract class AwsLambdaServletContainerHandler requestTypeClass,
+                                     Class responseTypeClass,
                                      RequestReader requestReader,
                                      ResponseWriter responseWriter,
                                      SecurityContextWriter securityContextWriter,
                                      ExceptionHandler exceptionHandler) {
-        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         // set the default log formatter for servlet implementations
         setLogFormatter(new ApacheCombinedServletLogFormatter<>());
     }
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
index 9c8a19ed..86a9d314 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
@@ -102,9 +102,6 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd
         this.request = awsProxyRequest;
         this.securityContext = awsSecurityContext;
         this.config = config;
-
-        this.urlEncodedFormParameters = getFormUrlEncodedParametersMap();
-        this.multipartFormParameters = getMultipartFormParametersMap();
     }
 
 
@@ -295,14 +292,14 @@ public void logout()
     @Override
     public Collection getParts()
             throws IOException, ServletException {
-        return multipartFormParameters.values();
+        return getMultipartFormParametersMap().values();
     }
 
 
     @Override
     public Part getPart(String s)
             throws IOException, ServletException {
-        return multipartFormParameters.get(s);
+        return getMultipartFormParametersMap().get(s);
     }
 
 
@@ -441,7 +438,7 @@ public Enumeration getParameterNames() {
         if (request.getQueryStringParameters() != null) {
             paramNames.addAll(request.getQueryStringParameters().keySet());
         }
-        paramNames.addAll(urlEncodedFormParameters.keySet());
+        paramNames.addAll(getFormUrlEncodedParametersMap().keySet());
         return Collections.enumeration(paramNames);
     }
 
@@ -473,10 +470,7 @@ public String[] getParameterValues(String s) {
     public Map getParameterMap() {
         Map output = new HashMap<>();
 
-        Map> params = urlEncodedFormParameters;
-        if (params == null) {
-            params = new HashMap<>();
-        }
+        Map> params = getFormUrlEncodedParametersMap();
 
         if (request.getQueryStringParameters() != null) {
             for (Map.Entry entry : request.getQueryStringParameters().entrySet()) {
@@ -655,7 +649,7 @@ private String getQueryStringParameterCaseInsensitive(String key) {
 
 
     private String[] getFormBodyParameterCaseInsensitive(String key) {
-        List values = urlEncodedFormParameters.get(key);
+        List values = getFormUrlEncodedParametersMap().get(key);
         if (values != null) {
             String[] valuesArray = new String[values.size()];
             valuesArray = values.toArray(valuesArray);
@@ -668,11 +662,15 @@ private String[] getFormBodyParameterCaseInsensitive(String key) {
 
     @SuppressFBWarnings("FILE_UPLOAD_FILENAME")
     private Map getMultipartFormParametersMap() {
+        if (multipartFormParameters != null) {
+            return multipartFormParameters;
+        }
         if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type
-            return new HashMap<>();
+            multipartFormParameters = new HashMap<>();
+            return multipartFormParameters;
         }
         Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS");
-        Map output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+        multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
 
         ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
         try {
@@ -694,14 +692,14 @@ private Map getMultipartFormParametersMap() {
                     }
                 }
 
-                output.put(item.getFieldName(), newPart);
+                multipartFormParameters.put(item.getFieldName(), newPart);
             }
         } catch (FileUploadException e) {
             Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS");
             log.error("Could not read multipart upload file", e);
         }
         Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS");
-        return output;
+        return multipartFormParameters;
     }
 
 
@@ -723,31 +721,36 @@ private String cleanUri(String uri) {
 
 
     private Map> getFormUrlEncodedParametersMap() {
+        if (urlEncodedFormParameters != null) {
+            return urlEncodedFormParameters;
+        }
         String contentType = getContentType();
         if (contentType == null) {
-            return new HashMap<>();
+            urlEncodedFormParameters = new HashMap<>();
+            return urlEncodedFormParameters;
         }
         if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase(Locale.ENGLISH).equals("post")) {
-            return new HashMap<>();
+            urlEncodedFormParameters = new HashMap<>();
+            return urlEncodedFormParameters;
         }
         Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS");
         String rawBodyContent = request.getBody();
 
-        Map> output = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+        urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
         for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) {
             String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR);
             if (parameterKeyValue.length < 2) {
                 continue;
             }
             List values = new ArrayList<>();
-            if (output.containsKey(parameterKeyValue[0])) {
-                values = output.get(parameterKeyValue[0]);
+            if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) {
+                values = urlEncodedFormParameters.get(parameterKeyValue[0]);
             }
             values.add(decodeValueIfEncoded(parameterKeyValue[1]));
-            output.put(decodeValueIfEncoded(parameterKeyValue[0]), values);
+            urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values);
         }
         Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS");
-        return output;
+        return urlEncodedFormParameters;
     }
 
 
diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java
index f49927d4..71d75033 100644
--- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java
+++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java
@@ -82,22 +82,6 @@ public void postForm_getParts_parsing() {
         }
     }
 
-    @Test
-    public void getForm_getParts_noPartsInGet() {
-        try {
-            AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "GET")
-                                                   .header(MULTIPART_FORM_DATA.getContentType().getName(), MULTIPART_FORM_DATA.getContentType().getValue())
-                                                   .body(IOUtils.toString(MULTIPART_FORM_DATA.getContent()))
-                                                   .build();
-
-            HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null);
-            assertNotNull(request.getParts());
-            assertEquals(0, request.getParts().size());
-        } catch (IOException | ServletException e) {
-            fail(e.getMessage());
-        }
-    }
-
     @Test
     public void multipart_getParts_binary() {
         try {
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
index ee682dbf..3b83c11d 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
@@ -29,7 +29,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Enumeration;
 import java.util.Locale;
 import java.util.concurrent.CountDownLatch;
@@ -40,6 +39,12 @@
 import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY;
 
 
+/**
+ * Servlet filter class that calls Jersey's ApplicationHandler. Given a Jax RS Application object, this class
+ * initializes a Jersey {@link ApplicationHandler} and calls its handle method. Requests are transformed
+ * to ContainerRequest objects by the {@link #servletRequestToContainerRequest(ServletRequest)} method.
+ * Jersey responses are written directly to the ServletResponse by the {@link JerseyServletResponseWriter}.
+ */
 public class JerseyHandlerFilter implements Filter, Container {
     public static final String JERSEY_SERVLET_REQUEST_PROPERTY = "com.amazonaws.serverless.jersey.servletRequest";
     public static final String JERSEY_SERVLET_RESPONSE_PROPERTY = "com.amazonaws.serverless.jersey.servletResponse";
@@ -47,13 +52,20 @@ public class JerseyHandlerFilter implements Filter, Container {
     private ApplicationHandler jersey;
     private Application app;
     private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class);
+    private URI basePathUri;
 
+
+    /**
+     * Constructs a new handler filter with a Jax RS application object.
+     * @param jaxApplication
+     */
     JerseyHandlerFilter(Application jaxApplication) {
         Timer.start("JERSEY_FILTER_CONSTRUCTOR");
         app = jaxApplication;
 
         jersey = new ApplicationHandler(app);
         jersey.onStartup(this);
+        basePathUri = URI.create("/");
         Timer.stop("JERSEY_FILTER_CONSTRUCTOR");
     }
 
@@ -92,20 +104,27 @@ public void destroy() {
         jersey.onShutdown(this);
     }
 
+
+    /**
+     * Given a ServletRequest generates the corresponding Jersey ContainerRequest object. The request URI is
+     * built from the request's getPathInfo() method. The container request also contains the
+     * API Gateway context, stage variables, and Lambda context properties. The original servlet request is
+     * also embedded in a property of the container request to allow injection by the
+     * {@link com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory}.
+     * @param request The incoming servlet request
+     * @return A populated ContainerRequest object.
+     * @throws RuntimeException if we could not read the servlet request input stream.
+     */
     // suppressing warnings because I expect headers and query strings to be checked by the underlying
     // servlet implementation
     @SuppressFBWarnings({ "SERVLET_HEADER", "SERVLET_QUERY_STRING" })
     private ContainerRequest servletRequestToContainerRequest(ServletRequest request) {
         Timer.start("JERSEY_SERVLET_REQUEST_TO_CONTAINER");
-        URI requestPathUri;
-        String basePath = "/";
         HttpServletRequest servletRequest = (HttpServletRequest)request;
 
         UriBuilder uriBuilder = UriBuilder.fromPath(servletRequest.getPathInfo());
         uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString()));
 
-        requestPathUri = uriBuilder.build();
-
         PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate();
         apiGatewayProperties.setProperty(API_GATEWAY_CONTEXT_PROPERTY, servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY));
         apiGatewayProperties.setProperty(API_GATEWAY_STAGE_VARS_PROPERTY, servletRequest.getAttribute(API_GATEWAY_STAGE_VARS_PROPERTY));
@@ -113,8 +132,8 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
         apiGatewayProperties.setProperty(JERSEY_SERVLET_REQUEST_PROPERTY, servletRequest);
 
         ContainerRequest requestContext = new ContainerRequest(
-                URI.create(basePath), // for routing within Jersey we always assume the base path is "/"
-                requestPathUri,
+                basePathUri,
+                uriBuilder.build(),
                 servletRequest.getMethod().toUpperCase(Locale.ENGLISH),
                 (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY),
                 apiGatewayProperties);
@@ -127,13 +146,15 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request
             }
         } catch (IOException e) {
             log.error("Could not read input stream from request", e);
+            throw new RuntimeException("Could not read request input stream", e);
         }
 
         Enumeration headerNames = servletRequest.getHeaderNames();
-
+        
         while (headerNames.hasMoreElements()) {
             String headerKey = headerNames.nextElement();
-            requestContext.header(headerKey, servletRequest.getHeader(headerKey));
+            //requestContext.header(headerKey, servletRequest.getHeader(headerKey));
+            requestContext.getHeaders().add(headerKey, servletRequest.getHeader(headerKey));
         }
         Timer.stop("JERSEY_SERVLET_REQUEST_TO_CONTAINER");
         return requestContext;
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
index 3caef5fe..cac0debd 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
@@ -16,7 +16,6 @@
 import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler;
 import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter;
 import com.amazonaws.serverless.proxy.ExceptionHandler;
-import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
 import com.amazonaws.serverless.proxy.RequestReader;
 import com.amazonaws.serverless.proxy.ResponseWriter;
 import com.amazonaws.serverless.proxy.SecurityContextWriter;
@@ -30,10 +29,6 @@
 import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
 
 import com.amazonaws.services.lambda.runtime.Context;
-import org.glassfish.jersey.server.ApplicationHandler;
-import org.glassfish.jersey.server.ContainerRequest;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spi.Container;
 
 import javax.servlet.DispatcherType;
 import javax.servlet.FilterRegistration;
@@ -73,10 +68,8 @@ public class JerseyLambdaContainerHandler extends Aws
     // Variables - Private
     //-------------------------------------------------------------
 
-    // The Jersey application object
-    private Application jaxRsApplication;
-
     private JerseyHandlerFilter jerseyFilter;
+
     // tracker for the first request
     private boolean initialized;
 
@@ -96,6 +89,7 @@ public class JerseyLambdaContainerHandler extends Aws
      */
     public static JerseyLambdaContainerHandler getAwsProxyHandler(Application jaxRsApplication) {
         return new JerseyLambdaContainerHandler<>(AwsProxyRequest.class,
+                                                  AwsProxyResponse.class,
                                                   new AwsProxyHttpServletRequestReader(),
                                                   new AwsProxyHttpServletResponseWriter(),
                                                   new AwsProxySecurityContextWriter(),
@@ -112,6 +106,7 @@ public static JerseyLambdaContainerHandler ge
      * Private constructor for a LambdaContainer. Sets the application object, sets the ApplicationHandler,
      * and initializes the application using the onStartup method.
      * @param requestTypeClass The class for the expected event type
+     * @param responseTypeClass The class for the output type
      * @param requestReader A request reader instance
      * @param responseWriter A response writer instance
      * @param securityContextWriter A security context writer object
@@ -119,17 +114,17 @@ public static JerseyLambdaContainerHandler ge
      * @param jaxRsApplication The JaxRs application
      */
     public JerseyLambdaContainerHandler(Class requestTypeClass,
+                                        Class responseTypeClass,
                                         RequestReader requestReader,
                                         ResponseWriter responseWriter,
                                         SecurityContextWriter securityContextWriter,
                                         ExceptionHandler exceptionHandler,
                                         Application jaxRsApplication) {
 
-        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("JERSEY_CONTAINER_CONSTRUCTOR");
-        this.jaxRsApplication = jaxRsApplication;
         this.initialized = false;
-        this.jerseyFilter = new JerseyHandlerFilter(this.jaxRsApplication);
+        this.jerseyFilter = new JerseyHandlerFilter(jaxRsApplication);
         Timer.stop("JERSEY_CONTAINER_CONSTRUCTOR");
     }
 
diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
index b4d6a53a..c4920831 100644
--- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java
@@ -107,6 +107,7 @@ public class SparkLambdaContainerHandler
     public static SparkLambdaContainerHandler getAwsProxyHandler()
             throws ContainerInitializationException {
         return new SparkLambdaContainerHandler<>(AwsProxyRequest.class,
+                                                 AwsProxyResponse.class,
                                                  new AwsProxyHttpServletRequestReader(),
                                                  new AwsProxyHttpServletResponseWriter(),
                                                  new AwsProxySecurityContextWriter(),
@@ -120,13 +121,14 @@ public static SparkLambdaContainerHandler get
 
 
     public SparkLambdaContainerHandler(Class requestTypeClass,
+                                       Class responseTypeClass,
                                        RequestReader requestReader,
                                        ResponseWriter responseWriter,
                                        SecurityContextWriter securityContextWriter,
                                        ExceptionHandler exceptionHandler,
                                        LambdaEmbeddedServerFactory embeddedServerFactory)
             throws ContainerInitializationException {
-        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPARK_CONTAINER_HANDLER_CONSTRUCTOR");
 
         EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, embeddedServerFactory);
diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
index 28f1e808..fb39d9b6 100644
--- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
+++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java
@@ -7,6 +7,7 @@
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader;
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
 import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer;
 import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory;
 
@@ -39,6 +40,7 @@ public void initException_mockException_expectHandlerToRun() {
                     .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null));
             LambdaEmbeddedServerFactory serverFactory = new LambdaEmbeddedServerFactory(embeddedServer);
             new SparkLambdaContainerHandler<>(AwsProxyRequest.class,
+                                              AwsProxyResponse.class,
                                               new AwsProxyHttpServletRequestReader(),
                                               new AwsProxyHttpServletResponseWriter(),
                                               new AwsProxySecurityContextWriter(),
diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
index 6e8edc87..df0fa148 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java
@@ -67,6 +67,7 @@ public static SpringBootLambdaContainerHandler(
                 AwsProxyRequest.class,
+                AwsProxyResponse.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -87,13 +88,14 @@ public static SpringBootLambdaContainerHandler requestTypeClass,
+                                            Class responseTypeClass,
                                             RequestReader requestReader,
                                             ResponseWriter responseWriter,
                                             SecurityContextWriter securityContextWriter,
                                             ExceptionHandler exceptionHandler,
                                             Class springBootInitializer)
             throws ContainerInitializationException {
-        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR");
         this.springBootInitializer = springBootInitializer;
         Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR");
diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
index 6d7ef180..531143e8 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
@@ -56,6 +56,7 @@ public static SpringLambdaContainerHandler ge
 
         return new SpringLambdaContainerHandler<>(
                 AwsProxyRequest.class,
+                AwsProxyResponse.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -74,6 +75,7 @@ public static SpringLambdaContainerHandler ge
             throws ContainerInitializationException {
         return new SpringLambdaContainerHandler<>(
                 AwsProxyRequest.class,
+                AwsProxyResponse.class,
                 new AwsProxyHttpServletRequestReader(),
                 new AwsProxyHttpServletResponseWriter(),
                 new AwsProxySecurityContextWriter(),
@@ -93,13 +95,14 @@ public static SpringLambdaContainerHandler ge
      * @throws ContainerInitializationException
      */
     public SpringLambdaContainerHandler(Class requestTypeClass,
+                                        Class responseTypeClass,
                                         RequestReader requestReader,
                                         ResponseWriter responseWriter,
                                         SecurityContextWriter securityContextWriter,
                                         ExceptionHandler exceptionHandler,
                                         ConfigurableWebApplicationContext applicationContext)
             throws ContainerInitializationException {
-        super(requestTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
+        super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR");
         initializer = new LambdaSpringApplicationInitializer(applicationContext);
         Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR");

From cbc823103bcc38f724da3dfe71656e3bc455bf3f Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Tue, 13 Feb 2018 12:07:10 -0800
Subject: [PATCH 0106/1214] Addressing issue reported in #117 and added a unit
 test for it.

---
 .../LambdaSpringApplicationInitializer.java   |  2 +-
 .../spring/SpringLambdaContainerHandler.java  | 21 +++++++++++++++
 .../proxy/spring/SpringAwsProxyTest.java      | 15 +++++++++++
 .../spring/echoapp/EchoSpringAppConfig.java   |  2 ++
 .../spring/echoapp/RestControllerAdvice.java  | 27 +++++++++++++++++++
 5 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/RestControllerAdvice.java

diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java
index 26914ae0..615ddedc 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java
@@ -115,7 +115,7 @@ public void dispatch(HttpServletRequest request, HttpServletResponse response)
      * Gets the initialized Spring dispatcher servlet instance.
      * @return The Spring dispatcher servlet
      */
-    public Servlet getDispatcherServlet() {
+    public DispatcherServlet getDispatcherServlet() {
         return dispatcherServlet;
     }
 
diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
index 531143e8..3c9eae71 100644
--- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
+++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java
@@ -108,15 +108,36 @@ public SpringLambdaContainerHandler(Class requestTypeClass,
         Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR");
     }
 
+
+    /**
+     * Asks the custom web application initializer to refresh the Spring context.
+     * @param refreshContext true if the context should be refreshed
+     */
     public void setRefreshContext(boolean refreshContext) {
         this.initializer.setRefreshContext(refreshContext);
     }
 
+
+    /**
+     * Returns the custom web application initializer used by the object. The custom application initializer gives you access
+     * to the dispatcher servlet.
+     * @return The instance of the custom {@link org.springframework.web.WebApplicationInitializer}
+     */
+    public LambdaSpringApplicationInitializer getApplicationInitializer() {
+        return initializer;
+    }
+
     @Override
     protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) {
         return new AwsHttpServletResponse(request, latch);
     }
 
+
+    /**
+     * Activates the given Spring profiles in the application.
+     * @param profiles A number of spring profiles
+     * @throws ContainerInitializationException if the initializer is not set yet.
+     */
     public void activateSpringProfiles(String... profiles) throws ContainerInitializationException {
         if (initializer == null) {
             throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null);
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java
index 1bcd6bb5..5c4fdcbc 100644
--- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java
@@ -7,6 +7,7 @@
 import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
 import com.amazonaws.serverless.proxy.spring.echoapp.EchoResource;
 import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig;
+import com.amazonaws.serverless.proxy.spring.echoapp.RestControllerAdvice;
 import com.amazonaws.serverless.proxy.spring.echoapp.UnauthenticatedFilter;
 import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel;
 import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel;
@@ -55,6 +56,20 @@ public void clearServletContextCache() {
         AwsServletContext.clearServletContextCache();
     }
 
+    @Test
+    public void controllerAdvice_invalidPath_returnAdvice() {
+        AwsProxyRequest request = new AwsProxyRequestBuilder("/echo2", "GET")
+                                          .json()
+                                          .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+                                          .build();
+
+        AwsProxyResponse output = handler.proxy(request, lambdaContext);
+        assertNotNull(output);
+        assertEquals(404, output.getStatusCode());
+        validateSingleValueModel(output, RestControllerAdvice.ERROR_MESSAGE);
+
+    }
+
     @Test
     public void headers_getHeaders_echo() {
         AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET")
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java
index 1f068f8f..68d1fa27 100644
--- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java
@@ -36,6 +36,8 @@ public SpringLambdaContainerHandler springLambdaContainerHandler() throws Contai
             // update the registration to map to a path
             registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*");
             // servlet name mappings are disabled and will throw an exception
+
+            handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true);
         });
 
         return handler;
diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/RestControllerAdvice.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/RestControllerAdvice.java
new file mode 100644
index 00000000..c5e472a5
--- /dev/null
+++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/RestControllerAdvice.java
@@ -0,0 +1,27 @@
+package com.amazonaws.serverless.proxy.spring.echoapp;
+
+
+import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+
+@ControllerAdvice
+@RequestMapping(produces = "application/json")
+@ResponseBody
+public class RestControllerAdvice {
+    public static final String ERROR_MESSAGE = "UnhadledPath";
+
+    @ExceptionHandler(NoHandlerFoundException.class)
+    public ResponseEntity unhandledPath(final NoHandlerFoundException e) {
+        SingleValueModel model = new SingleValueModel();
+        model.setValue(ERROR_MESSAGE);
+        return new ResponseEntity(model, HttpStatus.NOT_FOUND);
+    }
+}
\ No newline at end of file

From d57212b0f3089cd79635c2a57b39f420da767a09 Mon Sep 17 00:00:00 2001
From: sapessi 
Date: Tue, 13 Feb 2018 14:54:29 -0800
Subject: [PATCH 0107/1214] Upgrade to Jersey 2.26 and Jax RS 2.1. This
 addresses #108 and partly #95. Also switched from HK2's Factory objects to
 generic Suppliers for servlet injection.

---
 aws-serverless-java-container-core/pom.xml    |  2 +-
 aws-serverless-java-container-jersey/pom.xml  | 10 +++++++-
 .../proxy/jersey/JerseyHandlerFilter.java     |  3 ++-
 .../jersey/JerseyLambdaContainerHandler.java  | 22 +++++++++++++++++
 .../AwsProxyServletContextSupplier.java}      | 21 ++++++++--------
 .../AwsProxyServletRequestSupplier.java}      | 22 +++++++----------
 .../AwsProxyServletResponseSupplier.java}     | 24 +++++++------------
 .../proxy/jersey/EchoJerseyResource.java      |  3 +++
 .../proxy/jersey/JerseyAwsProxyTest.java      | 24 +------------------
 9 files changed, 66 insertions(+), 65 deletions(-)
 rename aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/{factory/AwsProxyServletContextFactory.java => suppliers/AwsProxyServletContextSupplier.java} (83%)
 rename aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/{factory/AwsProxyServletRequestFactory.java => suppliers/AwsProxyServletRequestSupplier.java} (76%)
 rename aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/{factory/AwsProxyServletResponseFactory.java => suppliers/AwsProxyServletResponseSupplier.java} (72%)

diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index 7fac3be7..2df571ba 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -16,7 +16,7 @@
 
     
         2.9.3
-        2.0.1
+        2.1
         3.1.0
     
 
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index bcdbdcbf..984930e0 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -15,7 +15,7 @@
     
 
     
-        2.25.1
+        2.26
     
 
     
@@ -39,6 +39,14 @@
             ${jersey.version}
         
 
+        
+            org.glassfish.jersey.inject
+            jersey-hk2
+            ${jersey.version}
+            true
+            test
+        
+
         
         
             commons-codec
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
index 3b83c11d..050b3013 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java
@@ -3,6 +3,7 @@
 
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
+import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.glassfish.jersey.internal.MapPropertiesDelegate;
@@ -110,7 +111,7 @@ public void destroy() {
      * built from the request's getPathInfo() method. The container request also contains the
      * API Gateway context, stage variables, and Lambda context properties. The original servlet request is
      * also embedded in a property of the container request to allow injection by the
-     * {@link com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory}.
+     * {@link AwsProxyServletRequestSupplier}.
      * @param request The incoming servlet request
      * @return A populated ContainerRequest object.
      * @throws RuntimeException if we could not read the servlet request input stream.
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
index cac0debd..f6bd3194 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java
@@ -25,13 +25,23 @@
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader;
 import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
 import com.amazonaws.serverless.proxy.internal.testutils.Timer;
+import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletContextSupplier;
+import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
+import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletResponseSupplier;
 import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
 import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
 
 import com.amazonaws.services.lambda.runtime.Context;
 
+import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.process.internal.RequestScoped;
+import org.glassfish.jersey.server.ResourceConfig;
+
 import javax.servlet.DispatcherType;
 import javax.servlet.FilterRegistration;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.Application;
 
 import java.util.EnumSet;
@@ -124,6 +134,18 @@ public JerseyLambdaContainerHandler(Class requestTypeClass,
         super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
         Timer.start("JERSEY_CONTAINER_CONSTRUCTOR");
         this.initialized = false;
+
+        if (jaxRsApplication instanceof ResourceConfig) {
+            ((ResourceConfig)jaxRsApplication).register(new AbstractBinder() {
+                @Override
+                protected void configure() {
+                    bindFactory(AwsProxyServletContextSupplier.class).to(ServletContext.class).in(RequestScoped.class);
+                    bindFactory(AwsProxyServletRequestSupplier.class).to(HttpServletRequest.class).in(RequestScoped.class);
+                    bindFactory(AwsProxyServletResponseSupplier.class).to(HttpServletResponse.class).in(RequestScoped.class);
+                }
+            });
+        }
+
         this.jerseyFilter = new JerseyHandlerFilter(jaxRsApplication);
         Timer.stop("JERSEY_CONTAINER_CONSTRUCTOR");
     }
diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java
similarity index 83%
rename from aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java
rename to aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java
index 126e72e8..78f8c5c5 100644
--- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletContextFactory.java
+++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java
@@ -10,10 +10,9 @@
  * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
  * and limitations under the License.
  */
-package com.amazonaws.serverless.proxy.jersey.factory;
+package com.amazonaws.serverless.proxy.jersey.suppliers;
 
 
-import org.glassfish.hk2.api.Factory;
 import org.glassfish.jersey.server.ContainerRequest;
 
 import javax.servlet.ServletContext;
@@ -21,6 +20,8 @@
 import javax.ws.rs.InternalServerErrorException;
 import javax.ws.rs.core.Context;
 
+import java.util.function.Supplier;
+
 import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY;
 
 
@@ -34,7 +35,7 @@
  *         .register(new AbstractBinder() {
  *             {@literal @}Override
  *             protected void configure() {
- *                 bindFactory(AwsProxyServletContextFactory.class)
+ *                 bindFactory(AwsProxyServletContextSupplier.class)
  *                     .to(ServletContext.class)
  *                     .in(RequestScoped.class);
  *            }
@@ -42,11 +43,15 @@
  * 
  * 
*/ -public class AwsProxyServletContextFactory implements Factory { +public class AwsProxyServletContextSupplier implements Supplier { @Context ContainerRequest currentRequest; @Override - public ServletContext provide() { + public ServletContext get() { + return getServletContext(); + } + + private ServletContext getServletContext() { HttpServletRequest req = (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); if (req == null) { @@ -56,10 +61,4 @@ public ServletContext provide() { ServletContext ctx = req.getServletContext(); return ctx; } - - - @Override - public void dispose(ServletContext servletContext) { - - } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java similarity index 76% rename from aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java rename to aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java index 6dc38d0f..fe1b21f1 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletRequestFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java @@ -10,17 +10,16 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.jersey.factory; +package com.amazonaws.serverless.proxy.jersey.suppliers; -import org.glassfish.hk2.api.Factory; import org.glassfish.jersey.server.ContainerRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.Context; +import java.util.function.Supplier; + import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; @@ -34,7 +33,7 @@ * .register(new AbstractBinder() { * {@literal @}Override * protected void configure() { - * bindFactory(AwsProxyServletRequestFactory.class) + * bindFactory(AwsProxyServletRequestSupplier.class) * .to(HttpServletRequest.class) * .in(RequestScoped.class); * } @@ -42,23 +41,20 @@ * * */ -public class AwsProxyServletRequestFactory - implements Factory { +public class AwsProxyServletRequestSupplier implements Supplier { @Context ContainerRequest currentRequest; - private static Logger log = LoggerFactory.getLogger(AwsProxyServletRequestFactory.class); //------------------------------------------------------------- // Implementation - Factory //------------------------------------------------------------- @Override - public HttpServletRequest provide() { - return (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); + public HttpServletRequest get() { + return getServletRequest(); } - - @Override - public void dispose(HttpServletRequest httpServletRequest) { + private HttpServletRequest getServletRequest() { + return (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY); } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java similarity index 72% rename from aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java rename to aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java index 1b9de98c..1fb6dc17 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/factory/AwsProxyServletResponseFactory.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java @@ -10,19 +10,16 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.jersey.factory; +package com.amazonaws.serverless.proxy.jersey.suppliers; -import org.glassfish.hk2.api.Factory; import org.glassfish.jersey.server.ContainerRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Context; -import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; +import java.util.function.Supplier; + import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_RESPONSE_PROPERTY; @@ -36,7 +33,7 @@ * .register(new AbstractBinder() { * {@literal @}Override * protected void configure() { - * bindFactory(AwsProxyServletResponseFactory.class) + * bindFactory(AwsProxyServletResponseSupplier.class) * .to(HttpServletResponse.class) * .in(RequestScoped.class); * } @@ -44,23 +41,20 @@ * * */ -public class AwsProxyServletResponseFactory - implements Factory { +public class AwsProxyServletResponseSupplier implements Supplier { @Context ContainerRequest currentRequest; - private static Logger log = LoggerFactory.getLogger(AwsProxyServletResponseFactory.class); //------------------------------------------------------------- // Implementation - Factory //------------------------------------------------------------- @Override - public HttpServletResponse provide() { - return (HttpServletResponse)currentRequest.getProperty(JERSEY_SERVLET_RESPONSE_PROPERTY); + public HttpServletResponse get() { + return getServletResponse(); } - - @Override - public void dispose(HttpServletResponse httpServletRequest) { + private HttpServletResponse getServletResponse() { + return (HttpServletResponse)currentRequest.getProperty(JERSEY_SERVLET_RESPONSE_PROPERTY); } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index d3681b91..e418e4f9 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -27,6 +27,9 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Providers; + import java.util.Enumeration; import java.util.Random; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 6945a102..d943b0c5 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -13,9 +13,6 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory; -import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory; -import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletResponseFactory; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -28,15 +25,10 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; -import org.glassfish.hk2.utilities.binding.AbstractBinder; import org.glassfish.jersey.logging.LoggingFeature; -import org.glassfish.jersey.process.internal.RequestScoped; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Response; import java.io.IOException; @@ -58,22 +50,8 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); - private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey", "com.amazonaws.serverless.proxy.jersey.providers") + private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") .register(LoggingFeature.class) - .register(new AbstractBinder() { - @Override - protected void configure() { - bindFactory(AwsProxyServletRequestFactory.class) - .to(HttpServletRequest.class) - .in(RequestScoped.class); - bindFactory(AwsProxyServletContextFactory.class) - .to(ServletContext.class) - .in(RequestScoped.class); - bindFactory(AwsProxyServletResponseFactory.class) - .to(HttpServletResponse.class) - .in(RequestScoped.class); - } - }) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); From 526a35c4c78f97445dec288362794531c2ef4fe8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 13 Feb 2018 16:43:35 -0800 Subject: [PATCH 0108/1214] Updated Spring version to 5.0.3.RELEASE. Made the spring-webmvc depedency optional to allow implementer to include their version. The code is tested with Spring 4.x and 5.x. This closes #95. --- .../internal/servlet/AwsHttpServletResponse.java | 3 ++- .../servlet/AwsProxyHttpServletRequest.java | 3 ++- .../AwsProxyHttpServletResponseWriter.java | 7 ++----- .../testutils/AwsProxyRequestBuilder.java | 1 + aws-serverless-java-container-spring/pom.xml | 15 +++++++++++++-- .../proxy/spring/SpringAwsProxyTest.java | 1 + .../proxy/spring/echoapp/EchoResource.java | 7 ++++--- samples/spring/pet-store/pom.xml | 2 +- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 45e272ca..e63ff1b8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -78,6 +78,7 @@ public class AwsHttpServletResponse public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { writersCountDownLatch = latch; request = req; + statusCode = 0; } @@ -233,7 +234,7 @@ public void setStatus(int i, String s) { @Override public int getStatus() { - return statusCode; + return (statusCode <= 0?SC_OK:statusCode); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 86a9d314..919e068d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -25,6 +25,7 @@ import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -403,7 +404,7 @@ public String getContentType() { public ServletInputStream getInputStream() throws IOException { if (request.getBody() == null) { - return null; + return new AwsServletInputStream(new NullInputStream(0, false, false)); } byte[] bodyBytes = null; if (request.isBase64Encoded()) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index cb0dd73c..54b36a27 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -50,11 +50,8 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, } awsProxyResponse.setHeaders(containerResponse.getAwsResponseHeaders()); - if (containerResponse.getStatus() <= 0) { - awsProxyResponse.setStatusCode(200); - } else { - awsProxyResponse.setStatusCode(containerResponse.getStatus()); - } + awsProxyResponse.setStatusCode(containerResponse.getStatus()); + Timer.stop("SERVLET_RESPONSE_WRITE"); return awsProxyResponse; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 60a028aa..839f6d13 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -72,6 +72,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { this.request.getRequestContext().setRequestId("test-invoke-request"); this.request.getRequestContext().setStage("test"); this.request.getRequestContext().setProtocol("HTTP/1.1"); + this.request.getRequestContext().setRequestTimeEpoch(System.currentTimeMillis()); ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity(); identity.setSourceIp("127.0.0.1"); this.request.getRequestContext().setIdentity(identity); diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9814c0f8..6d16cbde 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -15,8 +15,8 @@ - 4.3.13.RELEASE - 4.2.4.RELEASE + 5.0.3.RELEASE + 5.0.1.RELEASE 2.9.3 @@ -33,6 +33,7 @@ org.springframework spring-webmvc ${spring.version} + true @@ -83,6 +84,16 @@ spring-boot-autoconfigure 1.5.9.RELEASE test + + + org.springframework + spring-context + + + org.springframework + spring-core + + org.springframework.security diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 5c4fdcbc..00fe7afd 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -214,6 +214,7 @@ public void injectBody_populatedResponse_noException() { AwsProxyResponse response = handler.proxy(request, lambdaContext); assertNotNull(response.getBody()); + assertEquals(200, response.getStatusCode()); try { SingleValueModel output = objectMapper.readValue(response.getBody(), SingleValueModel.class); assertEquals("true", output.getValue()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 688e7760..86f2393a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -16,6 +16,7 @@ import java.net.URI; import java.util.Enumeration; import java.util.Map; +import java.util.Optional; import java.util.Random; import static org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMethodCall; @@ -119,10 +120,10 @@ public SingleValueModel echoRequestURL(HttpServletRequest request) { } @RequestMapping(path = "/request-body", method = RequestMethod.POST) - public SingleValueModel helloForPopulatedBody(@RequestBody(required = false) String input) { + public SingleValueModel helloForPopulatedBody(@RequestBody(required = false) Optional input) { SingleValueModel valueModel = new SingleValueModel(); - System.out.println("Input: \"" + input + "\""); - if (input != null && !"null".equals(input)) { + if (input.isPresent() && !"null".equals(input.get())) { + System.out.println("Input: \"" + input.get() + "\""); valueModel.setValue("true"); } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 144e9d47..198cf5d2 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.0.2.RELEASE + 5.0.3.RELEASE 2.8.4 From f40315e7a427e42cc1c87b1f762891ee658eb722 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Feb 2018 08:19:36 -0800 Subject: [PATCH 0109/1214] Added dependency check plugin for the library and updated dependencies in samples. --- aws-serverless-java-container-core/pom.xml | 23 ++++++++++++-- .../testutils/MockLambdaConsoleLogger.java | 9 ++++++ aws-serverless-java-container-jersey/pom.xml | 20 ++++++++++++ aws-serverless-java-container-spark/pom.xml | 20 ++++++++++++ aws-serverless-java-container-spring/pom.xml | 19 ++++++++++++ owasp-suppression.xml | 31 +++++++++++++++++++ samples/jersey/pet-store/pom.xml | 5 ++- samples/spark/pet-store/pom.xml | 18 ++--------- samples/spring/pet-store/pom.xml | 3 +- samples/springboot/pet-store/pom.xml | 12 +++---- 10 files changed, 131 insertions(+), 29 deletions(-) create mode 100644 owasp-suppression.xml diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 2df571ba..993c25d0 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -25,7 +25,7 @@ com.amazonaws aws-lambda-java-core - 1.1.0 + 1.2.0 @@ -53,7 +53,7 @@ commons-fileupload commons-fileupload - 1.3.2 + 1.3.3 @@ -106,6 +106,25 @@ + + org.owasp + dependency-check-maven + 3.1.1 + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + check + + + +
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java index 71d12f54..25f370cc 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java @@ -14,6 +14,9 @@ import com.amazonaws.services.lambda.runtime.LambdaLogger; +import java.nio.charset.Charset; + + /** * Mock LambdaLogger object that prints output to the console */ @@ -27,4 +30,10 @@ public class MockLambdaConsoleLogger implements LambdaLogger { public void log(String s) { System.out.println(s); } + + + @Override + public void log(byte[] bytes) { + System.out.println(new String(bytes, Charset.defaultCharset())); + } } diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 984930e0..4d525e9a 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -119,6 +119,26 @@ + + org.owasp + dependency-check-maven + 3.1.1 + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + + check + + + +
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f534b090..c56b71fc 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -91,6 +91,26 @@ + + org.owasp + dependency-check-maven + 3.1.1 + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + + check + + + +
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 6d16cbde..aa671168 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -207,6 +207,25 @@ + + org.owasp + dependency-check-maven + 3.1.1 + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + check + + + + diff --git a/owasp-suppression.xml b/owasp-suppression.xml new file mode 100644 index 00000000..ad54a679 --- /dev/null +++ b/owasp-suppression.xml @@ -0,0 +1,31 @@ + + + + + + + cpe:/a:amazon_aws_project:amazon_aws:7.x-1.2::~~~drupal~~ + + + + cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ + + + \ No newline at end of file diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 093e5ace..86872d4a 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,8 +26,7 @@ 1.8 1.8 - 2.25.1 - 2.8.5 + 2.26 @@ -53,7 +52,7 @@ io.symphonia lambda-logging - 1.0.0 + 1.0.1 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index f6d488fd..b79e2be9 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.8.5 + 2.9.4 2.7.1 @@ -44,13 +44,6 @@ ${spark.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - com.fasterxml.jackson.core @@ -58,18 +51,11 @@ ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - io.symphonia lambda-logging - 1.0.0 + 1.0.1 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 198cf5d2..e542674f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -27,7 +27,6 @@ 1.8 1.8 5.0.3.RELEASE - 2.8.4 @@ -60,7 +59,7 @@ io.symphonia lambda-logging - 1.0.0 + 1.0.1 diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index efb3313f..2f342e1b 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -13,6 +13,11 @@ 1.5.9.RELEASE + + 1.8 + 1.8 + + org.springframework.boot @@ -29,15 +34,10 @@ io.symphonia lambda-logging - 1.0.0 + 1.0.1 - - 1.8 - - - From d17516df479a13fb9303f31edb69e9f69fed6b3b Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Feb 2018 13:40:58 -0800 Subject: [PATCH 0110/1214] Minor updates to dependenciens and first import of Jersey and Spark archetypes for #115. --- archetypes/jersey/pom.xml | 47 +++++++ .../META-INF/maven/archetype-metadata.xml | 26 ++++ .../resources/archetype-resources/README.md | 129 ++++++++++++++++++ .../resources/archetype-resources/pom.xml | 86 ++++++++++++ .../resources/archetype-resources/sam.yaml | 48 +++++++ .../src/main/java/StreamLambdaHandler.java | 32 +++++ .../main/java/resource/SimpleResource.java | 26 ++++ .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++++ archetypes/spark/pom.xml | 47 +++++++ .../META-INF/maven/archetype-metadata.xml | 26 ++++ .../resources/archetype-resources/README.md | 129 ++++++++++++++++++ .../resources/archetype-resources/pom.xml | 84 ++++++++++++ .../resources/archetype-resources/sam.yaml | 48 +++++++ .../src/main/java/SparkResources.java | 25 ++++ .../src/main/java/StreamLambdaHandler.java | 40 ++++++ .../src/main/java/util/JsonTransformer.java | 24 ++++ .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++++ aws-serverless-java-container-jersey/pom.xml | 3 + pom.xml | 2 + samples/jersey/pet-store/pom.xml | 2 +- .../sample/jersey/PetsResource.java | 3 - 21 files changed, 1003 insertions(+), 4 deletions(-) create mode 100644 archetypes/jersey/pom.xml create mode 100644 archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/README.md create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/pom.xml create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/sam.yaml create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java create mode 100644 archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java create mode 100644 archetypes/spark/pom.xml create mode 100644 archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 archetypes/spark/src/main/resources/archetype-resources/README.md create mode 100644 archetypes/spark/src/main/resources/archetype-resources/pom.xml create mode 100644 archetypes/spark/src/main/resources/archetype-resources/sam.yaml create mode 100644 archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java create mode 100644 archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java create mode 100644 archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml new file mode 100644 index 00000000..cafff43f --- /dev/null +++ b/archetypes/jersey/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.0-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-jersey-archetype + 1.0-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + + \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..c6728645 --- /dev/null +++ b/archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,26 @@ + + + + src/main/java + + **/*.java + + + + src/test/java + + **/*.java + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/archetype-resources/README.md b/archetypes/jersey/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..40cc51cd --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-jersey-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.jersey -Dversion=0.1 -Dinteractive=false +$ cd my-jersey-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessJerseyApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessJerseyApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessJerseyApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessJerseyApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Jersey API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessJerseyApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..fafb643a --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,86 @@ + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + jar + + Serverless Jersey API + https://github.com/awslabs/aws-serverless-java-container + + + 1.8 + 1.8 + 2.26 + + + + + com.amazonaws.serverless + aws-serverless-java-container-jersey + 1.0-SNAPSHOT + + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + + org.glassfish.hk2 + hk2-api + + + + + + org.glassfish.hk2 + hk2-api + 2.5.0-b42 + + + + javax.inject + javax.inject + + + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + + + \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/archetype-resources/sam.yaml b/archetypes/jersey/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..ffc9814e --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,48 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Jersey API - ${groupId}::${artifactId} +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}.jar + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 15 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..0d8eabd8 --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,32 @@ +package ${groupId}; + +import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static final ResourceConfig jerseyApplication = new ResourceConfig() + .packages("${groupId}.resource") + .register(JacksonFeature.class); + private static final JerseyLambdaContainerHandler handler + = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java new file mode 100644 index 00000000..22226a29 --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java @@ -0,0 +1,26 @@ +package ${groupId}.resource; + + +import java.util.Map; +import java.util.HashMap; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +@Path("/ping") +public class SimpleResource { + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.WILDCARD) + public Response createPet() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return Response.status(200).entity(pong).build(); + } +} \ No newline at end of file diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..d648408f --- /dev/null +++ b/archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml new file mode 100644 index 00000000..24737d07 --- /dev/null +++ b/archetypes/spark/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.0-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-spark-archetype + 1.0-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + + \ No newline at end of file diff --git a/archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..3bb813f1 --- /dev/null +++ b/archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,26 @@ + + + + src/main/java + + **/*.java + + + + src/test/java + + **/*.java + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/archetypes/spark/src/main/resources/archetype-resources/README.md b/archetypes/spark/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..78b04282 --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-spark-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spark-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spark -Dversion=0.1 -Dinteractive=false +$ cd my-spark-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSparkApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSparkApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSparkApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSparkApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Spark API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessSparkApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..979b026f --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + jar + + Serverless Spark API + https://github.com/awslabs/aws-serverless-java-container + + + 1.8 + 1.8 + 2.9.4 + 2.7.1 + + + + + com.amazonaws.serverless + aws-serverless-java-container-spark + 1.0-SNAPSHOT + + + + com.sparkjava + spark-core + ${spark.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + + org.eclipse.jetty.websocket:* + org.eclipse.jetty:jetty-http + org.eclipse.jetty:jetty-client + org.eclipse.jetty:jetty-webapp + org.eclipse.jetty:jetty-xml + org.eclipse.jetty:jetty-io + + + + + + + + + diff --git a/archetypes/spark/src/main/resources/archetype-resources/sam.yaml b/archetypes/spark/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..7a17ed41 --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,48 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spark API - ${groupId}::${artifactId} +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}.jar + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 15 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java new file mode 100644 index 00000000..bc55eb43 --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java @@ -0,0 +1,25 @@ +package ${groupId}; + + +import java.util.HashMap; +import java.util.Map; + +import static spark.Spark.before; +import static spark.Spark.get; + +import ${groupId}.util.JsonTransformer; + + +public class SparkResources { + + public static void defineResources() { + before((request, response) -> response.type("application/json")); + + get("/ping", (req, res) -> { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + res.status(200); + return pong; + }, new JsonTransformer()); + } +} \ No newline at end of file diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..b185c059 --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,40 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import spark.Spark; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SparkLambdaContainerHandler handler; + static { + try { + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + SparkResources.defineResources(); + Spark.awaitInitialization(); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spark container", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java new file mode 100644 index 00000000..8df085ea --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java @@ -0,0 +1,24 @@ +package ${groupId}.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spark.ResponseTransformer; + +public class JsonTransformer implements ResponseTransformer { + + private ObjectMapper mapper = new ObjectMapper(); + private Logger log = LoggerFactory.getLogger(JsonTransformer.class); + + @Override + public String render(Object model) { + try { + return mapper.writeValueAsString(model); + } catch (JsonProcessingException e) { + log.error("Cannot serialize object", e); + return null; + } + } + +} \ No newline at end of file diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..d648408f --- /dev/null +++ b/archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 4d525e9a..19218be7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -60,6 +60,8 @@ com.fasterxml.jackson.core jackson-annotations 2.8.4 + true + test @@ -68,6 +70,7 @@ jersey-media-json-jackson ${jersey.version} test + true com.fasterxml.jackson.core diff --git a/pom.xml b/pom.xml index 49775a8d..eafadb8b 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,8 @@ aws-serverless-java-container-jersey aws-serverless-java-container-spark aws-serverless-java-container-spring + archetypes/jersey + archetypes/spark diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 86872d4a..0c8e0014 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -39,7 +39,7 @@ com.amazonaws aws-lambda-java-core - 1.1.0 + 1.2.0 diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java index 0ce0979e..2d92510d 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java @@ -15,9 +15,6 @@ import com.amazonaws.serverless.sample.jersey.model.Pet; import com.amazonaws.serverless.sample.jersey.model.PetData; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; From 4ae1230f1527d6b08e1f2d1f9da1e8b9838fbead Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Feb 2018 17:58:06 -0800 Subject: [PATCH 0111/1214] Added Spring archetype for #115. --- archetypes/spring/pom.xml | 47 +++++++ .../META-INF/maven/archetype-metadata.xml | 26 ++++ .../resources/archetype-resources/README.md | 129 ++++++++++++++++++ .../resources/archetype-resources/pom.xml | 75 ++++++++++ .../resources/archetype-resources/sam.yaml | 48 +++++++ .../src/main/java/SpringApiConfig.java | 53 +++++++ .../src/main/java/StreamLambdaHandler.java | 36 +++++ .../main/java/controller/PingController.java | 20 +++ .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++++ pom.xml | 1 + samples/spring/pet-store/pom.xml | 2 +- 11 files changed, 526 insertions(+), 1 deletion(-) create mode 100644 archetypes/spring/pom.xml create mode 100644 archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 archetypes/spring/src/main/resources/archetype-resources/README.md create mode 100644 archetypes/spring/src/main/resources/archetype-resources/pom.xml create mode 100644 archetypes/spring/src/main/resources/archetype-resources/sam.yaml create mode 100644 archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java create mode 100644 archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java create mode 100644 archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml new file mode 100644 index 00000000..58120d65 --- /dev/null +++ b/archetypes/spring/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.0-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-spring-archetype + 1.0-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + + \ No newline at end of file diff --git a/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..a6d71726 --- /dev/null +++ b/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,26 @@ + + + + src/main/java + + **/*.java + + + + src/test/java + + **/*.java + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/archetypes/spring/src/main/resources/archetype-resources/README.md b/archetypes/spring/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..4b646a46 --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false +$ cd my-spring-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessSpringApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..28213c3a --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + jar + + Serverless Spark API + https://github.com/awslabs/aws-serverless-java-container + + + 1.8 + 1.8 + 5.0.3.RELEASE + + + + + com.amazonaws.serverless + aws-serverless-java-container-spring + 1.0-SNAPSHOT + + + + com.amazonaws + aws-lambda-java-core + 1.2.0 + + + + org.springframework + spring-webmvc + ${spring.version} + + + + org.springframework + spring-context + ${spring.version} + + + + junit + junit + 4.12 + test + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + + + diff --git a/archetypes/spring/src/main/resources/archetype-resources/sam.yaml b/archetypes/spring/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..f51d43cf --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,48 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spring API - ${groupId}::${artifactId} +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}.jar + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 15 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java new file mode 100644 index 00000000..f8cb9fb9 --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java @@ -0,0 +1,53 @@ +package ${groupId}; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@Configuration +@ComponentScan("${groupId}.controller") +public class SpringApiConfig { + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + /* + * optimization - avoids creating default exception resolvers; not required as the serverless container handles + * all exceptions + * + * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including + * an expensive ObjectMapper instance. + */ + @Bean + public HandlerExceptionResolver handlerExceptionResolver() { + return new HandlerExceptionResolver() { + + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + return null; + } + }; + } +} \ No newline at end of file diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..31b28393 --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,36 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringLambdaContainerHandler handler; + static { + try { + handler = SpringLambdaContainerHandler.getAwsProxyHandler(SpringApiConfig.class); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring framework", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} \ No newline at end of file diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java new file mode 100644 index 00000000..94f517f0 --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java @@ -0,0 +1,20 @@ +package ${groupId}.controller; + + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@EnableWebMvc +public class PingController { + @RequestMapping(path = "/ping", method = RequestMethod.GET) + public Map ping() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return pong; + } +} diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..d648408f --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/pom.xml b/pom.xml index eafadb8b..912c0f3f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ aws-serverless-java-container-spring archetypes/jersey archetypes/spark + archetypes/spring diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e542674f..cc784624 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -39,7 +39,7 @@ com.amazonaws aws-lambda-java-core - 1.1.0 + 1.2.0 From ca2297ba5db5e405a0b8688efedb9cc435104a4c Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 19 Feb 2018 09:16:49 -0800 Subject: [PATCH 0112/1214] Addressing date header bug reported in #122 and added basic unit tests --- .../servlet/AwsHttpServletRequest.java | 4 ++-- .../servlet/AwsProxyHttpServletRequest.java | 19 +++++++-------- .../AwsProxyHttpServletRequestTest.java | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 3e447c73..8bbbda24 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -32,7 +32,7 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.security.Security; +import java.time.format.DateTimeFormatter; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; @@ -58,7 +58,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final String HEADER_VALUE_SEPARATOR = ";"; static final String FORM_DATA_SEPARATOR = "&"; static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; - static final String HEADER_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss z"; + static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; static final String ENCODING_VALUE_KEY = "charset"; // We need this to pickup the protocol from the CloudFront header since Lambda doesn't receive this diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 919e068d..655f6207 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -53,14 +53,14 @@ import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.security.Principal; -import java.text.ParseException; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -133,16 +133,15 @@ public Cookie[] getCookies() { @Override public long getDateHeader(String s) { - String dateString = getHeaderCaseInsensitive(HttpHeaders.DATE); + String dateString = getHeaderCaseInsensitive(s); if (dateString == null) { - return new Date().getTime(); + return -1L; } - SimpleDateFormat dateFormatter = new SimpleDateFormat(HEADER_DATE_FORMAT); try { - return dateFormatter.parse(dateString).getTime(); - } catch (ParseException e) { - log.error("Could not parse date header", e); - return new Date().getTime(); + return Instant.from(ZonedDateTime.parse(dateString, dateFormatter)).toEpochMilli(); + } catch (DateTimeParseException e) { + log.warn("Invalid date header in request" + SecurityUtils.crlf(dateString)); + return -1L; } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index b2342efe..d8d81b53 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -9,6 +9,8 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import java.time.Instant; +import java.time.ZonedDateTime; import java.util.Collections; import java.util.List; import java.util.Map; @@ -25,6 +27,7 @@ public class AwsProxyHttpServletRequestTest { private static final String REQUEST_SCHEME_HTTP = "http"; private static final String USER_AGENT = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0"; private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; + private static ZonedDateTime REQUEST_DATE = ZonedDateTime.now(); private static final AwsProxyRequest REQUEST_WITH_HEADERS = new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) @@ -52,6 +55,10 @@ public class AwsProxyHttpServletRequestTest { .userAgent(USER_AGENT) .referer(REFERER).build(); + private static final AwsProxyRequest REQUEST_WITH_DATE = new AwsProxyRequestBuilder("/hello", "GET") + .header(HttpHeaders.DATE, AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE)) + .build(); + private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING; static { AwsProxyRequest awsProxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); @@ -113,6 +120,23 @@ public void formParams_getParameter_queryStringPrecendence() { assertEquals(QUERY_STRING_NAME_VALUE, request.getParameter(FORM_PARAM_NAME)); } + @Test + public void dateHeader_noDate_returnNegativeOne() { + HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); + assertNotNull(request); + assertEquals(-1L, request.getDateHeader(HttpHeaders.DATE)); + } + + @Test + public void dateHeader_correctDate_parseToCorrectLong() { + HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_DATE, null, null); + assertNotNull(request); + + String instantString = AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE); + assertEquals(Instant.from(AwsHttpServletRequest.dateFormatter.parse(instantString)).toEpochMilli(), request.getDateHeader(HttpHeaders.DATE)); + assertEquals(-1L, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE)); + } + @Test public void scheme_getScheme_https() { HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED, null, null); From b6965bd7a6e748923852a24cb5fdd59f19e7933c Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 19 Feb 2018 11:27:59 -0800 Subject: [PATCH 0113/1214] Added Spring Boot archetype. This was the last archetype missing to address #115. --- .../resources/archetype-resources/pom.xml | 8 +- archetypes/springboot/pom.xml | 47 +++++++ .../META-INF/maven/archetype-metadata.xml | 26 ++++ .../resources/archetype-resources/README.md | 129 ++++++++++++++++++ .../resources/archetype-resources/pom.xml | 73 ++++++++++ .../resources/archetype-resources/sam.yaml | 48 +++++++ .../src/main/java/Application.java | 70 ++++++++++ .../src/main/java/StreamLambdaHandler.java | 36 +++++ .../main/java/controller/PingController.java | 20 +++ .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++++ pom.xml | 1 + 11 files changed, 541 insertions(+), 7 deletions(-) create mode 100644 archetypes/springboot/pom.xml create mode 100644 archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/README.md create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/pom.xml create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/sam.yaml create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index 28213c3a..f3c483d3 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -9,7 +9,7 @@ ${version} jar - Serverless Spark API + Serverless Spring API https://github.com/awslabs/aws-serverless-java-container @@ -25,12 +25,6 @@ 1.0-SNAPSHOT - - com.amazonaws - aws-lambda-java-core - 1.2.0 - - org.springframework spring-webmvc diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml new file mode 100644 index 00000000..a6f32044 --- /dev/null +++ b/archetypes/springboot/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.0-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-springboot-archetype + 1.0-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + + \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..79aba2e3 --- /dev/null +++ b/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,26 @@ + + + + src/main/java + + **/*.java + + + + src/test/java + + **/*.java + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/archetype-resources/README.md b/archetypes/springboot/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..4b646a46 --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false +$ cd my-spring-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessSpringApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..b07a6fc8 --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + jar + + Serverless Spring Boot API + https://github.com/awslabs/aws-serverless-java-container + + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + + + + 1.8 + 1.8 + + + + + com.amazonaws.serverless + aws-serverless-java-container-spring + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + diff --git a/archetypes/springboot/src/main/resources/archetype-resources/sam.yaml b/archetypes/springboot/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..7569beda --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,48 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spring Boot API - ${groupId}::${artifactId} +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}.jar + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java new file mode 100644 index 00000000..1ce50e9c --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java @@ -0,0 +1,70 @@ +#macro(loggingOff) + logging.level.root:OFF +#end +#set($logging = "#loggingOff()") +#set($logging = $logging.replaceAll("\n", "").trim()) +package ${groupId}; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@SpringBootApplication +@ComponentScan(basePackages = "${groupId}.controller") +public class Application extends SpringBootServletInitializer { + + // silence console logging + @Value("${${logging}}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + /* + * optimization - avoids creating default exception resolvers; not required as the serverless container handles + * all exceptions + * + * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including + * an expensive ObjectMapper instance. + */ + @Bean + public HandlerExceptionResolver handlerExceptionResolver() { + return new HandlerExceptionResolver() { + + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + return null; + } + }; + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..fe0075ba --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,36 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + + // just in case it wasn't closed by the mapper + outputStream.close(); + } +} \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java new file mode 100644 index 00000000..94f517f0 --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java @@ -0,0 +1,20 @@ +package ${groupId}.controller; + + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@EnableWebMvc +public class PingController { + @RequestMapping(path = "/ping", method = RequestMethod.GET) + public Map ping() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return pong; + } +} diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..d648408f --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/pom.xml b/pom.xml index 912c0f3f..9ae82fb2 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ archetypes/jersey archetypes/spark archetypes/spring + archetypes/springboot From 4f79a998f5222adbf3bf95ad918da1727c66dd0c Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 19 Feb 2018 16:35:30 -0800 Subject: [PATCH 0114/1214] Added Spring unit tests for #122. --- .../proxy/spring/SpringAwsProxyTest.java | 33 +++++++++++++++++++ .../proxy/spring/echoapp/EchoResource.java | 10 ++++++ 2 files changed, 43 insertions(+) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 00fe7afd..934cc66b 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -28,6 +28,9 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import java.io.IOException; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.UUID; import static org.junit.Assert.*; @@ -112,6 +115,36 @@ public void queryString_uriInfo_echo() { validateMapResponseModel(output); } + @Test + public void dateHeader_notModified_expect304() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") + .json() + .header( + HttpHeaders.IF_MODIFIED_SINCE, + DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(1, ChronoUnit.SECONDS)) + ) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(304, output.getStatusCode()); + assertEquals("", output.getBody()); + } + + @Test + public void dateHeader_notModified_expect200() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") + .json() + .header( + HttpHeaders.IF_MODIFIED_SINCE, + DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(5, ChronoUnit.DAYS)) + ) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals(EchoResource.STRING_BODY, output.getBody()); + } + @Test public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 86f2393a..e9d2d3c6 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -14,6 +14,8 @@ import javax.servlet.http.HttpServletRequest; import java.net.URI; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Enumeration; import java.util.Map; import java.util.Optional; @@ -28,6 +30,7 @@ @RequestMapping("/echo") public class EchoResource { public static final String TEST_GENERATE_URI = "test"; + public static final String STRING_BODY = "Hello"; @Autowired ServletContext servletContext; @@ -149,4 +152,11 @@ public SingleValueModel echoGeneratedResourceLink() { return valueModel; } + @RequestMapping(path = "/last-modified", method = RequestMethod.GET) + public ResponseEntity echoLastModified() { + return ResponseEntity + .ok() + .lastModified(Instant.now().minus(1, ChronoUnit.DAYS).toEpochMilli()) + .body(STRING_BODY); + } } From 9eb17273c6e387dad7709da32582ff69959a54fb Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Feb 2018 09:33:06 -0800 Subject: [PATCH 0115/1214] Added sample filter in servlet examples. Discovered and fixed a filters bug with spring boot. This closes #67. --- .../ApacheCombinedServletLogFormatter.java | 15 ++-- .../SpringBootLambdaContainerHandler.java | 6 +- samples/spark/pet-store/pom.xml | 8 +++ .../sample/spark/StreamLambdaHandler.java | 11 +++ .../spark/filter/CognitoIdentityFilter.java | 68 ++++++++++++++++++ .../sample/spring/StreamLambdaHandler.java | 12 ++++ .../spring/filter/CognitoIdentityFilter.java | 69 +++++++++++++++++++ .../springboot/StreamLambdaHandler.java | 11 +++ .../filter/CognitoIdentityFilter.java | 68 ++++++++++++++++++ 9 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java create mode 100644 samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index 37895dd3..8afb60bf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -11,7 +11,9 @@ import javax.ws.rs.core.SecurityContext; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; @@ -55,8 +57,6 @@ public ApacheCombinedServletLogFormatter() { .optionalEnd() .appendLiteral("]") .toFormatter(); - //DateTimeFormatter.ofPattern("dd/MM/yyyy:hh:mm:ss Z"); - //DateTimeFormatter.BASIC_ISO_DATE } @Override @@ -91,9 +91,16 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType // %t if (gatewayContext != null) { - logLineBuilder.append(dateFormat.format(LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC))); + logLineBuilder.append( + dateFormat.format( + ZonedDateTime.of( + LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC), + ZoneId.systemDefault() + ) + ) + ); } else { - logLineBuilder.append(dateFormat.format(LocalDateTime.now())); + logLineBuilder.append(dateFormat.format(ZonedDateTime.now())); } logLineBuilder.append(" "); diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index df0fa148..bd4dda75 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -134,7 +134,11 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt if (springProfiles != null && springProfiles.length > 0) { ConfigurableEnvironment springEnv = new StandardEnvironment(); springEnv.setActiveProfiles(springProfiles); - + } + + // call the onStartup event if set to give developers a chance to set filters in the context + if (startupHandler != null) { + startupHandler.onStartup(getServletContext()); } initialized = true; diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index b79e2be9..824d7c6c 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -77,7 +77,15 @@ + org.eclipse.jetty.websocket:* + org.eclipse.jetty:jetty-http + org.eclipse.jetty:jetty-client + org.eclipse.jetty:jetty-webapp + org.eclipse.jetty:jetty-xml + org.eclipse.jetty:jetty-io diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java index a5f2f110..09639eae 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java @@ -6,14 +6,19 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; +import com.amazonaws.serverless.sample.spark.filter.CognitoIdentityFilter; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; import spark.Spark; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.EnumSet; public class StreamLambdaHandler implements RequestStreamHandler { @@ -23,6 +28,12 @@ public class StreamLambdaHandler implements RequestStreamHandler { handler = SparkLambdaContainerHandler.getAwsProxyHandler(); SparkResources.defineResources(); Spark.awaitInitialization(); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); + }); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..cfed259e --- /dev/null +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java @@ -0,0 +1,68 @@ +package com.amazonaws.serverless.sample.spark.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.spring.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + if (!ApiGatewayRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + ApiGatewayRequestContext ctx = (ApiGatewayRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 11fddada..158531bc 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -6,12 +6,17 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.serverless.sample.spring.filter.CognitoIdentityFilter; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.EnumSet; public class StreamLambdaHandler implements RequestStreamHandler { @@ -19,6 +24,13 @@ public class StreamLambdaHandler implements RequestStreamHandler { static { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); + }); + } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..03793dc8 --- /dev/null +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.spring.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.spring.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + if (!ApiGatewayRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + ApiGatewayRequestContext ctx = (ApiGatewayRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java index 1fc50549..50c75c63 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java @@ -6,12 +6,17 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.sample.springboot.filter.CognitoIdentityFilter; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.EnumSet; public class StreamLambdaHandler implements RequestStreamHandler { @@ -19,6 +24,12 @@ public class StreamLambdaHandler implements RequestStreamHandler { static { try { handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + }); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..cdf8e31e --- /dev/null +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java @@ -0,0 +1,68 @@ +package com.amazonaws.serverless.sample.springboot.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.spring.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + if (!ApiGatewayRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + ApiGatewayRequestContext ctx = (ApiGatewayRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} From 260f84a3d5febfa9ff5ad4f08cb461a766bc93d4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 20 Feb 2018 12:14:57 -0800 Subject: [PATCH 0116/1214] Renamed Jersey archetype resource to match other implementations. --- .../java/resource/{SimpleResource.java => PingResource.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/{SimpleResource.java => PingResource.java} (94%) diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java similarity index 94% rename from archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java rename to archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java index 22226a29..68f8c275 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/SimpleResource.java +++ b/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java @@ -13,7 +13,7 @@ import javax.ws.rs.core.Response; @Path("/ping") -public class SimpleResource { +public class PingResource { @GET @Produces(MediaType.APPLICATION_JSON) From a5067bdf91faa09f9b74a33931eab06cc1823b4e Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 22 Feb 2018 17:56:44 -0800 Subject: [PATCH 0117/1214] Changed test request builder to use a random UUID as requestId as pointed out in #125. --- .../proxy/internal/testutils/AwsProxyRequestBuilder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 839f6d13..dc5bab9e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -35,6 +35,8 @@ import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.HashMap; +import java.util.UUID; + /** * Request builder object. This is used by unit proxy to quickly create an AWS_PROXY request object @@ -69,7 +71,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { this.request.setPath(path); this.request.setQueryStringParameters(new HashMap<>()); this.request.setRequestContext(new ApiGatewayRequestContext()); - this.request.getRequestContext().setRequestId("test-invoke-request"); + this.request.getRequestContext().setRequestId(UUID.randomUUID().toString()); this.request.getRequestContext().setStage("test"); this.request.getRequestContext().setProtocol("HTTP/1.1"); this.request.getRequestContext().setRequestTimeEpoch(System.currentTimeMillis()); From ff97607a5afd4b06b95c77ebb555342dcdc4b365 Mon Sep 17 00:00:00 2001 From: Fernand Date: Fri, 23 Feb 2018 16:56:49 +0100 Subject: [PATCH 0118/1214] Send a temporary redirect response in AwsHttpSerletResponse sendRedirect method --- .../proxy/internal/servlet/AwsHttpServletResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 45e272ca..6e163b88 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -169,7 +169,7 @@ public void sendError(int i) throws IOException { @Override public void sendRedirect(String s) throws IOException { - setStatus(SC_MOVED_PERMANENTLY); + setStatus(SC_MOVED_TEMPORARILY); addHeader(HttpHeaders.LOCATION, s); flushBuffer(); } From fa6faebe57352b33af58b0e3f2902a01e4739869 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Fri, 23 Feb 2018 08:19:20 -0800 Subject: [PATCH 0119/1214] Create CONTRIBUTING.md Adding contributing file with standard text. --- CONTRIBUTING.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..4d490d0f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,61 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional +documentation, we greatly value feedback and contributions from our community. + +Please read through this document before submitting any issues or pull requests to ensure we have all the necessary +information to effectively respond to your bug report or contribution. + + +## Reporting Bugs/Feature Requests + +We welcome you to use the GitHub issue tracker to report bugs or suggest features. + +When filing an issue, please check [existing open](https://github.com/awslabs/aws-serverless-java-container/issues), or [recently closed](https://github.com/awslabs/aws-serverless-java-container/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already +reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: + +* A reproducible test case or series of steps +* The version of our code being used +* Any modifications you've made relevant to the bug +* Anything unusual about your environment or deployment + + +## Contributing via Pull Requests +Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: + +1. You are working against the latest source on the *master* branch. +2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your time to be wasted. + +To send us a pull request, please: + +1. Fork the repository. +2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. +3. Ensure local tests pass. +4. Commit to your fork using clear commit messages. +5. Send us a pull request, answering any default questions in the pull request interface. +6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. + +GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and +[creating a pull request](https://help.github.com/articles/creating-a-pull-request/). + + +## Finding contributions to work on +Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels ((enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/awslabs/aws-serverless-java-container/labels/help%20wanted) issues is a great place to start. + + +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. + + +## Security issue notifications +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. + + +## Licensing + +See the [LICENSE](https://github.com/awslabs/aws-serverless-java-container/blob/master/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. + +We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. From 7c91d8acffd41f877628c02ab0f1b17f90c5a895 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 23 Feb 2018 08:21:17 -0800 Subject: [PATCH 0120/1214] Added code of conduct doc. --- CODE_OF_CONDUCT.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..3b644668 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. From 8c4a437005cb238c2530888e0c293d9ee256558e Mon Sep 17 00:00:00 2001 From: sapessi Date: Sat, 24 Feb 2018 15:48:11 -0800 Subject: [PATCH 0121/1214] Added full request URI to Jersey's ContainerRequest object, including scheme, host, and path; excluding the stage --- .../serverless/proxy/RequestReader.java | 6 ++++ .../AwsProxyHttpServletRequestReader.java | 1 + .../proxy/jersey/JerseyHandlerFilter.java | 31 ++++++++++++++++--- .../proxy/jersey/EchoJerseyResource.java | 9 ++++++ .../proxy/jersey/JerseyAwsProxyTest.java | 14 +++++++++ 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index 4b1028ea..9a812f32 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -45,6 +45,11 @@ public abstract class RequestReader { */ public static final String API_GATEWAY_STAGE_VARS_PROPERTY = "com.amazonaws.apigateway.stage.variables"; + /** + * The key to store the entire API Gateway event + */ + public static final String API_GATEWAY_EVENT_PROPERTY = "com.amazonaws.apigateway.request"; + /** * The key for the AWS Lambda context property in the PropertiesDelegate object */ @@ -56,6 +61,7 @@ public abstract class RequestReader { public static final String JAX_SECURITY_CONTEXT_PROPERTY = "com.amazonaws.serverless.jaxrs.securityContext"; + //------------------------------------------------------------- // Methods - Abstract //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index e7905bd9..a22a34c8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -37,6 +37,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(request, lambdaContext, securityContext, config); servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext()); servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables()); + servletRequest.setAttribute(API_GATEWAY_EVENT_PROPERTY, request); servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext); servletRequest.setAttribute(JAX_SECURITY_CONTEXT_PROPERTY, securityContext); diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 050b3013..1741d49e 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -4,6 +4,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.glassfish.jersey.internal.MapPropertiesDelegate; @@ -53,7 +54,7 @@ public class JerseyHandlerFilter implements Filter, Container { private ApplicationHandler jersey; private Application app; private Logger log = LoggerFactory.getLogger(JerseyHandlerFilter.class); - private URI basePathUri; + private URI baseUri; /** @@ -66,7 +67,6 @@ public class JerseyHandlerFilter implements Filter, Container { jersey = new ApplicationHandler(app); jersey.onStartup(this); - basePathUri = URI.create("/"); Timer.stop("JERSEY_FILTER_CONSTRUCTOR"); } @@ -123,7 +123,11 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request Timer.start("JERSEY_SERVLET_REQUEST_TO_CONTAINER"); HttpServletRequest servletRequest = (HttpServletRequest)request; - UriBuilder uriBuilder = UriBuilder.fromPath(servletRequest.getPathInfo()); + if (baseUri == null) { + baseUri = getBaseUri(request, "/"); + } + + UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo()); uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString())); PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate(); @@ -133,7 +137,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request apiGatewayProperties.setProperty(JERSEY_SERVLET_REQUEST_PROPERTY, servletRequest); ContainerRequest requestContext = new ContainerRequest( - basePathUri, + null, // jersey uses "/" by default uriBuilder.build(), servletRequest.getMethod().toUpperCase(Locale.ENGLISH), (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), @@ -161,6 +165,25 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request return requestContext; } + private URI getBaseUri(ServletRequest request, String basePath) { + ApiGatewayRequestContext apiGatewayCtx = (ApiGatewayRequestContext) request.getAttribute(API_GATEWAY_CONTEXT_PROPERTY); + String region = System.getenv("AWS_REGION"); + if (region == null) { + // this is not a critical failure, we just put a static region in the URI + region = "us-east-1"; + } + StringBuilder uriBuilder = new StringBuilder(); + uriBuilder.append("https://") // we assume it's always https + .append(apiGatewayCtx.getApiId()) + .append(".execute-api.") + .append(region) + .append(".amazonaws.com") + .append("/"); + + + return UriBuilder.fromUri(uriBuilder.toString()).build(); + } + //------------------------------------------------------------- // Implementation - Container //------------------------------------------------------------- diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index e418e4f9..4e1e334a 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -97,6 +97,15 @@ public MapResponseModel echoQueryString(@Context UriInfo context) { return queryStrings; } + @Path("/scheme") @GET + @Produces(MediaType.APPLICATION_JSON) + public SingleValueModel echoRequestScheme(@Context UriInfo context) { + SingleValueModel model = new SingleValueModel(); + System.out.println("RequestUri: " + context.getRequestUri().toString()); + model.setValue(context.getRequestUri().getScheme()); + return model; + } + @Path("/authorizer-principal") @GET @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoAuthorizerPrincipal(@Context ContainerRequestContext context) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index d943b0c5..5427f08b 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -151,6 +151,20 @@ public void queryString_encoded_echo() { validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } + @Test + public void requestScheme_valid_expectHttps() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/scheme", "GET") + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getHeaders().get("Content-Type")); + + validateSingleValueModel(output, "https"); + } + @Test public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") From 650e54b3bb9d80c3679c6d95b1bb8bd161e5d91a Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Feb 2018 08:23:47 -0800 Subject: [PATCH 0122/1214] Added README to spring boot sample to address #127. --- samples/springboot/pet-store/README.md | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 samples/springboot/pet-store/README.md diff --git a/samples/springboot/pet-store/README.md b/samples/springboot/pet-store/README.md new file mode 100644 index 00000000..ae9100cb --- /dev/null +++ b/samples/springboot/pet-store/README.md @@ -0,0 +1,62 @@ +# Serverless Spring Boot example +A basic pet store written with the [Spring Boot framework](https://projects.spring.io/spring-boot/). The `LambdaHandler` object is the main entry point for Lambda. + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition + +## Installation +To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. + +In a shell, navigate to the sample's folder and use maven to build a deployable jar. +``` +$ mvn package +``` + +This command should generate a `serverless-spring-boot-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringBootSample --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SpringBootPetStoreApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringBootSample +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "OutputKey": "SpringBootPetStoreApi", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "JerseySample", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser to test a first request. From ad655d20476d1e5b5e261197baea19084bd1ff13 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Feb 2018 14:35:37 -0800 Subject: [PATCH 0123/1214] Changed archetypes to refer to 1.0 --- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/src/main/resources/archetype-resources/pom.xml | 2 +- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- .../springboot/src/main/resources/archetype-resources/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index fafb643a..cb7af21f 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.0-SNAPSHOT + 1.0 diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 979b026f..efa3fd55 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.0-SNAPSHOT + 1.0 diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index f3c483d3..e2f8a72a 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -22,7 +22,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.0-SNAPSHOT + 1.0 diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index b07a6fc8..b68a2dd2 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.0-SNAPSHOT + 1.0 From c6c467d8d9f7171f6760114f1e65d4fb4d936165 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Feb 2018 14:42:22 -0800 Subject: [PATCH 0124/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.0 --- archetypes/jersey/pom.xml | 7 +++---- archetypes/spark/pom.xml | 7 +++---- archetypes/spring/pom.xml | 7 +++---- archetypes/springboot/pom.xml | 7 +++---- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 24 insertions(+), 28 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index cafff43f..a037d2c4 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.0-SNAPSHOT + 1.0.1 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 24737d07..a1af2a90 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.0-SNAPSHOT + 1.0.1 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 58120d65..e72f1df5 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.0-SNAPSHOT + 1.0.1 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index a6f32044..00017b6b 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.0-SNAPSHOT + 1.0.1 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 993c25d0..83f3341c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 19218be7..0d93bed4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0-SNAPSHOT + 1.0 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c56b71fc..5212482e 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0-SNAPSHOT + 1.0 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index aa671168..5f5e5b82 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.0-SNAPSHOT + 1.0 com.amazonaws.serverless aws-serverless-java-container - 1.0-SNAPSHOT + 1.0 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0-SNAPSHOT + 1.0 diff --git a/pom.xml b/pom.xml index 9ae82fb2..6d32df86 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.0-SNAPSHOT + 1.0 AWS Serverless Java container From 8fa604127a60656080fadc29f3fbe4c5e9679b9b Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Feb 2018 14:42:23 -0800 Subject: [PATCH 0125/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index a037d2c4..a0cd269e 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.0.1 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index a1af2a90..af3c2acb 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.0.1 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index e72f1df5..0bcb6d09 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.0.1 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 00017b6b..d0d1b82d 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.0.1 + 1.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 83f3341c..ea35c872 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 0d93bed4..05a64ba7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0 + 1.1-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5212482e..87c9d17e 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0 + 1.1-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5f5e5b82..81f2f856 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.0 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0 + 1.1-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0 + 1.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 6d32df86..2c91c3f0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.0 + 1.1-SNAPSHOT AWS Serverless Java container From 9870de47da5314c67e0852645b361676bd09281b Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 27 Feb 2018 16:34:39 -0800 Subject: [PATCH 0126/1214] Added HK2 dependency injection to Jersey sample --- samples/jersey/pet-store/pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 0c8e0014..d41c4b5c 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -48,6 +48,18 @@ ${jersey.version} + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + javax.inject + javax.inject + + + + io.symphonia From 234f65abe66eb4d1ba49f2a524f36aaedab93359 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 28 Feb 2018 12:23:18 -0800 Subject: [PATCH 0127/1214] Adding NOTICE file --- NOTICE | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 NOTICE diff --git a/NOTICE b/NOTICE new file mode 100644 index 00000000..cd46713a --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +AWS Serverless Java Container +Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. \ No newline at end of file From f7c95b271ede9f0bcd17106d820689a1565bb9ea Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 1 Mar 2018 10:20:02 -0800 Subject: [PATCH 0128/1214] Added null path check and unit tests to address #130. --- .../servlet/AwsProxyHttpServletRequest.java | 2 +- .../proxy/spark/HelloWorldSparkStreamTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 655f6207..65668b2b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -704,7 +704,7 @@ private Map getMultipartFormParametersMap() { private String cleanUri(String uri) { - String finalUri = uri; + String finalUri = (uri == null ? "" : uri); if (!finalUri.startsWith("/")) { finalUri = "/" + finalUri; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index cbcfb377..7a8d13b6 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -78,6 +78,21 @@ public void helloRequest_basicStream_populatesOutputSuccessfully() { } } + @Test + public void nullPathRequest_doesntFail_expectA404() { + InputStream req = new AwsProxyRequestBuilder().method("GET").path(null).buildStream(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + handler.proxyStream(req, outputStream, new MockLambdaContext()); + AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); + + assertEquals(404, response.getStatusCode()); + } catch (IOException e) { + e.printStackTrace(); + fail(); + } + } + private static void configureRoutes() { get("/hello", (req, res) -> { res.status(200); From 24b15e5ef6d64b34caf5738690d9f6454119533c Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 12:32:45 -0700 Subject: [PATCH 0129/1214] Bump Jackson version to 2.9.4 to address critical vulnerability CVE-2018-5968 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ea35c872..02a6fbb9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -15,7 +15,7 @@ - 2.9.3 + 2.9.4 2.1 3.1.0 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 81f2f856..983baa5a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 5.0.3.RELEASE 5.0.1.RELEASE - 2.9.3 + 2.9.4 From a6efbeb37781f11691c89aec47fdffcef10614cc Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 12:37:15 -0700 Subject: [PATCH 0130/1214] Bump archetype dependency version to address CVE-2018-5968 --- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/src/main/resources/archetype-resources/pom.xml | 2 +- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- .../springboot/src/main/resources/archetype-resources/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index cb7af21f..57479e34 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.0 + 1.0.1 diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index efa3fd55..5bfcfdfd 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.0 + 1.0.1 diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index e2f8a72a..9d0ab8c7 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -22,7 +22,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.0 + 1.0.1 diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index b68a2dd2..1f01ebbf 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.0 + 1.0.1 From 38ae26f57b28a640803fb216395124ec85fa2713 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 13:47:52 -0700 Subject: [PATCH 0131/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.0.1 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index a0cd269e..f207e726 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1-SNAPSHOT + 1.0.2 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index af3c2acb..fc16ff41 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1-SNAPSHOT + 1.0.2 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 0bcb6d09..908798ab 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1-SNAPSHOT + 1.0.2 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index d0d1b82d..27018de8 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1-SNAPSHOT + 1.0.2 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 02a6fbb9..2c472d5a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 05a64ba7..3b531772 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.0.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 87c9d17e..fa90e6ef 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.0.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 983baa5a..d606cfd5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.0.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.0.1 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.0.1 diff --git a/pom.xml b/pom.xml index 2c91c3f0..68320fc3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1-SNAPSHOT + 1.0.1 AWS Serverless Java container From 5f706f28955b3b25c63d156fd6c94c8c81ecef9c Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 13:47:52 -0700 Subject: [PATCH 0132/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index f207e726..a0cd269e 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.0.2 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index fc16ff41..af3c2acb 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.0.2 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 908798ab..0bcb6d09 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.0.2 + 1.1-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 27018de8..d0d1b82d 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.0.2 + 1.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 2c472d5a..02a6fbb9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 3b531772..05a64ba7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0.1 + 1.1-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index fa90e6ef..87c9d17e 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0.1 + 1.1-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d606cfd5..983baa5a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.0.1 + 1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.0.1 + 1.1-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.0.1 + 1.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 68320fc3..2c91c3f0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.0.1 + 1.1-SNAPSHOT AWS Serverless Java container From 7c9efaca07198d1f20a53907d23244597a94cdc5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 14:41:56 -0700 Subject: [PATCH 0133/1214] Added apiKeyId field to address #136 and moved initialization of request fields to the constructor --- .../proxy/model/ApiGatewayRequestIdentity.java | 11 +++++++++++ .../serverless/proxy/model/AwsProxyRequest.java | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java index 6d0f453b..dfce0f72 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java @@ -33,6 +33,7 @@ public class ApiGatewayRequestIdentity { //------------------------------------------------------------- private String apiKey; + private String apiKeyId; private String userArn; private String cognitoAuthenticationType; private String caller; @@ -60,6 +61,16 @@ public void setApiKey(String apiKey) { } + public String getApiKeyId() { + return apiKeyId; + } + + + public void setApiKeyId(String apiKeyId) { + this.apiKeyId = apiKeyId; + } + + public String getUserArn() { return userArn; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index eefa59f3..00001662 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -32,13 +32,20 @@ public class AwsProxyRequest { private String resource; private ApiGatewayRequestContext requestContext; private Map queryStringParameters; - private Map headers = new HashMap<>(); // avoid NPE + private Map headers; private Map pathParameters; private String httpMethod; private Map stageVariables; private String path; private boolean isBase64Encoded; + public AwsProxyRequest() { + queryStringParameters = new HashMap<>(); + headers = new HashMap<>(); + pathParameters = new HashMap<>(); + stageVariables = new HashMap<>(); + } + //------------------------------------------------------------- // Methods - Getter/Setter From f719353df0f9512a0b1cff8ae2b66106ede6e221 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Mar 2018 14:55:57 -0700 Subject: [PATCH 0134/1214] Disabled Spring Boot logging in archetype using properties file. This addresses issue #134 with SAM local --- .../main/resources/META-INF/maven/archetype-metadata.xml | 6 ++++++ .../archetype-resources/src/main/java/Application.java | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml index 79aba2e3..065bd97a 100644 --- a/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -9,6 +9,12 @@ **/*.java + + src/main/resources + + **/*.properties + + src/test/java diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java index 1ce50e9c..0db19bae 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java @@ -26,10 +26,6 @@ @ComponentScan(basePackages = "${groupId}.controller") public class Application extends SpringBootServletInitializer { - // silence console logging - @Value("${${logging}}") - String message = ""; - /* * Create required HandlerMapping, to avoid several default HandlerMapping instances being created */ From 6c9075651b09c271e94a01f45676d5e220df2e5c Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:02:12 -0700 Subject: [PATCH 0135/1214] Bump in Jackson version to address #139. --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 02a6fbb9..bd5a3d2e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -15,7 +15,7 @@ - 2.9.4 + 2.9.5 2.1 3.1.0 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 05a64ba7..843b72f1 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -59,7 +59,7 @@ com.fasterxml.jackson.core jackson-annotations - 2.8.4 + 2.9.5 true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 983baa5a..dbf03a06 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 5.0.3.RELEASE 5.0.1.RELEASE - 2.9.4 + 2.9.5 From f1ccaaa4cf8f339f53fa33b261348970e4254395 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:05:17 -0700 Subject: [PATCH 0136/1214] Changed the way request uris are generated to address #138. In the future, it would be ideal to get the full request uri from API Gateway in the event. --- .../proxy/internal/SecurityUtils.java | 48 +++++++++++++++++++ .../servlet/AwsHttpServletRequest.java | 3 ++ .../servlet/AwsProxyHttpServletRequest.java | 40 ++++++++++++---- .../proxy/model/ContainerConfig.java | 29 +++++++++++ .../proxy/jersey/JerseyHandlerFilter.java | 26 +++++----- .../proxy/spring/SpringAwsProxyTest.java | 2 + 6 files changed, 124 insertions(+), 24 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index 9fab71c4..c10d74fb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -7,8 +7,11 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; /** @@ -18,6 +21,51 @@ public final class SecurityUtils { private static Logger log = LoggerFactory.getLogger(SecurityUtils.class); + private static Set SCHEMES = new HashSet() {{ + add("http"); + add("https"); + add("HTTP"); + add("HTTPS"); + }}; + + private static Set PORTS = new HashSet() {{ + add(443); + add(80); + add(3000); // we allow port 3000 for SAM local + }}; + + public static boolean isValidPort(String port) { + if (port == null) { + return false; + } + try { + int intPort = Integer.parseInt(port); + return PORTS.contains(intPort); + } catch (NumberFormatException e) { + log.error("Invalid port parameter: " + crlf(port)); + return false; + } + } + + public static boolean isValidScheme(String scheme) { + return SCHEMES.contains(scheme); + } + + public static boolean isValidHost(String host, String apiId, String region) { + if (host == null) { + return false; + } + if (host.endsWith(".amazonaws.com")) { + String defaultHost = new StringBuilder().append(apiId) + .append(".execute-api.") + .append(region) + .append(".amazonaws.com").toString(); + return host.equals(defaultHost); + } else { + return LambdaContainerHandler.getContainerConfig().getCustomDomainNames().contains(host); + } + } + /** * Replaces CRLF characters in a string with empty string (""). * @param s The string to be cleaned diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 8bbbda24..8c7ba8fa 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -64,6 +64,9 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { // We need this to pickup the protocol from the CloudFront header since Lambda doesn't receive this // information from anywhere else static final String CF_PROTOCOL_HEADER_NAME = "CloudFront-Forwarded-Proto"; + static final String PROTOCOL_HEADER_NAME = "X-Forwarded-Proto"; + static final String HOST_HEADER_NAME = "Host"; + static final String PORT_HEADER_NAME = "X-Forwarded-Port"; //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 65668b2b..3586a7fd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -501,22 +501,44 @@ public String getProtocol() { @Override public String getScheme() { - String headerValue = getHeaderCaseInsensitive(CF_PROTOCOL_HEADER_NAME); - if (headerValue == null) { - return "https"; + String cfScheme = getHeaderCaseInsensitive(CF_PROTOCOL_HEADER_NAME); + if (cfScheme != null && SecurityUtils.isValidScheme(cfScheme)) { + return cfScheme; + } + String gwScheme = getHeaderCaseInsensitive(PROTOCOL_HEADER_NAME); + if (gwScheme != null && SecurityUtils.isValidScheme(gwScheme)) { + return gwScheme; } - return headerValue; + // https is our default scheme + return "https"; } - @Override public String getServerName() { - String name = getHeaderCaseInsensitive(HttpHeaders.HOST); + String region = System.getenv("AWS_REGION"); + if (region == null) { + // this is not a critical failure, we just put a static region in the URI + region = "us-east-1"; + } - if (name == null || name.length() == 0) { - name = "lambda.amazonaws.com"; + String hostHeader = getHeaderCaseInsensitive(HOST_HEADER_NAME); + if (hostHeader != null && SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { + return hostHeader; + } + + return new StringBuilder().append(request.getRequestContext().getApiId()) + .append(".execute-api.") + .append(region) + .append(".amazonaws.com").toString(); + } + + public int getServerPort() { + String port = getHeaderCaseInsensitive(PORT_HEADER_NAME); + if (SecurityUtils.isValidPort(port)) { + return Integer.parseInt(port); + } else { + return 443; // default port } - return name; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 04344d3d..676697c3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -35,9 +35,11 @@ public static ContainerConfig defaultConfig() { private boolean consolidateSetCookieHeaders; private boolean useStageAsServletContext; private List validFilePaths; + private List customDomainNames; public ContainerConfig() { validFilePaths = new ArrayList<>(); + customDomainNames = new ArrayList<>(); } @@ -168,4 +170,31 @@ public void setValidFilePaths(List validFilePaths) { public void addValidFilePath(String filePath) { validFilePaths.add(filePath); } + + + /** + * Adds a new custom domain name to the list of allowed domains + * @param name The new custom domain name, excluding the scheme ("https") and port + */ + public void addCustomDomain(String name) { + customDomainNames.add(name); + } + + + /** + * Returns the list of custom domain names enabled for the application + * @return The configured custom domain names + */ + public List getCustomDomainNames() { + return customDomainNames; + } + + + /** + * Enables localhost custom domain name for testing. This setting should be used only in local + * with SAM local + */ + public void enableLocalhost() { + customDomainNames.add("localhost"); + } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 1741d49e..d77870d9 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -165,23 +165,19 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request return requestContext; } + @SuppressFBWarnings("SERVLET_SERVER_NAME") private URI getBaseUri(ServletRequest request, String basePath) { - ApiGatewayRequestContext apiGatewayCtx = (ApiGatewayRequestContext) request.getAttribute(API_GATEWAY_CONTEXT_PROPERTY); - String region = System.getenv("AWS_REGION"); - if (region == null) { - // this is not a critical failure, we just put a static region in the URI - region = "us-east-1"; + String finalBasePath = basePath; + if (!finalBasePath.startsWith("/")) { + finalBasePath = "/" + finalBasePath; } - StringBuilder uriBuilder = new StringBuilder(); - uriBuilder.append("https://") // we assume it's always https - .append(apiGatewayCtx.getApiId()) - .append(".execute-api.") - .append(region) - .append(".amazonaws.com") - .append("/"); - - - return UriBuilder.fromUri(uriBuilder.toString()).build(); + String uriString = new StringBuilder().append(request.getScheme()) + .append("://") + .append(request.getServerName()) + .append(":") + .append(request.getServerPort()) + .append(finalBasePath).toString(); + return UriBuilder.fromUri(uriString).build(); } //------------------------------------------------------------- diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 934cc66b..ca684485 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -1,5 +1,6 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -335,6 +336,7 @@ public void contextPath_generateLink_returnsCorrectPath() { .serverName("api.myserver.com") .stage("prod") .build(); + LambdaContainerHandler.getContainerConfig().addCustomDomain("api.myserver.com"); SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); AwsProxyResponse output = handler.proxy(request, lambdaContext); From 5c3c73d26e5ee80e9401c6b256705c5e2e072503 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:07:12 -0700 Subject: [PATCH 0137/1214] Added indexer to Spring sample for #131. --- samples/spring/pet-store/pom.xml | 66 ++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index cc784624..495680f6 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -27,6 +27,8 @@ 1.8 1.8 5.0.3.RELEASE + 4.12 + 2.8.2 @@ -42,7 +44,6 @@ 1.2.0 - org.springframework spring-webmvc @@ -55,11 +56,48 @@ ${spring.version} - + - io.symphonia - lambda-logging - 1.0.1 + org.springframework + spring-context-indexer + ${spring.version} + true + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.amazonaws + aws-lambda-java-log4j2 + 1.1.0 + + + + junit + junit + ${junit.version} + test @@ -69,17 +107,29 @@ org.apache.maven.plugins maven-shade-plugin 2.3 - - false - package shade + + false + + + + + + + + com.github.edwgiz + maven-shade-plugin.log4j2-cachefile-transformer + 2.8.1 + + From 37b036b2676a5ced3dbeda4a228ab0a9b5e95bea Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:08:16 -0700 Subject: [PATCH 0138/1214] Changed all samples to use regional endpoints --- samples/jersey/pet-store/sam.yaml | 6 ++++++ samples/spark/pet-store/sam.yaml | 6 ++++++ samples/spring/pet-store/sam.yaml | 6 ++++++ samples/springboot/pet-store/sam.yaml | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/samples/jersey/pet-store/sam.yaml b/samples/jersey/pet-store/sam.yaml index 40ca1e2d..dbac9bf8 100644 --- a/samples/jersey/pet-store/sam.yaml +++ b/samples/jersey/pet-store/sam.yaml @@ -1,6 +1,12 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Example Pet Store API written in jersey with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + Resources: PetStoreFunction: Type: AWS::Serverless::Function diff --git a/samples/spark/pet-store/sam.yaml b/samples/spark/pet-store/sam.yaml index c3df9bf8..eddfc9a2 100644 --- a/samples/spark/pet-store/sam.yaml +++ b/samples/spark/pet-store/sam.yaml @@ -1,6 +1,12 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Example Pet Store API written with spark with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + Resources: PetStoreFunction: Type: AWS::Serverless::Function diff --git a/samples/spring/pet-store/sam.yaml b/samples/spring/pet-store/sam.yaml index 0e1391fa..1e08ef03 100644 --- a/samples/spring/pet-store/sam.yaml +++ b/samples/spring/pet-store/sam.yaml @@ -1,6 +1,12 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Example Pet Store API written with spring with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + Resources: PetStoreFunction: Type: AWS::Serverless::Function diff --git a/samples/springboot/pet-store/sam.yaml b/samples/springboot/pet-store/sam.yaml index 53fbdf1f..201f7470 100644 --- a/samples/springboot/pet-store/sam.yaml +++ b/samples/springboot/pet-store/sam.yaml @@ -1,6 +1,12 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Example Pet Store API written with SpringBoot with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + Resources: PetStoreFunction: Type: AWS::Serverless::Function From 15fac4ae896b732d23210a522b5e0a2a07bc0259 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:11:04 -0700 Subject: [PATCH 0139/1214] Bump in archetype dependency of library (preparing for 1.1 release) and jackson. Added log4j configration to spring and spring boot sample to address #134/ --- .../resources/archetype-resources/pom.xml | 2 +- .../resources/archetype-resources/pom.xml | 4 +- .../META-INF/maven/archetype-metadata.xml | 6 ++ .../resources/archetype-resources/pom.xml | 61 +++++++++++++++++-- .../src/main/resources/log4j2.xml | 15 +++++ .../resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/application.properties | 3 + 7 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml create mode 100644 archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index 57479e34..5a9a2bcb 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.0.1 + 1.1 diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 5bfcfdfd..04eb1b39 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.9.4 + 2.9.5 2.7.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.0.1 + 1.1 diff --git a/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml index a6d71726..ab816387 100644 --- a/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -15,6 +15,12 @@ **/*.java + + src/main/resources + + **/*.xml + + diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index 9d0ab8c7..c7da99e7 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -16,13 +16,15 @@ 1.8 1.8 5.0.3.RELEASE + 4.12 + 2.8.2 com.amazonaws.serverless aws-serverless-java-container-spring - 1.0.1 + 1.1 @@ -37,10 +39,47 @@ ${spring.version} + + + org.springframework + spring-context-indexer + ${spring.version} + true + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.amazonaws + aws-lambda-java-log4j2 + 1.1.0 + + junit junit - 4.12 + ${junit.version} test @@ -52,17 +91,29 @@ org.apache.maven.plugins maven-shade-plugin 2.3 - - false - package shade + + false + + + + + + + + com.github.edwgiz + maven-shade-plugin.log4j2-cachefile-transformer + 2.8.1 + + diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml b/archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml new file mode 100644 index 00000000..fada3ade --- /dev/null +++ b/archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml @@ -0,0 +1,15 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n + + + + + + + + + \ No newline at end of file diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index 1f01ebbf..18351217 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.0.1 + 1.1 diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties b/archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties new file mode 100644 index 00000000..ec1cb979 --- /dev/null +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# Reduce logging level to make sure the application works with SAM local +# https://github.com/awslabs/aws-serverless-java-container/issues/134 +logging.level.root=WARN \ No newline at end of file From 8b8741a7f7ac87f9f4e64a42a4872e09b63c6ebe Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 16:47:00 -0700 Subject: [PATCH 0140/1214] Fixed query string encoding issue with jersey reported in #140. --- .../servlet/AwsHttpServletRequest.java | 18 +---------- .../proxy/jersey/JerseyHandlerFilter.java | 2 +- .../proxy/jersey/EchoJerseyResource.java | 16 ++++++++++ .../proxy/jersey/JerseyAwsProxyTest.java | 31 +++++++++++++++++++ samples/springboot/pet-store/sam.yaml | 2 +- 5 files changed, 50 insertions(+), 19 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 8c7ba8fa..29b14e97 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -299,23 +299,7 @@ protected String generateQueryString(Map parameters) { } queryString = parameters.keySet().stream() - .map(key -> { - String newKey = key; - String newValue = parameters.get(key); - try { - if (!URLEncoder.encode(newKey, StandardCharsets.UTF_8.name()).equals(newKey)) { - newKey = URLEncoder.encode(key, StandardCharsets.UTF_8.name()); - } - - if (!URLEncoder.encode(newValue, StandardCharsets.UTF_8.name()).equals(newValue)) { - newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name()); - } - } catch (UnsupportedEncodingException e) { - log.error(SecurityUtils.crlf("Could not URLEncode: " + newKey), e); - - } - return newKey + "=" + newValue; - }) + .map(key -> key + "=" + parameters.get(key)) .collect(Collectors.joining("&")); return queryString; } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index d77870d9..58aaf3e9 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -128,7 +128,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request } UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo()); - uriBuilder.replaceQuery(AwsProxyHttpServletRequest.decodeValueIfEncoded(servletRequest.getQueryString())); + uriBuilder.replaceQuery(servletRequest.getQueryString()); PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate(); apiGatewayProperties.setProperty(API_GATEWAY_CONTEXT_PROPERTY, servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY)); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 4e1e334a..83006329 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -44,6 +44,22 @@ public class EchoJerseyResource { @Context SecurityContext securityCtx; + @Path("/decoded-param") @GET + @Produces(MediaType.APPLICATION_JSON) + public SingleValueModel echoDecodedParam(@QueryParam("param") String param) { + SingleValueModel model = new SingleValueModel(); + model.setValue(param); + return model; + } + + @Path("/encoded-param") @GET + @Produces(MediaType.APPLICATION_JSON) + public SingleValueModel echoEncodedParam(@QueryParam("param") @Encoded String param) { + SingleValueModel model = new SingleValueModel(); + model.setValue(param); + return model; + } + @Path("/headers") @GET @Produces(MediaType.APPLICATION_JSON) public MapResponseModel echoHeaders(@Context ContainerRequestContext context) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 5427f08b..c11995fa 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -32,6 +32,9 @@ import javax.ws.rs.core.Response; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.UUID; import static org.junit.Assert.*; @@ -305,6 +308,34 @@ public void securityContext_injectPrincipal_expectPrincipalName() { validateSingleValueModel(resp, USER_PRINCIPAL); } + @Test + public void queryParam_encoding_expectUnencodedParam() { + String paramValue = "p%2Fz%2B3"; + String decodedParam = ""; + try { + decodedParam = URLDecoder.decode(paramValue, "UTF-8"); + System.out.println(decodedParam); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + fail("Could not decode parameter"); + } + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", paramValue).build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, decodedParam); + } + + @Test + public void queryParam_encoding_expectEncodedParam() { + String paramValue = "p%2Fz%2B3"; + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, paramValue); + } + private void validateMapResponseModel(AwsProxyResponse output) { validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); } diff --git a/samples/springboot/pet-store/sam.yaml b/samples/springboot/pet-store/sam.yaml index 201f7470..2e4a7183 100644 --- a/samples/springboot/pet-store/sam.yaml +++ b/samples/springboot/pet-store/sam.yaml @@ -6,7 +6,7 @@ Globals: Api: # API Gateway regional endpoints EndpointConfiguration: REGIONAL - + Resources: PetStoreFunction: Type: AWS::Serverless::Function From 6cd0ab716719299e6a29e43d32c54aa5f00404e9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 5 Apr 2018 17:06:27 -0700 Subject: [PATCH 0141/1214] Changed form parameter parser method to use request input stream instead of the raw API Gateway event body to address #141. --- .../servlet/AwsProxyHttpServletRequest.java | 8 +++++++- .../AwsProxyHttpServletRequestFormTest.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 3586a7fd..92c5a263 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -25,6 +25,7 @@ import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -756,7 +757,12 @@ private Map> getFormUrlEncodedParametersMap() { return urlEncodedFormParameters; } Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS"); - String rawBodyContent = request.getBody(); + String rawBodyContent = null; + try { + rawBodyContent = IOUtils.toString(getInputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 71d75033..ff09b7dd 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -15,6 +15,9 @@ import javax.ws.rs.core.MediaType; import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Base64; +import java.util.Map; import java.util.Random; import static org.junit.Assert.assertEquals; @@ -102,4 +105,18 @@ public void multipart_getParts_binary() { fail(e.getMessage()); } } + + @Test + public void postForm_getParamsBase64Encoded_expectAllParams() { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); + proxyRequest.setBody(Base64.getEncoder().encodeToString(ENCODED_FORM_ENTITY.getBytes(Charset.defaultCharset()))); + proxyRequest.setIsBase64Encoded(true); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + Map params = request.getParameterMap(); + assertNotNull(params); + assertEquals(2, params.size()); + assertEquals(true, params.containsKey(PART_KEY_1)); + } } From 5d82f78bf6b68538276b42352fcdef0290d2da59 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 6 Apr 2018 07:45:20 -0700 Subject: [PATCH 0142/1214] First import of changes for #142 - build is broken but working on fixes --- .../internal/LambdaContainerHandler.java | 12 ++- .../AwsLambdaServletContainerHandler.java | 20 ++--- .../jersey/JerseyLambdaContainerHandler.java | 55 ++++++------- .../spark/SparkLambdaContainerHandler.java | 63 ++++++++------- .../LambdaSpringApplicationInitializer.java | 23 ++++-- .../SpringBootLambdaContainerHandler.java | 79 +++++++++++-------- .../spring/SpringLambdaContainerHandler.java | 77 +++++++++++------- .../proxy/spring/SpringAwsProxyTest.java | 4 +- .../spring/echoapp/EchoSpringAppConfig.java | 17 +++- .../profile/DefaultProfileResource.java | 1 + .../profile/OverrideProfileConfiguration.java | 2 + .../spring/profile/SpringProfileTest.java | 17 ++++ 12 files changed, 216 insertions(+), 154 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 23c37e6e..b3f6c2de 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal; +import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.LogFormatter; import com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter; import com.amazonaws.serverless.proxy.model.ContainerConfig; @@ -100,6 +101,8 @@ protected LambdaContainerHandler(Class requestClass, this.responseWriter = responseWriter; this.securityContextWriter = securityContextWriter; this.exceptionHandler = exceptionHandler; + objectReader = getObjectMapper().readerFor(requestTypeClass); + objectWriter = getObjectMapper().writerFor(responseTypeClass); } @@ -113,6 +116,8 @@ protected LambdaContainerHandler(Class requestClass, protected abstract void handleRequest(ContainerRequestType containerRequest, ContainerResponseType containerResponse, Context lambdaContext) throws Exception; + public abstract void initialize() + throws ContainerInitializationException; //------------------------------------------------------------- // Methods - Public @@ -191,16 +196,9 @@ public void proxyStream(InputStream input, OutputStream output, Context context) throws IOException { try { - if (objectReader == null) { - objectReader = getObjectMapper().readerFor(requestTypeClass); - } RequestType request = objectReader.readValue(input); ResponseType resp = proxy(request, context); - if (objectWriter == null) { - objectWriter = getObjectMapper().writerFor(responseTypeClass); - } - objectWriter.writeValue(output, resp); } catch (JsonParseException e) { log.error("Error while parsing request object stream", e); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index cf1f80ff..36445c3b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -54,15 +54,15 @@ public abstract class AwsLambdaServletContainerHandler filterChainManager; + private boolean startupExecuted; //------------------------------------------------------------- // Variables - Protected //------------------------------------------------------------- protected StartupHandler startupHandler; - private FilterChainManager filterChainManager; + protected ServletContext servletContext; //------------------------------------------------------------- @@ -78,6 +78,8 @@ protected AwsLambdaServletContainerHandler(Class requestTypeClass, super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); // set the default log formatter for servlet implementations setLogFormatter(new ApacheCombinedServletLogFormatter<>()); + setServletContext(new AwsServletContext(this)); + startupExecuted = false; } //------------------------------------------------------------- @@ -154,17 +156,7 @@ private HttpServletResponse getServletResponse(ContainerResponseType resp) { */ public void onStartup(final StartupHandler h) { startupHandler = h; - } - - @Override - protected void handleRequest(ContainerRequestType containerRequest, ContainerResponseType containerResponse, Context lambdaContext) - throws Exception { - // The servlet context should not be linked to a specific request object, only to the Lambda - // context so we only set it once. - // TODO: In the future, if we decide to support multiple servlets/contexts in an instance we only need to modify this method - if (getServletContext() == null) { - setServletContext(new AwsServletContext(this)); - } + startupHandler.onStartup(getServletContext()); } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index f6bd3194..54a4ac0c 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -79,11 +79,8 @@ public class JerseyLambdaContainerHandler extends Aws //------------------------------------------------------------- private JerseyHandlerFilter jerseyFilter; - - // tracker for the first request private boolean initialized; - //------------------------------------------------------------- // Methods - Public - Static //------------------------------------------------------------- @@ -98,13 +95,15 @@ public class JerseyLambdaContainerHandler extends Aws * @return A JerseyLambdaContainerHandler object */ public static JerseyLambdaContainerHandler getAwsProxyHandler(Application jaxRsApplication) { - return new JerseyLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - jaxRsApplication); + JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>(AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + jaxRsApplication); + newHandler.initialize(); + return newHandler; } @@ -133,8 +132,7 @@ public JerseyLambdaContainerHandler(Class requestTypeClass, super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("JERSEY_CONTAINER_CONSTRUCTOR"); - this.initialized = false; - + initialized = false; if (jaxRsApplication instanceof ResourceConfig) { ((ResourceConfig)jaxRsApplication).register(new AbstractBinder() { @Override @@ -162,29 +160,28 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest @Override protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { - - Timer.start("JERSEY_HANDLE_REQUEST"); - // this method of the AwsLambdaServletContainerHandler sets the request context - super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); - + // we retain the initialized property for backward compatibility if (!initialized) { - Timer.start("JERSEY_COLD_START_INIT"); - // call the onStartup event if set to give developers a chance to set filters in the context - if (startupHandler != null) { - startupHandler.onStartup(getServletContext()); - } - - // manually add the spark filter to the chain. This should the last one and match all uris - FilterRegistration.Dynamic jerseyFilterReg = getServletContext().addFilter("JerseyFilter", jerseyFilter); - jerseyFilterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - - initialized = true; - Timer.stop("JERSEY_COLD_START_INIT"); + initialize(); } + Timer.start("JERSEY_HANDLE_REQUEST"); httpServletRequest.setServletContext(getServletContext()); doFilter(httpServletRequest, httpServletResponse, null); Timer.stop("JERSEY_HANDLE_REQUEST"); } + + + @Override + public void initialize() { + Timer.start("JERSEY_COLD_START_INIT"); + + // manually add the spark filter to the chain. This should the last one and match all uris + FilterRegistration.Dynamic jerseyFilterReg = getServletContext().addFilter("JerseyFilter", jerseyFilter); + jerseyFilterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + + Timer.stop("JERSEY_COLD_START_INIT"); + initialized = true; + } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index c4920831..bf7384f6 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -106,13 +106,18 @@ public class SparkLambdaContainerHandler */ public static SparkLambdaContainerHandler getAwsProxyHandler() throws ContainerInitializationException { - return new SparkLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - new LambdaEmbeddedServerFactory()); + SparkLambdaContainerHandler newHandler = new SparkLambdaContainerHandler<>(AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + new LambdaEmbeddedServerFactory()); + + // For Spark we cannot call intialize here. It needs to be called manually after the routes are set + //newHandler.initialize(); + + return newHandler; } //------------------------------------------------------------- @@ -180,36 +185,36 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { Timer.start("SPARK_HANDLE_REQUEST"); - // this method of the AwsLambdaServletContainerHandler sets the request context - super.handleRequest(httpServletRequest, httpServletResponse, lambdaContext); if (embeddedServer == null) { - Timer.start("SPARK_COLD_START"); - log.debug("First request, getting new server instance"); + initialize(); + } - // trying to call init in case the embedded server had not been initialized. - Spark.init(); + httpServletRequest.setServletContext(getServletContext()); - // adding this call to make sure that the framework is fully initialized. This should address a race - // condition and solve GitHub issue #71. - Spark.awaitInitialization(); + doFilter(httpServletRequest, httpServletResponse, null); + Timer.stop("SPARK_HANDLE_REQUEST"); + } - embeddedServer = lambdaServerFactory.getServerInstance(); - // call the onStartup event if set to give developers a chance to set filters in the context - if (startupHandler != null) { - startupHandler.onStartup(getServletContext()); - } + @Override + public void initialize() + throws ContainerInitializationException { + Timer.start("SPARK_COLD_START"); + log.debug("First request, getting new server instance"); - // manually add the spark filter to the chain. This should the last one and match all uris - FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); - sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - Timer.stop("SPARK_COLD_START"); - } + // trying to call init in case the embedded server had not been initialized. + Spark.init(); - httpServletRequest.setServletContext(getServletContext()); + // adding this call to make sure that the framework is fully initialized. This should address a race + // condition and solve GitHub issue #71. + Spark.awaitInitialization(); - doFilter(httpServletRequest, httpServletResponse, null); - Timer.stop("SPARK_HANDLE_REQUEST"); + embeddedServer = lambdaServerFactory.getServerInstance(); + + // manually add the spark filter to the chain. This should the last one and match all uris + FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); + sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + Timer.stop("SPARK_COLD_START"); } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 615ddedc..89102ccc 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -21,6 +21,8 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextStoppedEvent; +import org.springframework.context.event.GenericApplicationListenerAdapter; +import org.springframework.context.support.AbstractRefreshableApplicationContext; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.ContextLoaderListener; @@ -125,6 +127,13 @@ public List getSpringProfiles() { public void setSpringProfiles(List springProfiles) { this.springProfiles = new ArrayList<>(springProfiles); + applicationContext.stop(); + applicationContext.close(); + applicationContext.getEnvironment().setActiveProfiles(springProfiles.toArray(new String[0])); + //applicationContext.start(); + applicationContext.refresh(); + + //dispatcherServlet.refresh(); } @Override @@ -135,20 +144,18 @@ public void onStartup(ServletContext servletContext) throws ServletException { } applicationContext.setServletContext(servletContext); - DefaultDispatcherConfig dispatcherConfig = new DefaultDispatcherConfig(servletContext); applicationContext.setServletConfig(dispatcherConfig); // Configure the listener for the request handled events. All we do here is release the latch - applicationContext.addApplicationListener(new ApplicationListener() { - @Override - public void onApplicationEvent(ServletRequestHandledEvent servletRequestHandledEvent) { - try { + applicationContext.addApplicationListener((ApplicationListener) servletRequestHandledEvent -> { + try { + if (currentResponse != null) { currentResponse.flushBuffer(); - } catch (IOException e) { - log.error("Could not flush response buffer", e); - throw new RuntimeException("Could not flush response buffer", e); } + } catch (IOException e) { + log.error("Could not flush response buffer", e); + throw new RuntimeException("Could not flush response buffer", e); } }); diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index bd4dda75..72c60e08 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -53,6 +53,7 @@ public class SpringBootLambdaContainerHandler extends private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); private String[] springProfiles = null; + private DispatcherServlet dispatcherServlet; // State vars private boolean initialized; @@ -65,15 +66,16 @@ public class SpringBootLambdaContainerHandler extends */ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) throws ContainerInitializationException { - return new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer - ); + SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer); + newHandler.initialize(); + return newHandler; } /** @@ -97,6 +99,7 @@ public SpringBootLambdaContainerHandler(Class requestTypeClass, throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); + setServletContext(new SpringBootAwsServletContext()); this.springBootInitializer = springBootInitializer; Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); } @@ -116,45 +119,51 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { // this method of the AwsLambdaServletContainerHandler sets the servlet context Timer.start("SPRINGBOOT_HANDLE_REQUEST"); - if (getServletContext() == null) { - setServletContext(new SpringBootAwsServletContext()); - } // wire up the application context on the first invocation if (!initialized) { - Timer.start("SPRINGBOOT_COLD_START"); - if (springProfiles != null && springProfiles.length > 0) { - System.setProperty("spring.profiles.active", String.join(",", springProfiles)); - } - SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); - LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); - webAppInitializers.add(springBootInitializer); - springServletContainerInitializer.onStartup(webAppInitializers, getServletContext()); + initialize(); + } - if (springProfiles != null && springProfiles.length > 0) { - ConfigurableEnvironment springEnv = new StandardEnvironment(); - springEnv.setActiveProfiles(springProfiles); - } + containerRequest.setServletContext(getServletContext()); + + // process filters & invoke servlet + doFilter(containerRequest, containerResponse, dispatcherServlet); + Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); + } - // call the onStartup event if set to give developers a chance to set filters in the context - if (startupHandler != null) { - startupHandler.onStartup(getServletContext()); - } - initialized = true; - Timer.stop("SPRINGBOOT_COLD_START"); + @Override + public void initialize() + throws ContainerInitializationException { + Timer.start("SPRINGBOOT_COLD_START"); + + if (springProfiles != null && springProfiles.length > 0) { + System.setProperty("spring.profiles.active", String.join(",", springProfiles)); + } + SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); + LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); + webAppInitializers.add(springBootInitializer); + try { + springServletContainerInitializer.onStartup(webAppInitializers, getServletContext()); + } catch (ServletException e) { + throw new ContainerInitializationException("Could not initialize Spring Boot", e); } - containerRequest.setServletContext(getServletContext()); + if (springProfiles != null && springProfiles.length > 0) { + ConfigurableEnvironment springEnv = new StandardEnvironment(); + springEnv.setActiveProfiles(springProfiles); + } WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); - DispatcherServlet dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); - // process filters & invoke servlet - doFilter(containerRequest, containerResponse, dispatcherServlet); - Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); + dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + + initialized = true; + Timer.stop("SPRINGBOOT_COLD_START"); } + private class SpringBootAwsServletContext extends AwsServletContext { public SpringBootAwsServletContext() { super(SpringBootLambdaContainerHandler.this); diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 3c9eae71..33885d09 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -27,6 +27,8 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import javax.servlet.ServletException; + import java.util.Arrays; import java.util.concurrent.CountDownLatch; @@ -43,7 +45,6 @@ public class SpringLambdaContainerHandler extends Aws // State vars private boolean initialized; - /** * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects * @param config A set of classes annotated with the Spring @Configuration annotation @@ -54,15 +55,7 @@ public static SpringLambdaContainerHandler ge AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); applicationContext.register(config); - return new SpringLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - applicationContext - ); + return getAwsProxyHandler(applicationContext); } /** @@ -73,15 +66,38 @@ public static SpringLambdaContainerHandler ge */ public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext) throws ContainerInitializationException { - return new SpringLambdaContainerHandler<>( + SpringLambdaContainerHandler newHandler = new SpringLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + applicationContext); + newHandler.initialize(); + return newHandler; + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and sets the given profiles as active + * @param applicationContext A custom ConfigurableWebApplicationContext to be used + * @param profiles The spring profiles to activate + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException + */ + public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext, String... profiles) + throws ContainerInitializationException { + SpringLambdaContainerHandler newHandler = new SpringLambdaContainerHandler<>( AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), - applicationContext - ); + applicationContext); + newHandler.activateSpringProfiles(profiles); + newHandler.initialize(); + return newHandler; } /** @@ -104,6 +120,7 @@ public SpringLambdaContainerHandler(Class requestTypeClass, throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); + initialized = false; initializer = new LambdaSpringApplicationInitializer(applicationContext); Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); } @@ -134,7 +151,8 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest /** - * Activates the given Spring profiles in the application. + * Activates the given Spring profiles in the application. This method will cause the context to be + * refreshed. To use a single Spring profile, use the static method {@link SpringLambdaContainerHandler#getAwsProxyHandler(ConfigurableWebApplicationContext, String...)} * @param profiles A number of spring profiles * @throws ContainerInitializationException if the initializer is not set yet. */ @@ -153,22 +171,9 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null); } - // this method of the AwsLambdaServletContainerHandler sets the request context - super.handleRequest(containerRequest, containerResponse, lambdaContext); - // wire up the application context on the first invocation if (!initialized) { - Timer.start("SPRING_COLD_START"); - - initializer.onStartup(getServletContext()); - - // call the onStartup event if set to give developers a chance to set filters in the context - if (startupHandler != null) { - startupHandler.onStartup(getServletContext()); - } - - initialized = true; - Timer.stop("SPRING_COLD_START"); + initialize(); } containerRequest.setServletContext(getServletContext()); @@ -177,4 +182,20 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt doFilter(containerRequest, containerResponse, initializer); Timer.stop("SPRING_HANDLE_REQUEST"); } + + + @Override + public void initialize() + throws ContainerInitializationException { + Timer.start("SPRING_COLD_START"); + + try { + initializer.onStartup(getServletContext()); + } catch (ServletException e) { + throw new ContainerInitializationException("Could not initialize Spring", e); + } + + initialized = true; + Timer.stop("SPRING_COLD_START"); + } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index ca684485..3dfa855a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -55,10 +55,10 @@ public class SpringAwsProxyTest { @Autowired private SpringLambdaContainerHandler handler; - @Before + /*@Before public void clearServletContextCache() { AwsServletContext.clearServletContextCache(); - } + }*/ @Test public void controllerAdvice_invalidPath_returnAdvice() { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index 68d1fa27..b5a42d98 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -1,7 +1,13 @@ package com.amazonaws.serverless.proxy.spring.echoapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -29,8 +35,16 @@ public class EchoSpringAppConfig { @Bean public SpringLambdaContainerHandler springLambdaContainerHandler() throws ContainerInitializationException { - SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(applicationContext); + SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + applicationContext); handler.setRefreshContext(false); + handler.initialize(); handler.onStartup(c -> { FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); // update the registration to map to a path @@ -39,7 +53,6 @@ public SpringLambdaContainerHandler springLambdaContainerHandler() throws Contai handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); }); - return handler; } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java index 5b6cdea2..e365bd5e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java index 4e03f80e..8d12b967 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java @@ -3,6 +3,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + @Configuration @Profile("override") diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index 60354e28..c033b5a0 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -1,5 +1,9 @@ package com.amazonaws.serverless.proxy.spring.profile; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -18,6 +22,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import static org.junit.Assert.assertEquals; @@ -57,7 +62,19 @@ public void profile_defaultProfile() throws Exception { public void profile_overrideProfile() throws Exception { AwsProxyRequest request = new AwsProxyRequestBuilder("/profile/spring-properties", "GET") .build(); + /* + This change works + AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); + applicationContext.register(EchoSpringAppConfig.class); + SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>(AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), applicationContext); + handler.activateSpringProfiles("override"); + handler.initialize();*/ SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); handler.activateSpringProfiles("override"); AwsProxyResponse output = handler.proxy(request, lambdaContext); From 0a81cde5b3ff83acd10b12e244eaa08b55994734 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 6 Apr 2018 09:23:27 -0700 Subject: [PATCH 0143/1214] Performance improvement fixes for profile set and reload. Completing first two items in #142. --- .../LambdaSpringApplicationInitializer.java | 23 ++++++++++--------- .../SpringBootLambdaContainerHandler.java | 23 +++++++++++++++++++ .../spring/SpringLambdaContainerHandler.java | 4 ++-- .../proxy/spring/SpringAwsProxyTest.java | 4 ++-- .../spring/profile/SpringProfileTest.java | 13 ----------- 5 files changed, 39 insertions(+), 28 deletions(-) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 89102ccc..d2a40c04 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -66,7 +67,7 @@ public class LambdaSpringApplicationInitializer extends HttpServlet implements W private volatile boolean refreshContext = true; @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") private transient volatile List contextListeners; - private volatile ArrayList springProfiles; + private volatile List springProfiles; // Dynamically instantiated properties private volatile DispatcherServlet dispatcherServlet; @@ -121,19 +122,19 @@ public DispatcherServlet getDispatcherServlet() { return dispatcherServlet; } - public List getSpringProfiles() { - return Collections.unmodifiableList(springProfiles); - } + public void setSpringProfiles(ServletContext ctx, String... springProfiles) + throws ContainerInitializationException { + this.springProfiles = Arrays.asList(springProfiles); - public void setSpringProfiles(List springProfiles) { - this.springProfiles = new ArrayList<>(springProfiles); - applicationContext.stop(); + applicationContext.registerShutdownHook(); applicationContext.close(); - applicationContext.getEnvironment().setActiveProfiles(springProfiles.toArray(new String[0])); - //applicationContext.start(); - applicationContext.refresh(); + contextListeners.clear(); + try { + onStartup(ctx); + } catch (ServletException e) { + throw new ContainerInitializationException("Could not reload Spring context", e); + } - //dispatcherServlet.refresh(); } @Override diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 72c60e08..6de1fcaf 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -78,6 +78,28 @@ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer); + newHandler.activateSpringProfiles(profiles); + newHandler.initialize(); + return newHandler; + } + /** * Creates a new container handler with the given reader and writer objects * @@ -100,6 +122,7 @@ public SpringBootLambdaContainerHandler(Class requestTypeClass, super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); setServletContext(new SpringBootAwsServletContext()); + initialized = false; this.springBootInitializer = springBootInitializer; Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 33885d09..18bd5a21 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -160,8 +160,8 @@ public void activateSpringProfiles(String... profiles) throws ContainerInitializ if (initializer == null) { throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null); } - - initializer.setSpringProfiles(Arrays.asList(profiles)); + setServletContext(new AwsServletContext(this)); + initializer.setSpringProfiles(getServletContext(), profiles); } @Override diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 3dfa855a..ca684485 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -55,10 +55,10 @@ public class SpringAwsProxyTest { @Autowired private SpringLambdaContainerHandler handler; - /*@Before + @Before public void clearServletContextCache() { AwsServletContext.clearServletContextCache(); - }*/ + } @Test public void controllerAdvice_invalidPath_returnAdvice() { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index c033b5a0..82ec9db5 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -62,19 +62,6 @@ public void profile_defaultProfile() throws Exception { public void profile_overrideProfile() throws Exception { AwsProxyRequest request = new AwsProxyRequestBuilder("/profile/spring-properties", "GET") .build(); - /* - This change works - AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); - applicationContext.register(EchoSpringAppConfig.class); - SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), applicationContext); - - handler.activateSpringProfiles("override"); - handler.initialize();*/ SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); handler.activateSpringProfiles("override"); AwsProxyResponse output = handler.proxy(request, lambdaContext); From 7bdafcad363524a0ea73220fa00f52a70ba6e5db Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 6 Apr 2018 10:52:07 -0700 Subject: [PATCH 0144/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.1 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index a0cd269e..fd35d817 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1-SNAPSHOT + 1.1 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index af3c2acb..c5203438 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1-SNAPSHOT + 1.1 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 0bcb6d09..d64d7c2a 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1-SNAPSHOT + 1.1 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index d0d1b82d..6f53a08e 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1-SNAPSHOT + 1.1 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index bd5a3d2e..1820d68e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 843b72f1..645709c0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 87c9d17e..69e704b2 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index dbf03a06..641bac2f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1-SNAPSHOT + 1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1-SNAPSHOT + 1.1 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1-SNAPSHOT + 1.1 diff --git a/pom.xml b/pom.xml index 2c91c3f0..0c9f1702 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1-SNAPSHOT + 1.1 AWS Serverless Java container From 7c754ebe19ed6eb052da2339c0894f47a3eab380 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 6 Apr 2018 10:52:08 -0700 Subject: [PATCH 0145/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index fd35d817..459bdfac 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index c5203438..196b1a42 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index d64d7c2a..b69b5728 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 6f53a08e..af4cb0f1 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1820d68e..278a5a98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 645709c0..9e7998ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1 + 1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 69e704b2..65912e8a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 641bac2f..04ee52c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1 + 1.2-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1 + 1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 0c9f1702..c36feaa9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1 + 1.2-SNAPSHOT AWS Serverless Java container From 7678d3cd0e844c14e00f506d3c5309400942688b Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 18 Jun 2018 13:50:33 -0700 Subject: [PATCH 0146/1214] Changes to address query string encoding/reading from issues #146, #154, and #156 --- .../servlet/AwsHttpServletRequest.java | 16 +- .../servlet/AwsProxyHttpServletRequest.java | 77 ++++---- .../EncodingQueryStringParameterMap.java | 89 +++++++++ .../testutils/AwsProxyRequestBuilder.java | 5 + .../proxy/model/ContainerConfig.java | 22 +++ .../servlet/AwsHttpServletRequestTest.java | 21 ++- .../proxy/jersey/JerseyHandlerFilter.java | 7 +- .../proxy/jersey/EchoJerseyResource.java | 9 + .../proxy/jersey/JerseyAwsProxyTest.java | 80 +-------- .../proxy/jersey/JerseyParamEncodingTest.java | 169 ++++++++++++++++++ 10 files changed, 367 insertions(+), 128 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 29b14e97..7c74772d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -290,7 +290,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { * @param parameters A Map<String, String> of query string parameters * @return The generated query string for the URI */ - protected String generateQueryString(Map parameters) { + protected String generateQueryString(EncodingQueryStringParameterMap parameters) { if (parameters == null || parameters.size() == 0) { return null; } @@ -298,9 +298,17 @@ protected String generateQueryString(Map parameters) { return queryString; } - queryString = parameters.keySet().stream() - .map(key -> key + "=" + parameters.get(key)) - .collect(Collectors.joining("&")); + StringBuilder queryStringBuilder = new StringBuilder(); + + parameters.keySet().stream().forEach(k -> parameters.get(k).stream().forEach(v -> { + queryStringBuilder.append("&"); + queryStringBuilder.append(k); + queryStringBuilder.append("="); + queryStringBuilder.append(v); + })); + + queryString = queryStringBuilder.toString(); + queryString = queryString.substring(1); // remove the first & - faster to do it here than adding logic in the Lambda return queryString; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 92c5a263..43930013 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -86,6 +86,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private SecurityContext securityContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; + private EncodingQueryStringParameterMap queryStringParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; @@ -104,6 +105,9 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.request = awsProxyRequest; this.securityContext = awsSecurityContext; this.config = config; + + this.queryStringParameters = new EncodingQueryStringParameterMap(config.isQueryStringCaseSensitive(), config.getUriEncoding()); + this.queryStringParameters.putAllMapEncoding(request.getQueryStringParameters()); } @@ -222,7 +226,7 @@ public String getContextPath() { @Override public String getQueryString() { - return this.generateQueryString(request.getQueryStringParameters()); + return this.generateQueryString(queryStringParameters); } @@ -419,7 +423,11 @@ public ServletInputStream getInputStream() @Override public String getParameter(String s) { - String queryStringParameter = getQueryStringParameterCaseInsensitive(s); + String paramKey = s; + if (config.isQueryStringCaseSensitive()) { + paramKey = paramKey.toLowerCase(Locale.getDefault()); + } + String queryStringParameter = queryStringParameters.getFirst(paramKey); if (queryStringParameter != null) { return queryStringParameter; } @@ -436,21 +444,21 @@ public String getParameter(String s) { @Override public Enumeration getParameterNames() { List paramNames = new ArrayList<>(); - if (request.getQueryStringParameters() != null) { - paramNames.addAll(request.getQueryStringParameters().keySet()); - } + paramNames.addAll(queryStringParameters.keySet()); paramNames.addAll(getFormUrlEncodedParametersMap().keySet()); return Collections.enumeration(paramNames); } @Override + @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - List values = new ArrayList<>(); - String queryStringValue = getQueryStringParameterCaseInsensitive(s); - if (queryStringValue != null) { - values.add(queryStringValue); + String paramKey = s; + if (config.isQueryStringCaseSensitive()) { + paramKey = paramKey.toLowerCase(Locale.getDefault()); } + List values = new ArrayList<>(); + values.addAll(queryStringParameters.get(paramKey)); String[] formBodyValues = getFormBodyParameterCaseInsensitive(s); if (formBodyValues != null) { @@ -458,11 +466,9 @@ public String[] getParameterValues(String s) { } if (values.size() == 0) { - return new String[0]; + return null; } else { - String[] valuesArray = new String[values.size()]; - valuesArray = values.toArray(valuesArray); - return valuesArray; + return values.toArray(new String[0]); } } @@ -472,24 +478,14 @@ public Map getParameterMap() { Map output = new HashMap<>(); Map> params = getFormUrlEncodedParametersMap(); + params.entrySet().stream().parallel().forEach(e -> { + output.put(e.getKey(), e.getValue().toArray(new String[0])); + }); - if (request.getQueryStringParameters() != null) { - for (Map.Entry entry : request.getQueryStringParameters().entrySet()) { - if (params.containsKey(entry.getKey()) && !params.get(entry.getKey()).contains(entry.getValue())) { - params.get(entry.getKey()).add(entry.getValue()); - } else { - List valueList = new ArrayList<>(); - valueList.add(entry.getValue()); - params.put(entry.getKey(), valueList); - } - } - } + queryStringParameters.keySet().stream().parallel().forEach(e -> { + output.put(e, queryStringParameters.get(e).toArray(new String[0])); + }); - for (Map.Entry> entry : params.entrySet()) { - String[] valuesArray = new String[entry.getValue().size()]; - valuesArray = entry.getValue().toArray(valuesArray); - output.put(entry.getKey(), valuesArray); - } return output; } @@ -631,6 +627,14 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se return null; } + //------------------------------------------------------------- + // Methods - Protected + //------------------------------------------------------------- + + protected EncodingQueryStringParameterMap getQueryParametersMap() { + return queryStringParameters; + } + //------------------------------------------------------------- // Methods - Private //------------------------------------------------------------- @@ -656,21 +660,6 @@ private String getHeaderCaseInsensitive(String key) { return null; } - - private String getQueryStringParameterCaseInsensitive(String key) { - if (request.getQueryStringParameters() == null) { - return null; - } - - for (String requestParamKey : request.getQueryStringParameters().keySet()) { - if (key.toLowerCase(Locale.ENGLISH).equals(requestParamKey.toLowerCase(Locale.ENGLISH))) { - return request.getQueryStringParameters().get(requestParamKey); - } - } - return null; - } - - private String[] getFormBodyParameterCaseInsensitive(String key) { List values = getFormUrlEncodedParametersMap().get(key); if (values != null) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java new file mode 100644 index 00000000..31c0b65d --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java @@ -0,0 +1,89 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import com.amazonaws.serverless.proxy.internal.SecurityUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.core.MultivaluedHashMap; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + + +/** + * query string parameters container. The main purpose of this object is to apply the required transformation to query + * string parameters coming from API Gateway. Specifically, parameters names and values need to be un-escaped and url-encoded + * again. + */ +public class EncodingQueryStringParameterMap extends MultivaluedHashMap { + + private boolean isCaseSensitive; + private String encoding; + private static Logger log = LoggerFactory.getLogger(EncodingQueryStringParameterMap.class); + + private static final long serialVersionUID = 42L; + + /** + * Creates a new instance of the parameters map. This allows the configuration to specify whether query string parameter + * names should be case sensitive or not. + * @param caseSensitive Whether parameters should be case sensitive. If the value is true, parameters names + * are automatically trnasformed to lower case as they are added to the map. + */ + public EncodingQueryStringParameterMap(final boolean caseSensitive, final String enc) { + isCaseSensitive = caseSensitive; + encoding = enc; + } + + public void putAllMapEncoding(final Map parametersMap) { + if (parametersMap == null) { + return; + } + parametersMap.entrySet().stream().forEach(e -> { + String key = e.getKey(); + if (!isCaseSensitive) { + key = key.toLowerCase(Locale.getDefault()); + } + key = unescapeAndEncode(key); + + String value = unescapeAndEncode(e.getValue()); + putSingle(key, value); + }); + } + + public void putAllMultiValuedMapEncoding(final MultivaluedHashMap parametersMap) { + if (parametersMap == null) { + return; + } + parametersMap.entrySet().stream().forEach(e -> { + String key = e.getKey(); + if (!isCaseSensitive) { + key = key.toLowerCase(Locale.getDefault()); + } + key = unescapeAndEncode(key); + + List newValueList = new ArrayList(); + // we don't expect the values to be many so we don't parallel() + e.getValue().stream().forEach(v -> { + newValueList.add(unescapeAndEncode(v)); + }); + + put(key, newValueList); + }); + } + + private String unescapeAndEncode(final String value) { + try { + return URLEncoder.encode(value, encoding); + } catch (UnsupportedEncodingException e) { + log.error("Could not url encode parameter value: " + SecurityUtils.crlf(value), e); + } + + return null; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index dc5bab9e..62fdba4d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -147,6 +147,11 @@ public AwsProxyRequestBuilder body(String body) { return this; } + public AwsProxyRequestBuilder nullBody() { + this.request.setBody(null); + return this; + } + public AwsProxyRequestBuilder body(Object body) { if (request.getHeaders() != null && request.getHeaders().get(HttpHeaders.CONTENT_TYPE).equals(MediaType.APPLICATION_JSON)) { try { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 676697c3..37cfd2a2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -21,6 +21,7 @@ public static ContainerConfig defaultConfig() { configuration.setConsolidateSetCookieHeaders(true); configuration.setUseStageAsServletContext(false); configuration.setValidFilePaths(DEFAULT_FILE_PATHS); + configuration.setQueryStringCaseSensitive(false); return configuration; } @@ -36,6 +37,7 @@ public static ContainerConfig defaultConfig() { private boolean useStageAsServletContext; private List validFilePaths; private List customDomainNames; + private boolean queryStringCaseSensitive; public ContainerConfig() { validFilePaths = new ArrayList<>(); @@ -197,4 +199,24 @@ public List getCustomDomainNames() { public void enableLocalhost() { customDomainNames.add("localhost"); } + + + /** + * Whether query string parameters in the request should be case sensitive or not. By default + * this is set to false for backward compatibility. + * @return true if the parameter matching algorithm is case sensitive + */ + public boolean isQueryStringCaseSensitive() { + return queryStringCaseSensitive; + } + + + /** + * Sets whether query string parameter names should be treated as case sensitive. The default + * value of this option is false for backward compatibility. + * @param queryStringCaseSensitive Tells the framework to treat query string parmaeter names as case sensitive + */ + public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) { + this.queryStringCaseSensitive = queryStringCaseSensitive; + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 70106e0a..976f8bfc 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -27,6 +27,8 @@ public class AwsHttpServletRequestTest { .header(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8").build(); private static final AwsProxyRequest queryString = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("three", "four").build(); + private static final AwsProxyRequest encodedQueryString = new AwsProxyRequestBuilder("/test", "GET") + .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").build(); private static final MockLambdaContext mockContext = new MockLambdaContext(); @@ -72,12 +74,23 @@ public void headers_parseHeaderValue_complexAccept() { } @Test - public void queyrString_generateQueryString_validQuery() { + public void queryString_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); - String parsedString = request.generateQueryString(queryString.getQueryStringParameters()); - assertEquals("one=two&three=four", parsedString); + String parsedString = request.generateQueryString(request.getQueryParametersMap()); + System.out.println(parsedString); + assertTrue(parsedString.contains("one=two")); + assertTrue(parsedString.contains("three=four")); + assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); + } + + @Test + public void queryStringWithEncodedParams_generateQueryString_validQuery() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); - // TODO test url encoding, wrong parameters + String parsedString = request.generateQueryString(request.getQueryParametersMap()); + assertTrue(parsedString.contains("one=two")); + assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 58aaf3e9..fbec6769 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -1,10 +1,8 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.glassfish.jersey.internal.MapPropertiesDelegate; @@ -59,7 +57,7 @@ public class JerseyHandlerFilter implements Filter, Container { /** * Constructs a new handler filter with a Jax RS application object. - * @param jaxApplication + * @param jaxApplication The JAX RS application to load */ JerseyHandlerFilter(Application jaxApplication) { Timer.start("JERSEY_FILTER_CONSTRUCTOR"); @@ -138,7 +136,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request ContainerRequest requestContext = new ContainerRequest( null, // jersey uses "/" by default - uriBuilder.build(), + uriBuilder.build(), //requestUri, servletRequest.getMethod().toUpperCase(Locale.ENGLISH), (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), apiGatewayProperties); @@ -161,6 +159,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request //requestContext.header(headerKey, servletRequest.getHeader(headerKey)); requestContext.getHeaders().add(headerKey, servletRequest.getHeader(headerKey)); } + Timer.stop("JERSEY_SERVLET_REQUEST_TO_CONTAINER"); return requestContext; } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 83006329..a2ebcf7f 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -181,6 +181,15 @@ public Response echoBinaryData() { return Response.ok(b).build(); } + @Path("/empty-stream/{paramId}/test/{param2}") @PUT + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + public Response emptyStream(@PathParam("paramId") String paramId, @PathParam("param2") String param2) { + SingleValueModel sv = new SingleValueModel(); + sv.setValue(paramId); + return Response.ok(sv).build(); + } + @Path("/exception") @GET public Response throwException() { throw new UnsupportedOperationException(EXCEPTION_MESSAGE); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index c11995fa..365fe0e5 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -29,12 +29,11 @@ import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; import java.util.UUID; import static org.junit.Assert.*; @@ -46,9 +45,6 @@ public class JerseyAwsProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); - private static final String QUERY_STRING_KEY = "identifier"; - private static final String QUERY_STRING_NON_ENCODED_VALUE = "Space Test"; - private static final String QUERY_STRING_ENCODED_VALUE = "Space%20Test"; private static final String USER_PRINCIPAL = "user1"; @@ -112,53 +108,10 @@ public void context_serverInfo_correctContext() { validateSingleValueModel(output, AwsServletContext.SERVER_INFO); } - @Test - public void queryString_uriInfo_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); - - AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); - - validateMapResponseModel(output); - } - - @Test - public void queryString_notEncoded_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) - .build(); - - AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); - - validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); - } - - @Test - public void queryString_encoded_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) - .build(); - - AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); - - validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); - } - @Test public void requestScheme_valid_expectHttps() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/scheme", "GET") .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); @@ -309,31 +262,14 @@ public void securityContext_injectPrincipal_expectPrincipalName() { } @Test - public void queryParam_encoding_expectUnencodedParam() { - String paramValue = "p%2Fz%2B3"; - String decodedParam = ""; - try { - decodedParam = URLDecoder.decode(paramValue, "UTF-8"); - System.out.println(decodedParam); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - fail("Could not decode parameter"); - } - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", paramValue).build(); - - AwsProxyResponse resp = handler.proxy(request, lambdaContext); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, decodedParam); - } - - @Test - public void queryParam_encoding_expectEncodedParam() { - String paramValue = "p%2Fz%2B3"; - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); - + public void emptyStream_putNullBody_expectPutToSucceed() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, paramValue); + validateSingleValueModel(resp, CUSTOM_HEADER_KEY); } private void validateMapResponseModel(AwsProxyResponse output) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java new file mode 100644 index 00000000..e23190fb --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -0,0 +1,169 @@ +package com.amazonaws.serverless.proxy.jersey; + + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; +import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.glassfish.jersey.logging.LoggingFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + + +public class JerseyParamEncodingTest { + + private static final String SIMPLE_ENCODED_PARAM = "p/z+3"; + private static final String JSON_ENCODED_PARAM = "{\"name\":\"faisal\"}"; + private static final String QUERY_STRING_KEY = "identifier"; + private static final String QUERY_STRING_NON_ENCODED_VALUE = "Space Test"; + private static final String QUERY_STRING_ENCODED_VALUE = "Space%20Test"; + + + private static ObjectMapper objectMapper = new ObjectMapper(); + private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") + .register(LoggingFeature.class) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + + private static Context lambdaContext = new MockLambdaContext(); + + @Test + public void queryString_uriInfo_echo() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getHeaders().get("Content-Type")); + + validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); + } + + @Test + public void queryString_notEncoded_echo() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getHeaders().get("Content-Type")); + + validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); + } + + @Test + @Ignore("We expect to only receive decoded values from API Gateway") + public void queryString_encoded_echo() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getHeaders().get("Content-Type")); + + validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); + } + + @Test + public void simpleQueryParam_encoding_expectDecodedParam() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, SIMPLE_ENCODED_PARAM); + } + + @Test + public void jsonQueryParam_encoding_expectDecodedParam() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, JSON_ENCODED_PARAM); + } + + @Test + public void simpleQueryParam_encoding_expectEncodedParam() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + String encodedVal = ""; + try { + encodedVal = URLEncoder.encode(SIMPLE_ENCODED_PARAM, "UTF-8"); + } catch (UnsupportedEncodingException e) { + fail("Could not encode parameter value"); + } + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, encodedVal); + } + + @Test + public void jsonQueryParam_encoding_expectEncodedParam() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + String encodedVal = ""; + try { + encodedVal = URLEncoder.encode(JSON_ENCODED_PARAM, "UTF-8"); + } catch (UnsupportedEncodingException e) { + fail("Could not encode parameter value"); + } + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, encodedVal); + } + + @Test + public void queryParam_encoding_expectFullyEncodedUrl() { + String paramValue = "/+="; + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + System.out.println("body:" + resp.getBody()); + /*try { + String encodedParam = URLEncoder.encode(paramValue, "UTF-8"); + validateSingleValueModel(resp, encodedParam); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + fail(); + }*/ + } + + private void validateSingleValueModel(AwsProxyResponse output, String value) { + try { + SingleValueModel response = objectMapper.readValue(output.getBody(), SingleValueModel.class); + assertNotNull(response.getValue()); + assertEquals(value, response.getValue()); + } catch (IOException e) { + fail("Exception while parsing response body: " + e.getMessage()); + e.printStackTrace(); + } + } + + private void validateMapResponseModel(AwsProxyResponse output, String key, String value) { + try { + MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); + assertNotNull(response.getValues().get(key)); + assertEquals(value, response.getValues().get(key)); + } catch (IOException e) { + fail("Exception while parsing response body: " + e.getMessage()); + e.printStackTrace(); + } + } +} From f18176f02e08d3eae3d96090174151c24649197e Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 18 Jun 2018 15:57:45 -0700 Subject: [PATCH 0147/1214] Addressed bug with Spark requests to the root resource not being routed correctly (#151) --- .../servlet/AwsProxyHttpServletRequest.java | 7 +++++-- .../proxy/spark/HelloWorldSparkTest.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 43930013..1ba21904 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -716,13 +716,16 @@ private Map getMultipartFormParametersMap() { private String cleanUri(String uri) { - String finalUri = (uri == null ? "" : uri); + String finalUri = (uri == null ? "/" : uri); + if (finalUri.equals("/")) { + return finalUri; + } if (!finalUri.startsWith("/")) { finalUri = "/" + finalUri; } - if (finalUri.endsWith(("/"))) { + if (finalUri.endsWith("/")) { finalUri = finalUri.substring(0, finalUri.length() - 1); } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 58da129e..f4870a4a 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -89,7 +89,24 @@ public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); } + @Test + public void rootResource_basicRequest_expectSuccess() { + AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + + assertEquals(200, response.getStatusCode()); + assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY)); + assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY)); + assertEquals(BODY_TEXT_RESPONSE, response.getBody()); + } + private static void configureRoutes() { + get("/", (req, res) -> { + res.status(200); + res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + return BODY_TEXT_RESPONSE; + }); + get("/hello", (req, res) -> { res.status(200); res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); From c0b3b29f94adbde4aa2e3a820527baebefcdd202 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 19 Jun 2018 09:34:54 -0700 Subject: [PATCH 0148/1214] Fixed issues with set content encoding header reported in #150 --- .../servlet/AwsProxyHttpServletRequest.java | 60 ++++++--- .../AwsProxyHttpServletRequestTest.java | 119 ++++++++++++++++-- 2 files changed, 152 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 1ba21904..955ecdfe 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -86,6 +86,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private SecurityContext securityContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; + private Map caseInsensitiveHeaders; private EncodingQueryStringParameterMap queryStringParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; @@ -108,6 +109,9 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.queryStringParameters = new EncodingQueryStringParameterMap(config.isQueryStringCaseSensitive(), config.getUriEncoding()); this.queryStringParameters.putAllMapEncoding(request.getQueryStringParameters()); + + this.caseInsensitiveHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.caseInsensitiveHeaders.putAll(awsProxyRequest.getHeaders()); } @@ -171,10 +175,10 @@ public Enumeration getHeaders(String s) { @Override public Enumeration getHeaderNames() { - if (request.getHeaders() == null) { + if (caseInsensitiveHeaders == null) { return Collections.emptyEnumeration(); } - return Collections.enumeration(request.getHeaders().keySet()); + return Collections.enumeration(caseInsensitiveHeaders.keySet()); } @@ -349,11 +353,9 @@ public String getCharacterEncoding() { @Override public void setCharacterEncoding(String s) throws UnsupportedEncodingException { - String currentContentType = request.getHeaders().get(HttpHeaders.CONTENT_TYPE); - if (currentContentType == null) { - request.getHeaders().put( - HttpHeaders.CONTENT_TYPE, - HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s); + String currentContentType = getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + if (currentContentType == null || "".equals(currentContentType)) { + log.error("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); return; } @@ -361,7 +363,8 @@ public void setCharacterEncoding(String s) String[] contentTypeValues = currentContentType.split(HEADER_VALUE_SEPARATOR); StringBuilder contentType = new StringBuilder(contentTypeValues[0]); - for (String contentTypeValue : contentTypeValues) { + for (int i = 1; i < contentTypeValues.length; i++) { + String contentTypeValue = contentTypeValues[i]; String contentTypeString = HEADER_VALUE_SEPARATOR + " " + contentTypeValue; if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { contentTypeString = HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s; @@ -369,10 +372,10 @@ public void setCharacterEncoding(String s) contentType.append(contentTypeString); } - request.getHeaders().put(HttpHeaders.CONTENT_TYPE, contentType.toString()); + setHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), contentType.toString()); } else { - request.getHeaders().put( - HttpHeaders.CONTENT_TYPE, + setHeaderCaseInsensitive( + HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), currentContentType + HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s); } } @@ -400,7 +403,12 @@ public long getContentLengthLong() { @Override public String getContentType() { - return getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + String contentTypeHeader = getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + if (contentTypeHeader == null || "".equals(contentTypeHeader.trim())) { + return null; + } + + return contentTypeHeader; } @@ -414,7 +422,17 @@ public ServletInputStream getInputStream() if (request.isBase64Encoded()) { bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); } else { - bodyBytes = request.getBody().getBytes(StandardCharsets.UTF_8); + String encoding = getCharacterEncoding(); + if (encoding == null) { + encoding = StandardCharsets.ISO_8859_1.name(); + } + try { + bodyBytes = request.getBody().getBytes(encoding); + } catch (Exception e) { + log.error("Could not read request with character encoding: " + SecurityUtils.crlf(encoding), e); + bodyBytes = request.getBody().getBytes(StandardCharsets.ISO_8859_1.name()); + } + } ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); return new AwsServletInputStream(requestBodyStream); @@ -649,15 +667,21 @@ private String getHeaderCaseInsensitive(String key) { return request.getRequestContext().getIdentity().getUserAgent(); } - if (request.getHeaders() == null) { + if (caseInsensitiveHeaders == null) { return null; } - for (String requestHeaderKey : request.getHeaders().keySet()) { - if (key.toLowerCase(Locale.ENGLISH).equals(requestHeaderKey.toLowerCase(Locale.ENGLISH))) { - return request.getHeaders().get(requestHeaderKey); + return caseInsensitiveHeaders.get(key); + } + + private void setHeaderCaseInsensitive(String key, String value) { + if (caseInsensitiveHeaders == null) { + caseInsensitiveHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + if (request.getHeaders() != null) { + caseInsensitiveHeaders.putAll(request.getHeaders()); } } - return null; + + caseInsensitiveHeaders.put(key, value); } private String[] getFormBodyParameterCaseInsensitive(String key) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index d8d81b53..f18656bb 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -9,10 +9,13 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.ZonedDateTime; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import static org.junit.Assert.*; @@ -29,11 +32,6 @@ public class AwsProxyHttpServletRequestTest { private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; private static ZonedDateTime REQUEST_DATE = ZonedDateTime.now(); - private static final AwsProxyRequest REQUEST_WITH_HEADERS = new AwsProxyRequestBuilder("/hello", "GET") - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP) - .build(); private static final AwsProxyRequest REQUEST_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "POST") .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE).build(); private static final AwsProxyRequest REQUEST_INVALID_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "GET") @@ -54,10 +52,11 @@ public class AwsProxyHttpServletRequestTest { private static final AwsProxyRequest REQUEST_USER_AGENT_REFERER = new AwsProxyRequestBuilder("/hello", "POST") .userAgent(USER_AGENT) .referer(REFERER).build(); - private static final AwsProxyRequest REQUEST_WITH_DATE = new AwsProxyRequestBuilder("/hello", "GET") .header(HttpHeaders.DATE, AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE)) .build(); + private static final AwsProxyRequest REQUEST_WITH_LOWERCASE_HEADER = new AwsProxyRequestBuilder("/hello", "POST") + .header(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), MediaType.APPLICATION_JSON).build(); private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING; static { @@ -72,7 +71,7 @@ public class AwsProxyHttpServletRequestTest { @Test public void headers_getHeader_validRequest() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_HEADERS, null, null); + HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); assertNotNull(request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(CUSTOM_HEADER_VALUE, request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); @@ -147,7 +146,7 @@ public void scheme_getScheme_https() { @Test public void scheme_getScheme_http() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_HEADERS, null, null); + HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getScheme()); assertEquals(REQUEST_SCHEME_HTTP, request.getScheme()); @@ -155,7 +154,7 @@ public void scheme_getScheme_http() { @Test public void cookie_getCookies_noCookies() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_HEADERS, null, null); + HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(0, request.getCookies().length); @@ -243,4 +242,106 @@ public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { assertNotNull(params.get(FORM_PARAM_TEST)); assertEquals(1, params.get(FORM_PARAM_TEST).length); } + + @Test + public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { + HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_SINGLE_COOKIE, null, null); + try { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + // we have not specified a content type so the encoding will not be set + assertEquals(null, request.getCharacterEncoding()); + assertEquals(null, request.getContentType()); + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } + } + + @Test + public void charEncoding_getEncoding_expectContentTypeOnly() { + HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + // we have not specified a content type so the encoding will not be set + assertEquals(null, request.getCharacterEncoding()); + assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); + try { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + String newHeaderValue = MediaType.APPLICATION_JSON + "; charset=" + StandardCharsets.UTF_8.name(); + assertEquals(newHeaderValue, request.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(newHeaderValue, request.getContentType()); + assertEquals(StandardCharsets.UTF_8.name(), request.getCharacterEncoding()); + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } + } + + @Test + public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() { + HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + // we have not specified a content type so the encoding will not be set + assertEquals(null, request.getCharacterEncoding()); + assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); + + try { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + String newHeaderValue = MediaType.APPLICATION_JSON + "; charset=" + StandardCharsets.UTF_8.name(); + assertEquals(newHeaderValue, request.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(newHeaderValue, request.getContentType()); + assertEquals(StandardCharsets.UTF_8.name(), request.getCharacterEncoding()); + + + request.setCharacterEncoding(StandardCharsets.ISO_8859_1.name()); + newHeaderValue = MediaType.APPLICATION_JSON + "; charset=" + StandardCharsets.ISO_8859_1.name(); + assertEquals(newHeaderValue, request.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(newHeaderValue, request.getContentType()); + assertEquals(StandardCharsets.ISO_8859_1.name(), request.getCharacterEncoding()); + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } + } + + @Test + public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { + HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_LOWERCASE_HEADER, null, null); + try { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + String newHeaderValue = MediaType.APPLICATION_JSON + "; charset=" + StandardCharsets.UTF_8.name(); + assertEquals(newHeaderValue, request.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(newHeaderValue, request.getContentType()); + assertEquals(StandardCharsets.UTF_8.name(), request.getCharacterEncoding()); + + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } + } + + @Test + public void contentType_duplicateCase_expectSingleContentTypeHeader() { + AwsProxyRequest proxyRequest = getRequestWithHeaders(); + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + + try { + request.setCharacterEncoding(StandardCharsets.ISO_8859_1.name()); + assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE)); + assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))); + + assertFalse(proxyRequest.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE) && proxyRequest.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))); + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } + + + + } + + private AwsProxyRequest getRequestWithHeaders() { + return new AwsProxyRequestBuilder("/hello", "GET") + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP) + .build(); + } } From a3d63aab9bfaac1386a64a051c6dfbe17b7a2c53 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 20 Jun 2018 17:05:27 +0200 Subject: [PATCH 0149/1214] Provide first module to run Struts2 based applications as AWS Lambda functions https://github.com/awslabs/aws-serverless-java-container/issues/149 --- aws-serverless-java-container-struts2/pom.xml | 178 ++++++++++ .../Struts2LambdaContainerHandler.java | 112 ++++++ .../proxy/struts2/Struts2LambdaHandler.java | 45 +++ .../proxy/struts2/Struts2AwsProxyTest.java | 326 ++++++++++++++++++ .../proxy/struts2/echoapp/EchoAction.java | 53 +++ .../echoapp/EchoRequestInfoAction.java | 85 +++++ .../src/test/resources/struts.xml | 29 ++ pom.xml | 1 + 8 files changed, 829 insertions(+) create mode 100644 aws-serverless-java-container-struts2/pom.xml create mode 100644 aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java create mode 100644 aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java create mode 100644 aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java create mode 100644 aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java create mode 100644 aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java create mode 100644 aws-serverless-java-container-struts2/src/test/resources/struts.xml diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml new file mode 100644 index 00000000..621587ce --- /dev/null +++ b/aws-serverless-java-container-struts2/pom.xml @@ -0,0 +1,178 @@ + + + 4.0.0 + + aws-serverless-java-container-struts2 + AWS Serverless Java container support - Struts2 implementation + Allows Java applications written for the Struts2 framework to run in AWS Lambda + https://aws.amazon.com/lambda + 1.2-SNAPSHOT + + + com.amazonaws.serverless + aws-serverless-java-container + 1.2-SNAPSHOT + + + + 2.5.16 + 2.9.5 + + + + + + com.amazonaws.serverless + aws-serverless-java-container-core + 1.2-SNAPSHOT + + + + org.apache.struts + struts2-core + ${struts2.version} + true + + + commons-io + commons-io + + + + + + org.apache.struts + struts2-json-plugin + ${struts2.version} + test + + + + org.apache.struts + struts2-junit-plugin + ${struts2.version} + test + + + + + commons-codec + commons-codec + 1.10 + test + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + org.apache.logging.log4j + log4j-to-slf4j + 2.10.0 + + + + javax.el + javax.el-api + 2.2.4 + test + + + + javax.el + javax.el-api + 2.2.4 + test + + + + javax.servlet + jsp-api + 2.0 + test + + + + org.glassfish.web + javax.el + 2.2.4 + test + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.9 + + always + + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.1 + + + Max + + Low + + true + + ${project.build.directory}/spotbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + + + org.owasp + dependency-check-maven + 3.1.1 + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + check + + + + + + + diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java new file mode 100644 index 00000000..003390ec --- /dev/null +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java @@ -0,0 +1,112 @@ +package com.amazonaws.serverless.proxy.struts2; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; +import java.util.EnumSet; +import java.util.concurrent.CountDownLatch; + +/** + * A Lambda handler to initialize the Struts2 filter and proxy the requests. + * + * @param request type + * @param response type + */ +public class Struts2LambdaContainerHandler extends AwsLambdaServletContainerHandler { + + private static final Logger log = LoggerFactory.getLogger(Struts2LambdaContainerHandler.class); + + public static final String HEADER_STRUTS_STATUS_CODE = "X-Struts-StatusCode"; + + private static final String TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR = "STRUTS2_CONTAINER_CONSTRUCTOR"; + private static final String TIMER_STRUTS_2_HANDLE_REQUEST = "STRUTS2_HANDLE_REQUEST"; + private static final String TIMER_STRUTS_2_COLD_START_INIT = "STRUTS2_COLD_START_INIT"; + private static final String STRUTS_FILTER_NAME = "Struts2Filter"; + + private boolean initialized; + + public static Struts2LambdaContainerHandler getAwsProxyHandler() { + return new Struts2LambdaContainerHandler( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler()); + } + + public Struts2LambdaContainerHandler(Class requestTypeClass, + Class responseTypeClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler) { + + super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); + Timer.start(TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR); + this.initialized = false; + Timer.stop(TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR); + } + + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, + AwsHttpServletResponse httpServletResponse, + Context lambdaContext) throws Exception { + Timer.start(TIMER_STRUTS_2_HANDLE_REQUEST); + if (!this.initialized) { + initialize(); + } + + httpServletRequest.setServletContext(this.getServletContext()); + this.doFilter(httpServletRequest, httpServletResponse, null); + String responseStatusCode = httpServletResponse.getHeader(HEADER_STRUTS_STATUS_CODE); + if (responseStatusCode != null) { + httpServletResponse.setStatus(Integer.parseInt(responseStatusCode)); + } + Timer.stop(TIMER_STRUTS_2_HANDLE_REQUEST); + } + + @Override + public void initialize() throws ContainerInitializationException { + log.info("Initialize Struts2 Lambda Application ..."); + Timer.start(TIMER_STRUTS_2_COLD_START_INIT); + try { + if (this.startupHandler != null) { + this.startupHandler.onStartup(this.getServletContext()); + } + StrutsPrepareAndExecuteFilter filter = new StrutsPrepareAndExecuteFilter(); + FilterRegistration.Dynamic filterRegistration = this.getServletContext() + .addFilter(STRUTS_FILTER_NAME, filter); + filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + } catch (Exception e) { + throw new ContainerInitializationException("Could not initialize Struts2", e); + } + + this.initialized = true; + Timer.stop(TIMER_STRUTS_2_COLD_START_INIT); + log.info("... initialize of Struts2 Lambda Application completed!"); + } +} diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java new file mode 100644 index 00000000..e2afdfb4 --- /dev/null +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.proxy.struts2; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * The lambda handler to handle the requests. + *

+ * + * com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + * + */ +public class Struts2LambdaHandler implements RequestStreamHandler { + + private static final Logger log = LoggerFactory.getLogger(Struts2LambdaHandler.class); + + private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler + .getAwsProxyHandler(); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) { + + try { + AwsProxyRequest request = LambdaContainerHandler.getObjectMapper() + .readValue(inputStream, AwsProxyRequest.class); + + AwsProxyResponse response = handler.proxy(request, context); + LambdaContainerHandler.getObjectMapper().writeValue(outputStream, response); + + // just in case it wasn't closed by the mapper + outputStream.close(); + } catch (IOException e) { + log.error("An unexpected exception happened while handling request", e); + } + } +} diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java new file mode 100644 index 00000000..f1e4b4b8 --- /dev/null +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -0,0 +1,326 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.struts2; + + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.struts2.echoapp.EchoAction; +import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.codec.binary.Base64; +import org.apache.struts2.StrutsJUnit4TestCase; +import org.junit.Test; + +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Unit test class for the Struts2 AWS_PROXY default implementation + */ +public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { + private static final String CUSTOM_HEADER_KEY = "x-custom-header"; + private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; + private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); + private static final String QUERY_STRING_KEY = "message"; + private static final String QUERY_STRING_ENCODED_VALUE = "Hello Struts2"; + private static final String USER_PRINCIPAL = "user1"; + private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json;charset=UTF-8"; + + + private static ObjectMapper objectMapper = new ObjectMapper(); + private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler + .getAwsProxyHandler(); + private static Context lambdaContext = new MockLambdaContext(); + + @Test + public void headers_getHeaders_echo() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "headers") + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + + validateMapResponseModel(output); + } + + @Test + public void context_servletResponse_setCustomHeader() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET") + .queryString("customHeader", "true") + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertTrue(output.getHeaders().containsKey("XX")); + } + + @Test + public void context_serverInfo_correctContext() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET") + .queryString(QUERY_STRING_KEY, "Hello Struts2") + .header("Content-Type", "application/json") + .queryString("contentType", "true") + .build(); + AwsProxyResponse output = handler.proxy(request, lambdaContext); + for (String header : output.getHeaders().keySet()) { + System.out.println(header + ": " + output.getHeaders().get(header)); + } + assertEquals(200, output.getStatusCode()); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + System.out.println("Body: " + output.getBody()); + + validateSingleValueModel(output, "Hello Struts2"); + } + + @Test + public void queryString_uriInfo_echo() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "query-string") + .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .json() + .build(); + + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + + validateMapResponseModel(output); + } + + @Test + public void requestScheme_valid_expectHttps() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "scheme") + .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + + validateSingleValueModel(output, "https"); + } + + @Test + public void authorizer_securityContext_customPrincipalSuccess() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "principal") + .json() + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + + validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); + } + + @Test + public void errors_unknownRoute_expect404() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/unknown", "GET").build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(404, output.getStatusCode()); + } + + @Test + public void error_contentType_invalidContentType() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + .queryString("mode", "content-type") + .header("Content-Type", "application/octet-stream") + .body("asdasdasd") + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(415, output.getStatusCode()); + } + + @Test + public void error_statusCode_methodNotAllowed() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + .queryString("mode", "not-allowed") + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(405, output.getStatusCode()); + } + + + @Test + public void responseBody_responseWriter_validBody() throws JsonProcessingException { + Map value = new HashMap<>(); + value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE); + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "POST") + .json() + .body(objectMapper.writeValueAsString(value)) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertNotNull(output.getBody()); + + validateSingleValueModel(output, "{\"message\":\"my-custom-value\"}"); + } + + @Test + public void statusCode_responseStatusCode_customStatusCode() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "custom-status-code") + .queryString("status", "201") + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(201, output.getStatusCode()); + } + + @Test + public void base64_binaryResponse_base64Encoding() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").build(); + + AwsProxyResponse response = handler.proxy(request, lambdaContext); + assertNotNull(response.getBody()); + assertTrue(Base64.isBase64(response.getBody())); + } + + @Test + public void exception_mapException_mapToNotImplemented() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + .queryString("mode", "not-implemented") + .build(); + + AwsProxyResponse response = handler.proxy(request, lambdaContext); + assertNotNull(response.getBody()); + assertEquals("null", response.getBody()); + assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); + } + + @Test + public void stripBasePath_route_shouldRouteCorrectly() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo", "GET") + .json() + .queryString(QUERY_STRING_KEY, "stripped") + .build(); + handler.stripBasePath("/custompath"); + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + validateSingleValueModel(output, "stripped"); + handler.stripBasePath(""); + } + + @Test + public void stripBasePath_route_shouldReturn404() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + .json() + .queryString("status", "201") + .build(); + handler.stripBasePath("/custom"); + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(404, output.getStatusCode()); + handler.stripBasePath(""); + } + + @Test + public void securityContext_injectPrincipal_expectPrincipalName() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + .queryString("mode", "principal") + .authorizerPrincipal(USER_PRINCIPAL).build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, USER_PRINCIPAL); + } + + @Test + public void queryParam_encoding_expectUnencodedParam() { + String paramValue = "p%2Fz%2B3"; + String decodedParam = ""; + try { + decodedParam = URLDecoder.decode(paramValue, "UTF-8"); + System.out.println(decodedParam); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + fail("Could not decode parameter"); + } + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, decodedParam) + .build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, decodedParam); + } + + @Test + public void queryParam_encoding_expectEncodedParam() { + String paramValue = "p%2Fz%2B3"; + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, paramValue) + .build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, paramValue); + } + + + private void validateMapResponseModel(AwsProxyResponse output) { + validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + } + + private void validateMapResponseModel(AwsProxyResponse output, String key, String value) { + try { + TypeReference> typeRef + = new TypeReference>() { + }; + HashMap response = objectMapper.readValue(output.getBody(), typeRef); + assertNotNull(response.get(key)); + assertEquals(value, response.get(key)); + } catch (IOException e) { + fail("Exception while parsing response body: " + e.getMessage()); + e.printStackTrace(); + } + } + + private void validateSingleValueModel(AwsProxyResponse output, String value) { + try { + assertNotNull(output.getBody()); + assertEquals(value, objectMapper.readerFor(String.class).readValue(output.getBody())); + } catch (Exception e) { + fail("Exception while parsing response body: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java new file mode 100644 index 00000000..bfaa0a69 --- /dev/null +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java @@ -0,0 +1,53 @@ +package com.amazonaws.serverless.proxy.struts2.echoapp; + +import com.opensymphony.xwork2.ActionSupport; +import org.apache.commons.io.IOUtils; +import org.apache.struts2.ServletActionContext; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + + +public class EchoAction extends ActionSupport { + + private String message; + + public String execute() throws IOException { + HttpServletRequest request = ServletActionContext.getRequest(); + + if (message == null && requestHasBody(request)) { + message = IOUtils.toString(request.getReader()); + } + + return SUCCESS; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setCustomHeader(boolean customHeader) { + if (customHeader) { + HttpServletResponse response = ServletActionContext.getResponse(); + response.setHeader("XX", "FOO"); + } + } + + + public void setContentType(boolean contentType) { + if (contentType) { + HttpServletResponse response = ServletActionContext.getResponse(); + response.setContentType("application/json"); + } + } + + private boolean requestHasBody(HttpServletRequest request) throws IOException { + return ("POST".equalsIgnoreCase(request.getMethod()) || "PUT".equalsIgnoreCase(request.getMethod())) && request.getReader() != null; + } + +} diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java new file mode 100644 index 00000000..42f7f3c1 --- /dev/null +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java @@ -0,0 +1,85 @@ +package com.amazonaws.serverless.proxy.struts2.echoapp; + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.opensymphony.xwork2.ActionSupport; +import org.apache.struts2.ServletActionContext; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + + +public class EchoRequestInfoAction extends ActionSupport { + + private String mode = "principal"; + private Object result = null; + + public String execute() { + + HttpServletRequest request = ServletActionContext.getRequest(); + ApiGatewayRequestContext apiGatewayRequestContext = + (ApiGatewayRequestContext) request + .getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + + switch (mode) { + case "principal": + result = apiGatewayRequestContext.getAuthorizer().getPrincipalId(); + break; + case "scheme": + result = request.getScheme(); + break; + case "content-type": + if (request.getContentType().contains("application/octet-stream")) { + ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE); + } + result = request.getContentType(); + break; + case "not-allowed": + ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); + break; + case "custom-status-code": + ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_CREATED); + break; + case "not-implemented": + ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED); + break; + case "headers": + Map headers = new HashMap<>(); + + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + headers.put(headerName, request.getHeader(headerName)); + } + + result = headers; + break; + case "query-string": + Map params = new HashMap<>(); + + Enumeration parameterNames = request.getParameterNames(); + while (parameterNames.hasMoreElements()) { + String parameterName = parameterNames.nextElement(); + params.put(parameterName, request.getParameter(parameterName)); + } + + result = params; + break; + default: + throw new IllegalArgumentException("Invalid mode requested: " + mode); + } + + return SUCCESS; + } + + public Object getResult() { + return result; + } + + public void setMode(String mode) { + this.mode = mode; + } +} diff --git a/aws-serverless-java-container-struts2/src/test/resources/struts.xml b/aws-serverless-java-container-struts2/src/test/resources/struts.xml new file mode 100644 index 00000000..0c5dd832 --- /dev/null +++ b/aws-serverless-java-container-struts2/src/test/resources/struts.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + message + + + + + + + + result + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c36feaa9..2a950d60 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,7 @@ aws-serverless-java-container-jersey aws-serverless-java-container-spark aws-serverless-java-container-spring + aws-serverless-java-container-struts2 archetypes/jersey archetypes/spark archetypes/spring From e4266e167f36d51ed25103503f24c940f64f029c Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 20 Jun 2018 12:16:01 -0700 Subject: [PATCH 0150/1214] Added unit test to verify that issue #158 is actually supported in the framework --- .../proxy/spring/SpringBootAppTest.java | 10 ++++++ .../spring/springbootapp/TestController.java | 32 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 5fdabec6..c0efb038 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -30,6 +30,7 @@ public void testMethod_springSecurity_doesNotThrowException() { AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").build(); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, TestController.TEST_VALUE); } @@ -53,7 +54,16 @@ public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { e.printStackTrace(); fail(); } + } + + @Test + public void requestUri_dotInPathParam_expectRoutingToMethod() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/test/testdomain.com", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, "testdomain.com"); } private void validateSingleValueModel(AwsProxyResponse output, String value) { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index 39433db3..4d9f01b2 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -3,19 +3,42 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.web.accept.ContentNegotiationStrategy; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @RestController @EnableWebSecurity -public class TestController extends WebSecurityConfigurerAdapter{ +public class TestController extends WebSecurityConfigurerAdapter { public static final String TEST_VALUE = "test"; + // workaround to address the most annoying issue in the world: https://blog.georgovassilis.com/2015/10/29/spring-mvc-rest-controller-says-406-when-emails-are-part-url-path/ + @Configuration + public static class CustomConfig extends WebMvcConfigurerAdapter { + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurer.setUseSuffixPatternMatch(false); + } + + @Override + public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { + configurer.favorPathExtension(false); + } + } + @RequestMapping(path = "/test", method = { RequestMethod.GET }) public SingleValueModel testGet() { SingleValueModel value = new SingleValueModel(); @@ -23,6 +46,13 @@ public SingleValueModel testGet() { return value; } + @RequestMapping(path = "/test/{domain}", method = { RequestMethod.GET}) + public SingleValueModel testDomainInPath(@PathVariable("domain") String domainName) { + SingleValueModel value = new SingleValueModel(); + value.setValue(domainName); + return value; + } + @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().disable(); From 486ed1c3bb0c0671fe44325aee692c4e8eb0b52b Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 20 Jun 2018 12:51:52 -0700 Subject: [PATCH 0151/1214] Preparing for 1.1.1 release to address bugs --- archetypes/jersey/pom.xml | 4 ++-- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/pom.xml | 4 ++-- .../spark/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spring/pom.xml | 4 ++-- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/springboot/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- .../serverless/proxy/spark/SparkLambdaContainerHandler.java | 2 +- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 6 +++++- 14 files changed, 29 insertions(+), 25 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfac..117ce994 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT maven-archetype diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index 5a9a2bcb..aaa0a384 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.1 + 1.1.1 diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42..ed0522e7 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 04eb1b39..0ea2d9a4 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.1 + 1.1.1 diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b5728..217071c0 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT maven-archetype diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index c7da99e7..ad3a67fd 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1 + 1.1.1 diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1..6bc217e5 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index 18351217..2a821ce3 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1 + 1.1.1 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..b2a59511 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec..392db0b9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 65912e8a..2386ab71 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index bf7384f6..8acc4373 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -142,7 +142,7 @@ public SparkLambdaContainerHandler(Class requestTypeClass, // TODO: This is pretty bad but we are not given access to the embeddedServerIdentifier property of the // Service object try { - AccessController.doPrivileged((PrivilegedExceptionAction) () -> { + AccessController.doPrivileged((PrivilegedExceptionAction) () -> { log.debug("Changing visibility of getInstance method and embeddedServerIdentifier properties"); Method serviceInstanceMethod = Spark.class.getDeclaredMethod("getInstance"); serviceInstanceMethod.setAccessible(true); diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04ee52c2..4a0b591a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index c36feaa9..9177841f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2-SNAPSHOT + 1.1.1-SNAPSHOT AWS Serverless Java container @@ -39,6 +39,10 @@ + + 0.7 + + From 69306cea5002ff242d2911fdb2af7a533e9b8524 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 20 Jun 2018 22:18:47 +0200 Subject: [PATCH 0152/1214] Remove optional from struts2-core dependency and remove duplicate dependency https://github.com/awslabs/aws-serverless-java-container/issues/149 https://github.com/awslabs/aws-serverless-java-container/pull/159 --- aws-serverless-java-container-struts2/pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 621587ce..60c75bae 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -32,7 +32,6 @@ org.apache.struts struts2-core ${struts2.version} - true commons-io @@ -82,13 +81,6 @@ test - - javax.el - javax.el-api - 2.2.4 - test - - javax.servlet jsp-api From a5b927c37bed0b494c669545dfa1f7ad906935e5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 20 Jun 2018 14:45:01 -0700 Subject: [PATCH 0153/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.1.1 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 117ce994..623b4118 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.1-SNAPSHOT + 1.1.1 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index ed0522e7..b56bb1ff 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.1-SNAPSHOT + 1.1.1 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 217071c0..19496433 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.1-SNAPSHOT + 1.1.1 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 6bc217e5..2c37805a 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.1-SNAPSHOT + 1.1.1 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b2a59511..29b9ddfe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 392db0b9..9595c2c0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1-SNAPSHOT + 1.1.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 2386ab71..c6f3d6ed 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1-SNAPSHOT + 1.1.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4a0b591a..96af1c33 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1-SNAPSHOT + 1.1.1 com.amazonaws.serverless aws-serverless-java-container - 1.1.1-SNAPSHOT + 1.1.1 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1-SNAPSHOT + 1.1.1 diff --git a/pom.xml b/pom.xml index 9177841f..c00dc4f0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.1-SNAPSHOT + 1.1.1 AWS Serverless Java container From 4e73579db796c620eedb39c3d8ea44fce6d16089 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 20 Jun 2018 14:45:02 -0700 Subject: [PATCH 0154/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 623b4118..459bdfac 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index b56bb1ff..196b1a42 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 19496433..b69b5728 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 2c37805a..af4cb0f1 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.1 + 1.2-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 29b9ddfe..278a5a98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9595c2c0..9e7998ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1 + 1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c6f3d6ed..65912e8a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 96af1c33..04ee52c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.1 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.1 + 1.2-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.1 + 1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index c00dc4f0..9e57634d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.1 + 1.2-SNAPSHOT AWS Serverless Java container From 7338ec3400bf907f52a8f38638ce1a7f85040235 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 08:45:32 -0700 Subject: [PATCH 0155/1214] Moved from @ComponentScan annotation to @Import annotation in spring samples to reduce cold start time --- .../serverless/sample/spring/PetStoreSpringAppConfig.java | 4 ++-- .../amazonaws/serverless/sample/springboot/Application.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java index 8319410d..6655c501 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java @@ -13,8 +13,8 @@ package com.amazonaws.serverless.sample.spring; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerMapping; @@ -27,7 +27,7 @@ @Configuration -@ComponentScan("com.amazonaws.serverless.sample.spring") +@Import({ PetsController.class }) public class PetStoreSpringAppConfig { /* * Create required HandlerMapping, to avoid several default HandlerMapping instances being created diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java index 88eefa11..7988133a 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java @@ -1,11 +1,13 @@ package com.amazonaws.serverless.sample.springboot; +import com.amazonaws.serverless.sample.springboot.controller.PetsController; + import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerMapping; @@ -18,7 +20,7 @@ @SpringBootApplication -@ComponentScan(basePackages = "com.amazonaws.serverless.sample.springboot.controller") +@Import({ PetsController.class }) public class Application extends SpringBootServletInitializer { // silence console logging From 583ccb5933f02a58a24453dbc30797ddaad7cac2 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 09:01:22 -0700 Subject: [PATCH 0156/1214] Critical bug fix for nulll query string parameter map in API Gateway's event. --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 6 +++++- .../serverless/proxy/spring/echoapp/EchoResource.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 955ecdfe..82b3624d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -476,7 +476,11 @@ public String[] getParameterValues(String s) { paramKey = paramKey.toLowerCase(Locale.getDefault()); } List values = new ArrayList<>(); - values.addAll(queryStringParameters.get(paramKey)); + List queryParamValues = queryStringParameters.get(paramKey); + if (queryParamValues != null) { + values.addAll(queryParamValues); + } + //values.addAll(queryStringParameters.get(paramKey)); String[] formBodyValues = getFormBodyParameterCaseInsensitive(s); if (formBodyValues != null) { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index e9d2d3c6..07817b37 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -58,7 +58,7 @@ public MapResponseModel echoServletHeaders(HttpServletRequest context) { } @RequestMapping(path = "/query-string", method = RequestMethod.GET) - public MapResponseModel echoQueryString(HttpServletRequest request) { + public MapResponseModel echoQueryString(HttpServletRequest request, @RequestParam(value="nonexistent", required=false) String nonexistentParamValue) { MapResponseModel queryStrings = new MapResponseModel(); for (String key : request.getParameterMap().keySet()) { queryStrings.addValue(key, request.getParameterMap().get(key)[0]); From 07cafd987224e3dabe094c0039ba235cb742f096 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 09:08:11 -0700 Subject: [PATCH 0157/1214] Preparing for 1.1.2 release --- archetypes/jersey/pom.xml | 4 ++-- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/pom.xml | 4 ++-- .../spark/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spring/pom.xml | 4 ++-- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/springboot/pom.xml | 4 ++-- .../springboot/src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spark/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- pom.xml | 2 +- 13 files changed, 21 insertions(+), 21 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfac..355c8148 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT maven-archetype diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index aaa0a384..ac36c34d 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.1.1 + 1.1.2 diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42..59502fe4 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 0ea2d9a4..97fc2de2 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.1.1 + 1.1.2 diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b5728..2125b1b6 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index ad3a67fd..a6cc93e9 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.1 + 1.1.2 diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1..140666c8 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index 2a821ce3..1621dc94 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.1 + 1.1.2 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..094d6e38 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec..4072d47b 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 65912e8a..9bf20c8a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04ee52c2..74b82364 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 9e57634d..78a8c161 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT AWS Serverless Java container From dd9baeceaa0614403436b8ca2a099622c2271f36 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 09:46:50 -0700 Subject: [PATCH 0158/1214] Updated core dependency version in framework implementations --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 4072d47b..61077deb 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9bf20c8a..1537626b 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 74b82364..7fe55409 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.2-SNAPSHOT From e8e8350c9aa4c3159692a11b171a11b3aedc81c5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 10:03:20 -0700 Subject: [PATCH 0159/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.1.2 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 355c8148..cccd92cd 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.2-SNAPSHOT + 1.1.2 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 59502fe4..981b7016 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.2-SNAPSHOT + 1.1.2 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 2125b1b6..9d980417 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.2-SNAPSHOT + 1.1.2 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 140666c8..52f6bf7e 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.2-SNAPSHOT + 1.1.2 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 094d6e38..da0635e6 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 61077deb..75f7a68b 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2-SNAPSHOT + 1.1.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 1537626b..0e86fd71 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2-SNAPSHOT + 1.1.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7fe55409..8db4d960 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2-SNAPSHOT + 1.1.2 com.amazonaws.serverless aws-serverless-java-container - 1.1.2-SNAPSHOT + 1.1.2 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2-SNAPSHOT + 1.1.2 diff --git a/pom.xml b/pom.xml index 78a8c161..c0f908ba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.2-SNAPSHOT + 1.1.2 AWS Serverless Java container From dfe6e4fbab4f0ae4b1e2ea078b40b3c3cb183e60 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 21 Jun 2018 10:03:20 -0700 Subject: [PATCH 0160/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index cccd92cd..459bdfac 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.2 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 981b7016..196b1a42 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.2 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 9d980417..b69b5728 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.2 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 52f6bf7e..af4cb0f1 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.2 + 1.2-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index da0635e6..278a5a98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 75f7a68b..9e7998ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2 + 1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 0e86fd71..65912e8a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8db4d960..04ee52c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.2 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.2 + 1.2-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.2 + 1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index c0f908ba..9e57634d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.2 + 1.2-SNAPSHOT AWS Serverless Java container From 5cf97f98b3022a3691f08548bfc149d5e481015d Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 22 Jun 2018 09:45:27 -0700 Subject: [PATCH 0161/1214] Changes to query string handling to address #162. parameter values come from request decoded. the getQueryString return an encoded string. --- .../servlet/AwsHttpServletRequest.java | 29 +++++- .../servlet/AwsProxyHttpServletRequest.java | 68 ++++++++------ .../EncodingQueryStringParameterMap.java | 89 ------------------- .../servlet/AwsHttpServletRequestTest.java | 17 +++- .../proxy/spring/SpringAwsProxyTest.java | 13 +++ .../proxy/spring/SpringBootAppTest.java | 10 +++ .../proxy/spring/echoapp/EchoResource.java | 8 ++ .../spring/springbootapp/TestApplication.java | 4 + .../spring/springbootapp/TestController.java | 12 +++ 9 files changed, 127 insertions(+), 123 deletions(-) delete mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 7c74772d..b10bf9f3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -24,6 +24,7 @@ import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; +import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -288,9 +289,12 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { * Given a map of key/values query string parameters from API Gateway, creates a query string as it would have * been in the original url. * @param parameters A Map<String, String> of query string parameters + * @param encode Whether the key and values should be URL encoded + * @param encodeCharset Charset to use for encoding the query string * @return The generated query string for the URI */ - protected String generateQueryString(EncodingQueryStringParameterMap parameters) { + protected String generateQueryString(Map parameters, boolean encode, String encodeCharset) + throws ServletException { if (parameters == null || parameters.size() == 0) { return null; } @@ -300,12 +304,31 @@ protected String generateQueryString(EncodingQueryStringParameterMap parameters) StringBuilder queryStringBuilder = new StringBuilder(); - parameters.keySet().stream().forEach(k -> parameters.get(k).stream().forEach(v -> { + /*parameters.keySet().stream().forEach(k -> parameters.stream().forEach(v -> { queryStringBuilder.append("&"); queryStringBuilder.append(k); queryStringBuilder.append("="); queryStringBuilder.append(v); - })); + }));*/ + try { + for (Map.Entry e : parameters.entrySet()) { + queryStringBuilder.append("&"); + if (encode) { + queryStringBuilder.append(URLEncoder.encode(e.getKey(), encodeCharset)); + } else { + queryStringBuilder.append(e.getKey()); + } + queryStringBuilder.append("="); + if (encode) { + queryStringBuilder.append(URLEncoder.encode(e.getValue(), encodeCharset)); + } else { + queryStringBuilder.append(e.getValue()); + } + + } + } catch (UnsupportedEncodingException e) { + throw new ServletException("Invalid charset passed for query string encoding", e); + } queryString = queryStringBuilder.toString(); queryString = queryString.substring(1); // remove the first & - faster to do it here than adding logic in the Lambda diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 82b3624d..3c474d9c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -87,7 +87,6 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private Map> urlEncodedFormParameters; private Map multipartFormParameters; private Map caseInsensitiveHeaders; - private EncodingQueryStringParameterMap queryStringParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; @@ -107,9 +106,6 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.securityContext = awsSecurityContext; this.config = config; - this.queryStringParameters = new EncodingQueryStringParameterMap(config.isQueryStringCaseSensitive(), config.getUriEncoding()); - this.queryStringParameters.putAllMapEncoding(request.getQueryStringParameters()); - this.caseInsensitiveHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); this.caseInsensitiveHeaders.putAll(awsProxyRequest.getHeaders()); } @@ -230,7 +226,12 @@ public String getContextPath() { @Override public String getQueryString() { - return this.generateQueryString(queryStringParameters); + try { + return this.generateQueryString(request.getQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + log.error("Could not generate query string", e); + return null; + } } @@ -441,11 +442,7 @@ public ServletInputStream getInputStream() @Override public String getParameter(String s) { - String paramKey = s; - if (config.isQueryStringCaseSensitive()) { - paramKey = paramKey.toLowerCase(Locale.getDefault()); - } - String queryStringParameter = queryStringParameters.getFirst(paramKey); + String queryStringParameter = getQueryParamValue(s, config.isQueryStringCaseSensitive()); if (queryStringParameter != null) { return queryStringParameter; } @@ -462,7 +459,9 @@ public String getParameter(String s) { @Override public Enumeration getParameterNames() { List paramNames = new ArrayList<>(); - paramNames.addAll(queryStringParameters.keySet()); + if (request.getQueryStringParameters() != null) { + paramNames.addAll(request.getQueryStringParameters().keySet()); + } paramNames.addAll(getFormUrlEncodedParametersMap().keySet()); return Collections.enumeration(paramNames); } @@ -471,16 +470,11 @@ public Enumeration getParameterNames() { @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - String paramKey = s; - if (config.isQueryStringCaseSensitive()) { - paramKey = paramKey.toLowerCase(Locale.getDefault()); - } List values = new ArrayList<>(); - List queryParamValues = queryStringParameters.get(paramKey); - if (queryParamValues != null) { - values.addAll(queryParamValues); + String queryValue = getQueryParamValue(s, config.isQueryStringCaseSensitive()); + if (queryValue != null) { + values.add(queryValue); } - //values.addAll(queryStringParameters.get(paramKey)); String[] formBodyValues = getFormBodyParameterCaseInsensitive(s); if (formBodyValues != null) { @@ -504,9 +498,17 @@ public Map getParameterMap() { output.put(e.getKey(), e.getValue().toArray(new String[0])); }); - queryStringParameters.keySet().stream().parallel().forEach(e -> { - output.put(e, queryStringParameters.get(e).toArray(new String[0])); - }); + if (request.getQueryStringParameters() != null) { + request.getQueryStringParameters().keySet().stream().parallel().forEach(e -> { + List newValues = new ArrayList<>(); + if (output.containsKey(e)) { + String[] values = output.get(e); + newValues.addAll(Arrays.asList(values)); + } + newValues.add(getQueryParamValue(e, config.isQueryStringCaseSensitive())); + output.put(e, newValues.toArray(new String[0])); + }); + } return output; } @@ -649,13 +651,6 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se return null; } - //------------------------------------------------------------- - // Methods - Protected - //------------------------------------------------------------- - - protected EncodingQueryStringParameterMap getQueryParametersMap() { - return queryStringParameters; - } //------------------------------------------------------------- // Methods - Private @@ -816,6 +811,21 @@ public static String decodeValueIfEncoded(String value) { } + private String getQueryParamValue(String key, boolean isCaseSensitive) { + if (isCaseSensitive) { + return request.getQueryStringParameters().get(key); + } + + for (String k : request.getQueryStringParameters().keySet()) { + if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { + return request.getQueryStringParameters().get(k); + } + } + + return null; + } + + public static class AwsServletInputStream extends ServletInputStream { private InputStream bodyStream; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java deleted file mode 100644 index 31c0b65d..00000000 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/EncodingQueryStringParameterMap.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.amazonaws.serverless.proxy.internal.servlet; - - -import com.amazonaws.serverless.proxy.internal.SecurityUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.core.MultivaluedHashMap; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; - - -/** - * query string parameters container. The main purpose of this object is to apply the required transformation to query - * string parameters coming from API Gateway. Specifically, parameters names and values need to be un-escaped and url-encoded - * again. - */ -public class EncodingQueryStringParameterMap extends MultivaluedHashMap { - - private boolean isCaseSensitive; - private String encoding; - private static Logger log = LoggerFactory.getLogger(EncodingQueryStringParameterMap.class); - - private static final long serialVersionUID = 42L; - - /** - * Creates a new instance of the parameters map. This allows the configuration to specify whether query string parameter - * names should be case sensitive or not. - * @param caseSensitive Whether parameters should be case sensitive. If the value is true, parameters names - * are automatically trnasformed to lower case as they are added to the map. - */ - public EncodingQueryStringParameterMap(final boolean caseSensitive, final String enc) { - isCaseSensitive = caseSensitive; - encoding = enc; - } - - public void putAllMapEncoding(final Map parametersMap) { - if (parametersMap == null) { - return; - } - parametersMap.entrySet().stream().forEach(e -> { - String key = e.getKey(); - if (!isCaseSensitive) { - key = key.toLowerCase(Locale.getDefault()); - } - key = unescapeAndEncode(key); - - String value = unescapeAndEncode(e.getValue()); - putSingle(key, value); - }); - } - - public void putAllMultiValuedMapEncoding(final MultivaluedHashMap parametersMap) { - if (parametersMap == null) { - return; - } - parametersMap.entrySet().stream().forEach(e -> { - String key = e.getKey(); - if (!isCaseSensitive) { - key = key.toLowerCase(Locale.getDefault()); - } - key = unescapeAndEncode(key); - - List newValueList = new ArrayList(); - // we don't expect the values to be many so we don't parallel() - e.getValue().stream().forEach(v -> { - newValueList.add(unescapeAndEncode(v)); - }); - - put(key, newValueList); - }); - } - - private String unescapeAndEncode(final String value) { - try { - return URLEncoder.encode(value, encoding); - } catch (UnsupportedEncodingException e) { - log.error("Could not url encode parameter value: " + SecurityUtils.crlf(value), e); - } - - return null; - } -} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 976f8bfc..4417f37b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; +import javax.servlet.ServletException; import javax.ws.rs.core.HttpHeaders; import static org.junit.Assert.*; @@ -77,7 +78,13 @@ public void headers_parseHeaderValue_complexAccept() { public void queryString_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); - String parsedString = request.generateQueryString(request.getQueryParametersMap()); + String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } System.out.println(parsedString); assertTrue(parsedString.contains("one=two")); assertTrue(parsedString.contains("three=four")); @@ -88,7 +95,13 @@ public void queryString_generateQueryString_validQuery() { public void queryStringWithEncodedParams_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); - String parsedString = request.generateQueryString(request.getQueryParametersMap()); + String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } assertTrue(parsedString.contains("one=two")); assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index ca684485..6e7280e9 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -116,6 +116,19 @@ public void queryString_uriInfo_echo() { validateMapResponseModel(output); } + @Test + public void queryString_listParameter_expectCorrectLength() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET") + .json() + .queryString("list", "v1,v2,v3") + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + + validateSingleValueModel(output, "3"); + } + @Test public void dateHeader_notModified_expect304() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index c0efb038..07388fa8 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -66,6 +66,16 @@ public void requestUri_dotInPathParam_expectRoutingToMethod() { validateSingleValueModel(resp, "testdomain.com"); } + @Test + public void queryString_commaSeparatedList_expectUnmarshalAsList() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/test/query-string", "GET") + .queryString("list", "v1,v2,v3").build(); + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, "3"); + } + private void validateSingleValueModel(AwsProxyResponse output, String value) { try { SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 07817b37..00b3360a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -17,6 +17,7 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Enumeration; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; @@ -67,6 +68,13 @@ public MapResponseModel echoQueryString(HttpServletRequest request, @RequestPara return queryStrings; } + @RequestMapping(path = "/list-query-string", method = RequestMethod.GET) + public SingleValueModel echoListQueryString(@RequestParam(value="list") List valueList) { + SingleValueModel value = new SingleValueModel(); + value.setValue(valueList.size() + ""); + return value; + } + @RequestMapping(path = "/authorizer-principal", method = RequestMethod.GET) public SingleValueModel echoAuthorizerPrincipal(HttpServletRequest context) { SingleValueModel valueModel = new SingleValueModel(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java index d203a56e..2ebe5f03 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java @@ -2,11 +2,15 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.filter.CharacterEncodingFilter; @SpringBootApplication @ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp") public class TestApplication extends SpringBootServletInitializer { + } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index 4d9f01b2..3a87b64a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -19,6 +20,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import java.util.List; + @RestController @EnableWebSecurity @@ -53,6 +56,15 @@ public SingleValueModel testDomainInPath(@PathVariable("domain") String domainNa return value; } + @RequestMapping(path = "/test/query-string", method = { RequestMethod.GET }) + public SingleValueModel testQueryStringList(@RequestParam("list") List qsValues) { + assert qsValues != null; + System.out.println("QUERY_STRING_VALUES: " + qsValues); + SingleValueModel value = new SingleValueModel(); + value.setValue(qsValues.size() + ""); + return value; + } + @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().disable(); From 83ecea5bf667d8bfdd1ec24b93b96ef8efaf8f03 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 22 Jun 2018 10:58:39 -0700 Subject: [PATCH 0162/1214] Preparing for 1.1.3 release --- archetypes/jersey/pom.xml | 4 ++-- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/pom.xml | 4 ++-- .../spark/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spring/pom.xml | 4 ++-- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/springboot/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfac..a65d7b72 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT maven-archetype diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index ac36c34d..687766cb 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.1.2 + 1.1.3 diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42..e7d5f777 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT maven-archetype diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 97fc2de2..e40b9258 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.1.2 + 1.1.3 diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b5728..ee1872e5 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT maven-archetype diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index a6cc93e9..a3d0557e 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.2 + 1.1.3 diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1..45dfc179 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index 1621dc94..5c413143 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.2 + 1.1.3 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..577627b1 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec..cade01b4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 65912e8a..d35822d7 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04ee52c2..c1237b1b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT diff --git a/pom.xml b/pom.xml index 9e57634d..dbdccffc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2-SNAPSHOT + 1.1.3-SNAPSHOT AWS Serverless Java container From 31475a7ebe2a550c53b31d87c40c7ebc7b9769e9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 22 Jun 2018 11:11:02 -0700 Subject: [PATCH 0163/1214] Jersey test fix and first stub of list test --- .../proxy/jersey/EchoJerseyResource.java | 12 +++++++++++ .../proxy/jersey/JerseyParamEncodingTest.java | 20 ++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index a2ebcf7f..73cdb6bc 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -31,7 +31,10 @@ import javax.ws.rs.ext.Providers; import java.util.Enumeration; +import java.util.List; import java.util.Random; +import java.util.Set; + /** * Jersey application class for aws-serverless-java-container unit proxy @@ -52,6 +55,15 @@ public SingleValueModel echoDecodedParam(@QueryParam("param") String param) { return model; } + @Path("/list-query-string") @GET + @Produces(MediaType.APPLICATION_JSON) + public SingleValueModel echoQueryStringLength(@QueryParam("list") List param) { + System.out.println("param: " + param + " = " + param.size()); + SingleValueModel model = new SingleValueModel(); + model.setValue(param.size() + ""); + return model; + } + @Path("/encoded-param") @GET @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoEncodedParam(@QueryParam("param") @Encoded String param) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index e23190fb..c93e903e 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -135,14 +135,20 @@ public void queryParam_encoding_expectFullyEncodedUrl() { String paramValue = "/+="; AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertNotNull(resp); + assertEquals(resp.getStatusCode(), 200); + validateSingleValueModel(resp, "%2F%2B%3D"); System.out.println("body:" + resp.getBody()); - /*try { - String encodedParam = URLEncoder.encode(paramValue, "UTF-8"); - validateSingleValueModel(resp, encodedParam); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - fail(); - }*/ + } + + @Test + @Ignore + public void queryParam_listOfString_expectCorrectLength() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3").build(); + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertNotNull(resp); + assertEquals(resp.getStatusCode(), 200); + validateSingleValueModel(resp, "3"); } private void validateSingleValueModel(AwsProxyResponse output, String value) { From 77083935788581ecaa207fd9386d8a12a64b00b4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 22 Jun 2018 11:43:13 -0700 Subject: [PATCH 0164/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.1.3 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index a65d7b72..6f2aec83 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.3-SNAPSHOT + 1.1.3 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index e7d5f777..744a10d0 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.3-SNAPSHOT + 1.1.3 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index ee1872e5..bda915a0 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.3-SNAPSHOT + 1.1.3 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 45dfc179..fa6b509c 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.3-SNAPSHOT + 1.1.3 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 577627b1..1b5e7d3b 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cade01b4..bdc2eee7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3-SNAPSHOT + 1.1.3 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index d35822d7..c7576437 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3-SNAPSHOT + 1.1.3 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c1237b1b..5487ab3c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3-SNAPSHOT + 1.1.3 com.amazonaws.serverless aws-serverless-java-container - 1.1.3-SNAPSHOT + 1.1.3 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3-SNAPSHOT + 1.1.3 diff --git a/pom.xml b/pom.xml index dbdccffc..badd5ee2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.3-SNAPSHOT + 1.1.3 AWS Serverless Java container From dfc93c3b3c0f7cf9cc72e92ec5b311028383b8e1 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 22 Jun 2018 11:43:14 -0700 Subject: [PATCH 0165/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 6f2aec83..459bdfac 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.3 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 744a10d0..196b1a42 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.3 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index bda915a0..b69b5728 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.3 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index fa6b509c..af4cb0f1 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.3 + 1.2-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1b5e7d3b..278a5a98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index bdc2eee7..9e7998ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3 + 1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c7576437..65912e8a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5487ab3c..04ee52c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.3 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.3 + 1.2-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.3 + 1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index badd5ee2..9e57634d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.3 + 1.2-SNAPSHOT AWS Serverless Java container From 285f8d96fc1654945b80a80231eca83908ac9985 Mon Sep 17 00:00:00 2001 From: Jeff Schwartz Date: Wed, 27 Jun 2018 23:37:38 -0400 Subject: [PATCH 0166/1214] #168 - Fixed NPE when no query params are sent with the request --- .../internal/servlet/AwsProxyHttpServletRequest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 3c474d9c..a57ed5ad 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -816,9 +816,11 @@ private String getQueryParamValue(String key, boolean isCaseSensitive) { return request.getQueryStringParameters().get(key); } - for (String k : request.getQueryStringParameters().keySet()) { - if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { - return request.getQueryStringParameters().get(k); + if (request.getQueryStringParameters() != null) { + for (String k : request.getQueryStringParameters().keySet()) { + if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { + return request.getQueryStringParameters().get(k); + } } } From 56a2a054bc9c07a95f0db0a7453c24217550dcfc Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 28 Jun 2018 14:04:38 -0700 Subject: [PATCH 0167/1214] Working towards teh 70% test coverage minimum (#160) and fixing issues as I go along. Header parsing is one here. --- .../servlet/AwsHttpServletRequest.java | 140 ++++++++++++- .../servlet/AwsProxyHttpServletRequest.java | 32 +-- .../proxy/model/ContainerConfig.java | 4 + .../servlet/AwsHttpServletRequestTest.java | 8 +- .../AwsProxyHttpServletRequestTest.java | 193 ++++++++++++++++++ 5 files changed, 348 insertions(+), 29 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index b10bf9f3..b3a3e64c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,6 +58,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final String HEADER_KEY_VALUE_SEPARATOR = "="; static final String HEADER_VALUE_SEPARATOR = ";"; + static final String HEADER_QUALIFIER_SEPARATOR = ","; static final String FORM_DATA_SEPARATOR = "&"; static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; @@ -276,7 +278,7 @@ public void setServletContext(ServletContext context) { * @return An array of Cookie objects from the header */ protected Cookie[] parseCookieHeaderValue(String headerValue) { - List> parsedHeaders = this.parseHeaderValue(headerValue); + List parsedHeaders = this.parseHeaderValue(headerValue, ";", ","); return parsedHeaders.stream() .filter(e -> e.getKey() != null) @@ -336,6 +338,15 @@ protected String generateQueryString(Map parameters, boolean enc } + /** + * Prases a header value using the default value separator "," and qualifier separator ";". + * @param headerValue The value to be parsed + * @return A list of SimpleMapEntry objects with all of the possible values for the header. + */ + protected List parseHeaderValue(String headerValue) { + return parseHeaderValue(headerValue, HEADER_VALUE_SEPARATOR, HEADER_QUALIFIER_SEPARATOR); + } + /** * Generic method to parse an HTTP header value and split it into a list of key/values for all its components. * When the property in the header does not specify a key the key field in the output pair is null and only the value @@ -343,23 +354,58 @@ protected String generateQueryString(Map parameters, boolean enc * key value pairs with key null and the value set to application/json and application/xml respectively. * * @param headerValue The string value for the HTTP header + * @param valueSeparator The separator to be used for parsing header values * @return A list of SimpleMapEntry objects with all of the possible values for the header. */ - protected List> parseHeaderValue(String headerValue) { - List> values = new ArrayList<>(); + protected List parseHeaderValue(String headerValue, String valueSeparator, String qualifierSeparator) { + // Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 + // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 + // Cookie: name=value; name2=value2; name3=value3 + + List values = new ArrayList<>(); if (headerValue == null) { return values; } - for (String kv : headerValue.split(HEADER_VALUE_SEPARATOR)) { - String[] kvSplit = kv.split(HEADER_KEY_VALUE_SEPARATOR); - - if (kvSplit.length != 2) { - values.add(new AbstractMap.SimpleEntry<>(null, kv.trim())); - } else { - values.add(new AbstractMap.SimpleEntry<>(kvSplit[0].trim(), kvSplit[1].trim())); + for (String v : headerValue.split(valueSeparator)) { + String curValue = v; + float curPreference = 1.0f; + HeaderValue newValue = new HeaderValue(); + newValue.setRawValue(v); + + for (String q : curValue.split(qualifierSeparator)) { + if (q.contains(HEADER_KEY_VALUE_SEPARATOR)) { + String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR); + // TODO: Should we concatenate the rest of the values? + if (newValue.getValue() == null) { + newValue.setKey(kv[0].trim()); + newValue.setValue(kv[1].trim()); + } else { + // special case for quality q= + if ("q".equals(kv[0].trim())) { + curPreference = Float.parseFloat(kv[1].trim()); + } else { + newValue.addAttribute(kv[0].trim(), kv[1].trim()); + } + } + } else { + newValue.setValue(q.trim()); + } + newValue.setPriority(curPreference); } + values.add(newValue); } + + // sort list by preference + values.sort((HeaderValue first, HeaderValue second) -> { + if ((first.getPriority() - second.getPriority()) < .001f) { + return 0; + } + if (first.getPriority() < second.getPriority()) { + return 1; + } + return -1; + }); return values; } @@ -373,4 +419,78 @@ protected String decodeRequestPath(String requestPath, ContainerConfig config) { } } + + + /** + * Class that represents a header value. + */ + public static class HeaderValue { + private String key; + private String value; + private String rawValue; + private float priority; + private Map attributes; + + public HeaderValue() { + attributes = new HashMap<>(); + } + + + public String getKey() { + return key; + } + + + public void setKey(String key) { + this.key = key; + } + + + public String getValue() { + return value; + } + + + public void setValue(String value) { + this.value = value; + } + + + public String getRawValue() { + return rawValue; + } + + + public void setRawValue(String rawValue) { + this.rawValue = rawValue; + } + + + public float getPriority() { + return priority; + } + + + public void setPriority(float priority) { + this.priority = priority; + } + + + public Map getAttributes() { + return attributes; + } + + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public void addAttribute(String key, String value) { + attributes.put(key, value); + } + + public String getAttribute(String key) { + return attributes.get(key); + } + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index a57ed5ad..8e5a8d36 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -96,7 +96,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambdaContext, SecurityContext awsSecurityContext) { - this(awsProxyRequest, lambdaContext, awsSecurityContext, ContainerConfig.defaultConfig()); + this(awsProxyRequest, lambdaContext, awsSecurityContext, LambdaContainerHandler.getContainerConfig()); } @@ -211,16 +211,16 @@ public String getPathTranslated() { @Override public String getContextPath() { - if (config.isUseStageAsServletContext()) { - String contextPath = cleanUri(request.getRequestContext().getStage()); - if (config.getServiceBasePath() != null) { - contextPath += cleanUri(config.getServiceBasePath()); - } - - return contextPath; - } else { - return "" + (config.getServiceBasePath() != null ? cleanUri(config.getServiceBasePath()) : ""); + String contextPath = ""; + if (config.isUseStageAsServletContext() && request.getRequestContext().getStage() != null) { + log.debug("Using stage as context path"); + contextPath = cleanUri(request.getRequestContext().getStage()); } + if (config.getServiceBasePath() != null) { + contextPath += cleanUri(config.getServiceBasePath()); + } + + return contextPath; } @@ -584,8 +584,9 @@ public String getRemoteHost() { @Override public Locale getLocale() { - List> values = this.parseHeaderValue( - getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE) + // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 + List values = this.parseHeaderValue( + getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" ); if (values.size() == 0) { return Locale.getDefault(); @@ -596,14 +597,15 @@ public Locale getLocale() { @Override public Enumeration getLocales() { - List> values = this.parseHeaderValue( - getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE) + List values = this.parseHeaderValue( + getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" ); + List locales = new ArrayList<>(); if (values.size() == 0) { locales.add(Locale.getDefault()); } else { - for (Map.Entry locale : values) { + for (HeaderValue locale : values) { locales.add(new Locale(locale.getValue())); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 37cfd2a2..ef81d4c8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -69,6 +69,10 @@ public String getServiceBasePath() { * @param serviceBasePath The base path mapping to be removed. */ public void setServiceBasePath(String serviceBasePath) { + if (serviceBasePath == null) { + this.serviceBasePath = null; + return; + } // clean up base path before setting it, we want a "/" at the beginning but not at the end. String finalBasePath = serviceBasePath; if (!finalBasePath.startsWith("/")) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 4417f37b..22b85149 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -39,7 +39,7 @@ public class AwsHttpServletRequestTest { public void headers_parseHeaderValue_multiValue() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(contentTypeRequest, mockContext, null, config); // I'm also using this to double-check that I can get a header ignoring case - List> values = request.parseHeaderValue(request.getHeader("content-type")); + List values = request.parseHeaderValue(request.getHeader("content-type")); assertEquals(2, values.size()); assertEquals("application/xml", values.get(0).getValue()); @@ -52,7 +52,7 @@ public void headers_parseHeaderValue_multiValue() { @Test public void headers_parseHeaderValue_validMultipleCookie() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(validCookieRequest, mockContext, null, config); - List> values = request.parseHeaderValue(request.getHeader(HttpHeaders.COOKIE)); + List values = request.parseHeaderValue(request.getHeader(HttpHeaders.COOKIE), ";", ","); assertEquals(2, values.size()); assertEquals("yummy_cookie", values.get(0).getKey()); @@ -64,14 +64,14 @@ public void headers_parseHeaderValue_validMultipleCookie() { @Test public void headers_parseHeaderValue_complexAccept() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null, config); - List> values = request.parseHeaderValue(request.getHeader(HttpHeaders.ACCEPT)); + List values = request.parseHeaderValue(request.getHeader(HttpHeaders.ACCEPT), ",", ";"); try { System.out.println(new ObjectMapper().writeValueAsString(values)); } catch (JsonProcessingException e) { e.printStackTrace(); } - assertEquals(3, values.size()); + assertEquals(4, values.size()); } @Test diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index f18656bb..ed14ae17 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -1,19 +1,28 @@ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import org.apache.commons.io.input.NullInputStream; import org.junit.Test; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.ZonedDateTime; +import java.util.ArrayList; import java.util.Collections; +import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.Map; @@ -332,11 +341,195 @@ public void contentType_duplicateCase_expectSingleContentTypeHeader() { fail("Unsupported encoding"); e.printStackTrace(); } + } + + @Test + public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { + AwsProxyRequest req = getRequestWithHeaders(); + req.getRequestContext().setApiId("test-id"); + LambdaContainerHandler.getContainerConfig().enableLocalhost(); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + String requestUrl = servletRequest.getRequestURL().toString(); + assertTrue(requestUrl.contains("http://")); + assertTrue(requestUrl.contains("test-id.execute-api.")); + assertTrue(requestUrl.endsWith(".com/hello")); + + // set localhost + req.getHeaders().put("Host", "localhost"); + servletRequest = new AwsProxyHttpServletRequest(req, null, null); + requestUrl = servletRequest.getRequestURL().toString(); + assertTrue(requestUrl.contains("http://localhost")); + assertTrue(requestUrl.endsWith("localhost/hello")); + LambdaContainerHandler.getContainerConfig().getCustomDomainNames().remove("localhost"); + } + + @Test + public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { + AwsProxyRequest req = getRequestWithHeaders(); + LambdaContainerHandler.getContainerConfig().setServiceBasePath("test"); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + String requestUrl = servletRequest.getRequestURL().toString(); + assertTrue(requestUrl.contains("/test/hello")); + LambdaContainerHandler.getContainerConfig().setServiceBasePath(null); + } + + @Test + public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { + AwsProxyRequest req = getRequestWithHeaders(); + req.getRequestContext().setStage("test-stage"); + LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + String requestUrl = servletRequest.getRequestURL().toString(); + System.out.println("Url: " + requestUrl); + assertTrue(requestUrl.contains("/test-stage/")); + LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); + } + + @Test + public void getLocales_emptyAcceptHeader_expectDefaultLocale() { + AwsProxyRequest req = getRequestWithHeaders(); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + Enumeration locales = servletRequest.getLocales(); + int localesNo = 0; + while (locales.hasMoreElements()) { + Locale defaultLocale = locales.nextElement(); + assertEquals(Locale.getDefault(), defaultLocale); + localesNo++; + } + assertEquals(1, localesNo); + } + @Test + public void getLocales_validAcceptHeader_expectSingleLocale() { + AwsProxyRequest req = getRequestWithHeaders(); + req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + Enumeration locales = servletRequest.getLocales(); + int localesNo = 0; + while (locales.hasMoreElements()) { + Locale defaultLocale = locales.nextElement(); + assertEquals(new Locale("fr-CH"), defaultLocale); + localesNo++; + } + assertEquals(1, localesNo); + } + @Test + public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { + AwsProxyRequest req = getRequestWithHeaders(); + req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + Enumeration locales = servletRequest.getLocales(); + List localesList = new ArrayList<>(); + while (locales.hasMoreElements()) { + localesList.add(locales.nextElement()); + } + assertEquals(5, localesList.size()); + assertEquals(new Locale("fr-CH"), localesList.get(0)); + assertEquals(new Locale("fr"), localesList.get(1)); + assertEquals(new Locale("en"), localesList.get(2)); + assertEquals(new Locale("de"), localesList.get(3)); + assertEquals(new Locale("*"), localesList.get(4)); + + assertNotNull(servletRequest.getLocale()); + assertEquals(new Locale("fr-CH"), servletRequest.getLocale()); + } + @Test + public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered() { + AwsProxyRequest req = getRequestWithHeaders(); + req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + Enumeration locales = servletRequest.getLocales(); + List localesList = new ArrayList<>(); + while (locales.hasMoreElements()) { + localesList.add(locales.nextElement()); + } + assertEquals(5, localesList.size()); + assertEquals(new Locale("fr-CH"), localesList.get(0)); + assertEquals(new Locale("fr"), localesList.get(1)); + assertEquals(new Locale("en"), localesList.get(2)); + assertEquals(new Locale("de"), localesList.get(3)); + assertEquals(new Locale("*"), localesList.get(4)); + } + + @Test + public void nullQueryString_expectNoExceptions() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletReq = new AwsProxyHttpServletRequest(req, null, null); + assertNull(servletReq.getQueryString()); + assertEquals(0, servletReq.getParameterMap().size()); + assertFalse(servletReq.getParameterNames().hasMoreElements()); + assertNull(servletReq.getParameter("param")); + assertNull(servletReq.getParameterValues("param")); } + @Test + public void inputStream_emptyBody_expectNullInputStream() { + AwsProxyRequest proxyReq = getRequestWithHeaders(); + assertNull(proxyReq.getBody()); + HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + + try { + InputStream is = req.getInputStream(); + assertTrue(is.getClass() == AwsProxyHttpServletRequest.AwsServletInputStream.class); + assertEquals(0, is.available()); + } catch (IOException e) { + fail("Could not get input stream"); + } + } + + @Test + public void getHeaders_emptyHeaders_expectEmptyEnumeration() { + AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/hello", "GET").build(); + HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + assertFalse(req.getHeaders("param").hasMoreElements()); + } + + @Test + public void getServerPort_defaultPort_expect443() { + HttpServletRequest req = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + assertEquals(443, req.getServerPort()); + } + + @Test + public void getServerPort_customPortFromHeader_expectCustomPort() { + AwsProxyRequest proxyReq = getRequestWithHeaders(); + proxyReq.getHeaders().put(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); + HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + assertEquals(80, req.getServerPort()); + } + + @Test + public void getServerPort_invalidCustomPortFromHeader_expectDefaultPort() { + AwsProxyRequest proxyReq = getRequestWithHeaders(); + proxyReq.getHeaders().put(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); + HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + assertEquals(443, req.getServerPort()); + } + + @Test + public void setHeaderCaseInsensitive_setHeader() { + HttpServletRequest req = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + try { + Method setMethod = req.getClass().getDeclaredMethod("setHeaderCaseInsensitive", String.class, String.class); + setMethod.setAccessible(true); + setMethod.invoke(req,"Head", "head"); + assertNotNull(req.getHeader("Head")); + assertEquals("head", req.getHeader("Head")); + + assertNotNull(req.getHeader("head")); + assertEquals("head", req.getHeader("head")); + } catch (NoSuchMethodException e) { + fail("Cannot get set header method"); + e.printStackTrace(); + } catch (IllegalAccessException | InvocationTargetException e) { + fail("Cannot invoke method dynamically"); + e.printStackTrace(); + } + } + + private AwsProxyRequest getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) From a4e5a523b6bfaa199c62c5353606247d94a16db9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 28 Jun 2018 15:43:16 -0700 Subject: [PATCH 0168/1214] Minor fixes/simplifications for AwsServletContext and unit tests to keep addressing #160 --- .../proxy/internal/SecurityUtils.java | 12 +- .../internal/servlet/AwsServletContext.java | 10 +- .../servlet/AwsServletContextTest.java | 253 ++++++++++++++++++ 3 files changed, 263 insertions(+), 12 deletions(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index c10d74fb..564882de 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -168,12 +168,16 @@ public static String getValidFilePath(String inputPath) { * @throws IllegalArgumentException If the given path is not valid or outside of /tmp */ @SuppressFBWarnings("PATH_TRAVERSAL_IN") - public static String getValidFilePath(String inputPath, boolean isWrite) { + public static String getValidFilePath(final String inputPath, boolean isWrite) { if (inputPath == null || "".equals(inputPath.trim())) { return null; } + String testInputPath = inputPath; + if (testInputPath.startsWith("file://")) { + testInputPath = testInputPath.substring(6); + } - File f = new File(inputPath); + File f = new File(testInputPath); try { String canonicalPath = f.getCanonicalPath(); @@ -192,9 +196,9 @@ public static String getValidFilePath(String inputPath, boolean isWrite) { throw new IllegalArgumentException("File path not allowed: " + encode(canonicalPath)); } - return canonicalPath; + return (inputPath.startsWith("file://") ? "file://" + canonicalPath : canonicalPath); } catch (IOException e) { - log.error("Invalid file path: {}", encode(inputPath)); + log.error("Invalid file path: {}", encode(testInputPath)); throw new IllegalArgumentException("Invalid file path", e); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 7cc73aad..938b143e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -145,13 +145,7 @@ public int getEffectiveMinorVersion() { public String getMimeType(String s) { try { String validatedPath = SecurityUtils.getValidFilePath(s); - if (s.startsWith("file:")) { // Support paths such as file:/D:/something/hello.txt - return Files.probeContentType(Paths.get(URI.create(validatedPath))); - } else if (s.startsWith("/")) { // Support paths such as file:/D:/something/hello.txt - return Files.probeContentType(Paths.get(URI.create("file://" + validatedPath))); - } else { - return Files.probeContentType(Paths.get(validatedPath)); - } + return Files.probeContentType(Paths.get(validatedPath)); } catch (IOException e) { log.warn("Could not find content type for file: " + SecurityUtils.encode(s), e); return null; @@ -352,7 +346,7 @@ public ServletRegistration getServletRegistration(String s) { public FilterRegistration.Dynamic addFilter(String name, String filterClass) { try { Class newFilterClass = getClassLoader().loadClass(filterClass); - if (!newFilterClass.isAssignableFrom(Filter.class)) { + if (!Filter.class.isAssignableFrom(newFilterClass)) { throw new IllegalArgumentException(filterClass + " does not implement Filter"); } @SuppressWarnings("unchecked") diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java new file mode 100644 index 00000000..57c688b3 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -0,0 +1,253 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.filters.UrlPathValidator; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.FilterRegistration; +import javax.servlet.Servlet; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.*; + +public class AwsServletContextTest { + private static String TMP_DIR = System.getProperty("java.io.tmpdir"); + private static final AwsServletContext STATIC_CTX = new AwsServletContext(null); + + @BeforeClass + public static void setUp() { + LambdaContainerHandler.getContainerConfig().addValidFilePath("/private/var/task"); + File tmpFile = new File(TMP_DIR); + try { + LambdaContainerHandler.getContainerConfig().addValidFilePath(tmpFile.getCanonicalPath()); + } catch (IOException e) { + fail("Could not add tmp dir to valid paths"); + e.printStackTrace(); + } + LambdaContainerHandler.getContainerConfig().addValidFilePath("C:\\MyTestFolder"); + } + + @Test + public void getMimeType_disabledPath_expectException() { + AwsServletContext ctx = new AwsServletContext(null); + try { + assertNull(ctx.getMimeType("/usr/local/lib/nothing")); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().startsWith("File path not allowed")); + } catch (Exception e) { + fail("Unrecognized exception"); + e.printStackTrace(); + } + } + + @Test + public void getMimeType_nonExistentFileInTaskPath_expectNull() { + AwsServletContext ctx = new AwsServletContext(null); + assertNull(ctx.getMimeType("/var/task/nothing")); + } + + @Test + public void getMimeType_mimeTypeOfCorrectFile_expectMime() { + String tmpFilePath = TMP_DIR + "test_text.txt"; + try { + PrintWriter tmpWriter = new PrintWriter(tmpFilePath, "UTF-8"); + tmpWriter.write("Test case for aws-serverless-java-container"); + tmpWriter.close(); + + AwsServletContext ctx = new AwsServletContext(null); + String mimeType = ctx.getMimeType(tmpFilePath); + String deducedMimeType = Files.probeContentType(Paths.get(tmpFilePath)); + assertEquals(deducedMimeType, mimeType); + + mimeType = ctx.getMimeType("file://" + tmpFilePath); + assertEquals(deducedMimeType, mimeType); + } catch (FileNotFoundException e) { + fail("tmp file not found"); + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + fail("Unsupported encoding"); + e.printStackTrace(); + } catch (IOException e) { + fail("Failed to prove tmp file content type"); + e.printStackTrace(); + } + } + + @Test + public void addFilter_nonExistentFilterClass_expectException() { + AwsServletContext ctx = new AwsServletContext(null); + String filterClass = "com.amazonaws.serverless.TestingFilterClassNonExistent"; + try { + ctx.addFilter("filter", filterClass); + } catch (IllegalStateException e) { + assertTrue(e.getMessage().startsWith("Filter class " + filterClass)); + return; + } + fail("Expected IllegalStateException"); + } + + @Test + public void addFilter_doesNotImplementFilter_expectException() { + AwsServletContext ctx = new AwsServletContext(null); + try { + ctx.addFilter("filter", this.getClass().getName()); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().startsWith(this.getClass().getName() + " does not implement Filter")); + return; + } + fail("Expected IllegalArgumentException"); + } + + @Test + public void addFilter_validFilter_expectSuccess() { + AwsServletContext ctx = new AwsServletContext(null); + FilterRegistration.Dynamic reg = ctx.addFilter("filter", UrlPathValidator.class.getName()); + assertNotNull(reg); + assertNotNull(ctx.getFilterHolders()); + assertEquals(1, ctx.getFilterHolders().size()); + // uses annotated filter name + assertEquals(reg, ctx.getFilterRegistration("UrlPathValidator")); + + assertNotNull(ctx.getFilterRegistrations()); + assertEquals(1, ctx.getFilterRegistrations().size()); + } + + @Test + public void addFilter_validFilter_expectSuccessWithCustomFilterName() { + AwsServletContext ctx = new AwsServletContext(null); + FilterRegistration.Dynamic reg = ctx.addFilter("filter", TestFilter.class.getName()); + assertNotNull(reg); + assertNotNull(ctx.getFilterHolders()); + assertEquals(1, ctx.getFilterHolders().size()); + // uses annotated filter name + assertEquals(reg, ctx.getFilterRegistration("filter")); + + assertNotNull(ctx.getFilterRegistrations()); + assertEquals(1, ctx.getFilterRegistrations().size()); + } + + @Test + public void getContextPath_expectEmpty() { + assertEquals("", STATIC_CTX.getContextPath()); + } + + @Test + public void getContext_returnsSameContext() { + assertEquals(STATIC_CTX, STATIC_CTX.getContext("1")); + assertEquals(STATIC_CTX, STATIC_CTX.getContext("2")); + } + + @Test + public void getVersions_expectStaticVersions() { + assertEquals(AwsServletContext.SERVLET_API_MAJOR_VERSION, STATIC_CTX.getMajorVersion()); + assertEquals(AwsServletContext.SERVLET_API_MINOR_VERSION, STATIC_CTX.getMinorVersion()); + assertEquals(AwsServletContext.SERVLET_API_MAJOR_VERSION, STATIC_CTX.getEffectiveMajorVersion()); + assertEquals(AwsServletContext.SERVLET_API_MINOR_VERSION, STATIC_CTX.getEffectiveMinorVersion()); + } + + @Test + public void unsupportedOprations_expectExceptions() { + int exCount = 0; + try { + STATIC_CTX.getResourcePaths("1"); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + STATIC_CTX.getNamedDispatcher("1"); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + STATIC_CTX.getServlet("1"); + } catch (UnsupportedOperationException e) { + exCount++; + } catch (ServletException e) { + fail("Unexpected exception from unimplemented method"); + e.printStackTrace(); + } + try { + STATIC_CTX.addServlet("1", ""); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + STATIC_CTX.addServlet("1", new Servlet() { + @Override + public void init(ServletConfig config) + throws ServletException { + + } + + + @Override + public ServletConfig getServletConfig() { + return null; + } + + + @Override + public void service(ServletRequest req, ServletResponse res) + throws ServletException, IOException { + + } + + + @Override + public String getServletInfo() { + return null; + } + + + @Override + public void destroy() { + + } + }); + } catch (UnsupportedOperationException e) { + exCount++; + } + assertEquals(5, exCount); + + assertNull(STATIC_CTX.getServletRegistration("1")); + assertNull(STATIC_CTX.getServletRegistrations()); + } + + public static class TestFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + + } + + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + } + + + @Override + public void destroy() { + + } + } +} From 88b0da3c5906c11976512c2173513af9417af0f4 Mon Sep 17 00:00:00 2001 From: Jeff Schwartz Date: Thu, 28 Jun 2018 20:37:24 -0400 Subject: [PATCH 0169/1214] Upgrade spark to 2.7.2. Spark 2.7.2 fixes a security problem --- archetypes/spark/src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index e40b9258..14667ead 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.9.5 - 2.7.1 + 2.7.2 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 65912e8a..5aac26d2 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -15,7 +15,7 @@ - 2.7.1 + 2.7.2 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 824d7c6c..6cd8af47 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.9.4 - 2.7.1 + 2.7.2 From 4fdc8e984002aeda0981057cb75ed96486443597 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 29 Jun 2018 07:43:25 -0700 Subject: [PATCH 0170/1214] Minor change to unit test to fix linux build issue --- .../proxy/internal/servlet/AwsServletContextTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 57c688b3..faf29855 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -64,8 +64,9 @@ public void getMimeType_nonExistentFileInTaskPath_expectNull() { @Test public void getMimeType_mimeTypeOfCorrectFile_expectMime() { - String tmpFilePath = TMP_DIR + "test_text.txt"; + String tmpFilePath = TMP_DIR + "/test_text.txt"; try { + System.out.println("Writing to tmp file " + tmpFilePath); PrintWriter tmpWriter = new PrintWriter(tmpFilePath, "UTF-8"); tmpWriter.write("Test case for aws-serverless-java-container"); tmpWriter.close(); From fef658591bbd1a8cfe3ca57968672c8919a45cfa Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 13 Jul 2018 12:03:23 -0700 Subject: [PATCH 0171/1214] Servlet response tests - chipping away at #160 --- .../servlet/AwsHttpServletResponse.java | 5 +- .../servlet/AwsHttpServletResponseTest.java | 125 ++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index de0f58c2..1efd1ce0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -396,6 +396,7 @@ public boolean isCommitted() { public void reset() { headers = new MultivaluedHashMap<>(); responseBody = null; + writer = null; bodyOutputStream = new ByteArrayOutputStream(); } @@ -429,7 +430,7 @@ byte[] getAwsResponseBodyBytes() { Map getAwsResponseHeaders() { - Map responseHeaders = new HashMap<>(); + Map responseHeaders = new TreeMap<>(String::compareToIgnoreCase); for (String header : getHeaderNames()) { // special behavior for set cookie // RFC 2109 allows for a comma separated list of cookies in one Set-Cookie header: https://tools.ietf.org/html/rfc2109 @@ -445,7 +446,7 @@ Map getAwsResponseHeaders() { responseHeaders.put(header, cookieHeader.toString()); } else { - responseHeaders.put(header, headers.getFirst(header)); + responseHeaders.put(header, headers.get(header).get(headers.get(header).size() - 1)); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 553b7c61..b3d8c59f 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -5,11 +5,17 @@ import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.io.PrintWriter; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Instant; import java.util.Calendar; +import java.util.Map; import java.util.TimeZone; +import java.util.concurrent.CountDownLatch; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -140,6 +146,125 @@ public void cookie_addCookieWithoutMaxAge_expectNoExpires() { assertFalse(cookieHeader.contains("Expires")); } + @Test + public void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + resp.addHeader("content-type", "application/xml"); + + Map awsResp = resp.getAwsResponseHeaders(); + assertEquals(1, awsResp.size()); + assertEquals("application/json", awsResp.get(HttpHeaders.CONTENT_TYPE)); + } + + @Test + public void responseHeaders_getAwsResponseHeaders_expectMergedCookies() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.addCookie(new Cookie(COOKIE_NAME, COOKIE_VALUE)); + resp.addCookie(new Cookie("Second", "test")); + + Map awsResp = resp.getAwsResponseHeaders(); + assertEquals(1, awsResp.size()); + assertEquals(2, awsResp.get(HttpHeaders.SET_COOKIE).split(",").length); + } + + @Test + public void releaseLatch_flushBuffer_expectFlushToWriteAndRelease() { + CountDownLatch respLatch = new CountDownLatch(1); + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, respLatch); + String respBody = "Test resp"; + PrintWriter writer = null; + try { + writer = resp.getWriter(); + PrintWriter finalWriter = writer; + Runnable bodyWriter = () -> { + finalWriter.write(respBody); + try { + resp.flushBuffer(); + } catch (IOException e) { + fail("Could not flush buffer"); + } + }; + + new Thread(bodyWriter).start(); + } catch (IOException e) { + fail("Could not get writer"); + } + + try { + respLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + fail("Response latch interrupted"); + } + + assertEquals(0, respLatch.getCount()); + assertNotNull(writer); + assertEquals(respBody, resp.getAwsResponseBodyString()); + } + + @Test + public void dateHeader_addDateHeader_expectMultipleHeaders() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.addDateHeader("Date", Instant.now().toEpochMilli()); + resp.addDateHeader("Date", Instant.now().toEpochMilli() - 1000); + + assertEquals(2, resp.getHeaders("Date").size()); + } + + @Test + public void dateHeader_setDateHeader_expectSingleHeader() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setDateHeader("Date", Instant.now().toEpochMilli()); + resp.setDateHeader("Date", Instant.now().toEpochMilli() - 1000); + + assertEquals(1, resp.getHeaders("Date").size()); + } + + @Test + public void response_reset_expectEmptyHeadersAndBody() { + CountDownLatch respLatch = new CountDownLatch(1); + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, respLatch); + String body = "My Body"; + + resp.addHeader("Test", "test"); + try { + resp.getWriter().write(body); + resp.flushBuffer(); + } catch (IOException e) { + fail("Could not get writer"); + } + + assertEquals(1, resp.getHeaderNames().size()); + assertEquals(body, resp.getAwsResponseBodyString()); + + resp.reset(); + + assertEquals(0, resp.getHeaderNames().size()); + } + + @Test + public void headers_setIntHeader_expectSingleHeaderValue() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setIntHeader("Test", 15); + resp.setIntHeader("Test", 34); + + assertEquals(1, resp.getHeaderNames().size()); + assertEquals(1, resp.getHeaders("Test").size()); + assertEquals("34", resp.getHeader("Test")); + } + + @Test + public void headers_addIntHeader_expectMultipleHeaderValues() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.addIntHeader("Test", 15); + resp.addIntHeader("Test", 34); + + assertEquals(1, resp.getHeaderNames().size()); + assertEquals(2, resp.getHeaders("Test").size()); + assertEquals("15", resp.getHeader("Test")); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); From e346e349543aa16337b755fab812eec6d6fc7769 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 13 Jul 2018 12:50:55 -0700 Subject: [PATCH 0172/1214] Bump spring version to address CVE-2018-1275, CVE-2018-1270 --- aws-serverless-java-container-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04ee52c2..c877425c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -15,7 +15,7 @@ - 5.0.3.RELEASE + 5.0.7.RELEASE 5.0.1.RELEASE 2.9.5 From 5914eb3e8359eaa042aa44eea8380d671ae0d2a6 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 09:37:01 -0700 Subject: [PATCH 0173/1214] Switched from @ComponentScan to @Import in Spring archetype --- .../archetype-resources/src/main/java/SpringApiConfig.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java index f8cb9fb9..e40ad8bb 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java +++ b/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java @@ -3,6 +3,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerMapping; @@ -13,9 +14,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import ${groupId}.controller.PingController; + @Configuration -@ComponentScan("${groupId}.controller") +// We use direct @Import instead of @ComponentScan to speed up cold starts +// @ComponentScan("${groupId}.controller") +@Import({ PingController.class }) public class SpringApiConfig { /* * Create required HandlerMapping, to avoid several default HandlerMapping instances being created From e94e591d9cd6d1a33d0751b6333ebc3fd9d89f32 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 10:16:17 -0700 Subject: [PATCH 0174/1214] Replaced @ComponentScan with @Import for spring boot archetype --- .../archetype-resources/src/main/java/Application.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java index 0db19bae..119f698f 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java +++ b/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java @@ -10,7 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerMapping; @@ -21,9 +21,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import ${groupId}.controller.PingController; + @SpringBootApplication -@ComponentScan(basePackages = "${groupId}.controller") +// We use direct @Import instead of @ComponentScan to speed up cold starts +// @ComponentScan(basePackages = "${groupId}.controller") +@Import({ PingController.class }) public class Application extends SpringBootServletInitializer { /* From 74e66004f587686de86028f24d60a092a2300d18 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 10:32:36 -0700 Subject: [PATCH 0175/1214] Bump in Spring version to address CVE and fixed null checks in query string --- .../internal/servlet/AwsProxyHttpServletRequest.java | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index a57ed5ad..dad4f560 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -812,11 +812,11 @@ public static String decodeValueIfEncoded(String value) { private String getQueryParamValue(String key, boolean isCaseSensitive) { - if (isCaseSensitive) { - return request.getQueryStringParameters().get(key); - } - if (request.getQueryStringParameters() != null) { + if (isCaseSensitive) { + return request.getQueryStringParameters().get(key); + } + for (String k : request.getQueryStringParameters().keySet()) { if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { return request.getQueryStringParameters().get(k); diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04ee52c2..c877425c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -15,7 +15,7 @@ - 5.0.3.RELEASE + 5.0.7.RELEASE 5.0.1.RELEASE 2.9.5 From 8f321c57840c45b4476b13680262a1319125cf13 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 10:54:19 -0700 Subject: [PATCH 0176/1214] Preparing for 1.1.4 patch release --- archetypes/jersey/pom.xml | 4 ++-- .../jersey/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spark/pom.xml | 4 ++-- .../spark/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/spring/pom.xml | 4 ++-- .../spring/src/main/resources/archetype-resources/pom.xml | 2 +- archetypes/springboot/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfac..610e2857 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT maven-archetype diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml index 687766cb..37a26f72 100644 --- a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/jersey/src/main/resources/archetype-resources/pom.xml @@ -20,7 +20,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.1.3 + 1.1.4 diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42..15952ecd 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT maven-archetype diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index 14667ead..c78e6d12 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.1.3 + 1.1.4 diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b5728..6a0f4b0c 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT maven-archetype diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/archetypes/spring/src/main/resources/archetype-resources/pom.xml index a3d0557e..31a8d28d 100644 --- a/archetypes/spring/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spring/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.3 + 1.1.4 diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1..b466bec0 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml index 5c413143..0b56f279 100644 --- a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/springboot/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.3 + 1.1.4 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..fb723014 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec..51835a80 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5aac26d2..80849f86 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c877425c..dac64026 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index 9e57634d..0e8f614f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2-SNAPSHOT + 1.1.4-SNAPSHOT AWS Serverless Java container From 8053e76bfa370883f392874c93f5e2c0597f2908 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 12:28:30 -0700 Subject: [PATCH 0177/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.1.4 --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 610e2857..26383fc1 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.4-SNAPSHOT + 1.1.4 maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 15952ecd..d71deedf 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.4-SNAPSHOT + 1.1.4 maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 6a0f4b0c..2c9f55e1 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.4-SNAPSHOT + 1.1.4 maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index b466bec0..5e058750 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.4-SNAPSHOT + 1.1.4 maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fb723014..ba125e59 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 51835a80..985925d7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4-SNAPSHOT + 1.1.4 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 80849f86..8b906ea6 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4-SNAPSHOT + 1.1.4 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index dac64026..1df5f1d1 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4-SNAPSHOT + 1.1.4 com.amazonaws.serverless aws-serverless-java-container - 1.1.4-SNAPSHOT + 1.1.4 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4-SNAPSHOT + 1.1.4 diff --git a/pom.xml b/pom.xml index 0e8f614f..288ccd17 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.4-SNAPSHOT + 1.1.4 AWS Serverless Java container From 0fa8730997c36d20faf04d36b2a3a42bfa656ec6 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 2 Aug 2018 12:28:31 -0700 Subject: [PATCH 0178/1214] [maven-release-plugin] prepare for next development iteration --- archetypes/jersey/pom.xml | 4 ++-- archetypes/spark/pom.xml | 4 ++-- archetypes/spring/pom.xml | 4 ++-- archetypes/springboot/pom.xml | 4 ++-- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 26383fc1..459bdfac 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.1.4 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index d71deedf..196b1a42 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.1.4 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index 2c9f55e1..b69b5728 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.1.4 + 1.2-SNAPSHOT maven-archetype diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index 5e058750..af4cb0f1 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.1.4 + 1.2-SNAPSHOT maven-archetype diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ba125e59..278a5a98 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 985925d7..9e7998ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4 + 1.2-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 8b906ea6..5aac26d2 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4 + 1.2-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1df5f1d1..c877425c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.1.4 + 1.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.1.4 + 1.2-SNAPSHOT @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.1.4 + 1.2-SNAPSHOT diff --git a/pom.xml b/pom.xml index 288ccd17..9e57634d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.1.4 + 1.2-SNAPSHOT AWS Serverless Java container From 9f13d3a931902bd89fa0b448d7d9d7db778e31cf Mon Sep 17 00:00:00 2001 From: Norris Shelton Date: Fri, 17 Aug 2018 13:34:57 -0400 Subject: [PATCH 0179/1214] Moving archetypes up one directory. https://github.com/awslabs/aws-serverless-java-container/issues/185 --- .../jersey => aws-serverless-jersey-archetype}/pom.xml | 0 .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/README.md | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../src/main/resources/archetype-resources/sam.yaml | 0 .../src/main/java/StreamLambdaHandler.java | 0 .../src/main/java/resource/PingResource.java | 0 .../src/test/java/StreamLambdaHandlerTest.java | 0 .../spark => aws-serverless-spark-archetype}/pom.xml | 0 .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/README.md | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../src/main/resources/archetype-resources/sam.yaml | 0 .../archetype-resources/src/main/java/SparkResources.java | 0 .../src/main/java/StreamLambdaHandler.java | 0 .../src/main/java/util/JsonTransformer.java | 0 .../src/test/java/StreamLambdaHandlerTest.java | 0 .../spring => aws-serverless-spring-archetype}/pom.xml | 0 .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/README.md | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../src/main/resources/archetype-resources/sam.yaml | 0 .../src/main/java/SpringApiConfig.java | 0 .../src/main/java/StreamLambdaHandler.java | 0 .../src/main/java/controller/PingController.java | 0 .../archetype-resources/src/main/resources/log4j2.xml | 0 .../src/test/java/StreamLambdaHandlerTest.java | 0 .../pom.xml | 0 .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/README.md | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../src/main/resources/archetype-resources/sam.yaml | 0 .../archetype-resources/src/main/java/Application.java | 0 .../src/main/java/StreamLambdaHandler.java | 0 .../src/main/java/controller/PingController.java | 0 .../src/main/resources/application.properties | 0 .../src/test/java/StreamLambdaHandlerTest.java | 0 pom.xml | 8 ++++---- 38 files changed, 4 insertions(+), 4 deletions(-) rename {archetypes/jersey => aws-serverless-jersey-archetype}/pom.xml (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/README.md (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/sam.yaml (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java (100%) rename {archetypes/jersey => aws-serverless-jersey-archetype}/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/pom.xml (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/README.md (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/sam.yaml (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/src/main/java/SparkResources.java (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java (100%) rename {archetypes/spark => aws-serverless-spark-archetype}/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/pom.xml (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/README.md (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/sam.yaml (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/src/main/java/controller/PingController.java (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/src/main/resources/log4j2.xml (100%) rename {archetypes/spring => aws-serverless-spring-archetype}/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/pom.xml (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/README.md (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/sam.yaml (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/src/main/java/Application.java (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/src/main/java/controller/PingController.java (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/src/main/resources/application.properties (100%) rename {archetypes/springboot => aws-serverless-springboot-archetype}/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java (100%) diff --git a/archetypes/jersey/pom.xml b/aws-serverless-jersey-archetype/pom.xml similarity index 100% rename from archetypes/jersey/pom.xml rename to aws-serverless-jersey-archetype/pom.xml diff --git a/archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from archetypes/jersey/src/main/resources/META-INF/maven/archetype-metadata.xml rename to aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/archetypes/jersey/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/README.md rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md diff --git a/archetypes/jersey/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/pom.xml rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/archetypes/jersey/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java diff --git a/archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java similarity index 100% rename from archetypes/jersey/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/spark/pom.xml b/aws-serverless-spark-archetype/pom.xml similarity index 100% rename from archetypes/spark/pom.xml rename to aws-serverless-spark-archetype/pom.xml diff --git a/archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from archetypes/spark/src/main/resources/META-INF/maven/archetype-metadata.xml rename to aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/archetypes/spark/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/README.md rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/pom.xml rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/archetypes/spark/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/src/main/java/SparkResources.java rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java diff --git a/archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java similarity index 100% rename from archetypes/spark/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/spring/pom.xml b/aws-serverless-spring-archetype/pom.xml similarity index 100% rename from archetypes/spring/pom.xml rename to aws-serverless-spring-archetype/pom.xml diff --git a/archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from archetypes/spring/src/main/resources/META-INF/maven/archetype-metadata.xml rename to aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/archetypes/spring/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/README.md rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md diff --git a/archetypes/spring/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/pom.xml rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/archetypes/spring/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/src/main/java/controller/PingController.java rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/src/main/resources/log4j2.xml rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml diff --git a/archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java similarity index 100% rename from archetypes/spring/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/archetypes/springboot/pom.xml b/aws-serverless-springboot-archetype/pom.xml similarity index 100% rename from archetypes/springboot/pom.xml rename to aws-serverless-springboot-archetype/pom.xml diff --git a/archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from archetypes/springboot/src/main/resources/META-INF/maven/archetype-metadata.xml rename to aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/archetypes/springboot/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/README.md rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md diff --git a/archetypes/springboot/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/pom.xml rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/archetypes/springboot/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/src/main/java/Application.java rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/src/main/java/controller/PingController.java rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/src/main/resources/application.properties rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties diff --git a/archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java similarity index 100% rename from archetypes/springboot/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/pom.xml b/pom.xml index 9e57634d..1534093b 100644 --- a/pom.xml +++ b/pom.xml @@ -19,10 +19,10 @@ aws-serverless-java-container-jersey aws-serverless-java-container-spark aws-serverless-java-container-spring - archetypes/jersey - archetypes/spark - archetypes/spring - archetypes/springboot + aws-serverless-jersey-archetype + aws-serverless-spark-archetype + aws-serverless-spring-archetype + aws-serverless-springboot-archetype From 6af00229d8ba8aa7f2e3f518bcdc14fb59238c58 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sat, 18 Aug 2018 13:53:39 +0200 Subject: [PATCH 0180/1214] Add link to Apache Struts project and to quick start guide for lambdas based on Struts2 https://github.com/awslabs/aws-serverless-java-container/issues/149 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 752dca60..389f2af8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) -The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). +The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Apache Struts](http://struts.apache.org/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) +* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts-Boot) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From fbf4810b05c107d29ac5becd1e7dcd654c8c6b1b Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sat, 18 Aug 2018 13:54:42 +0200 Subject: [PATCH 0181/1214] Correct link for quick start guide for lambdas based on Struts2 https://github.com/awslabs/aws-serverless-java-container/issues/149 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 389f2af8..f938a946 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) -* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts-Boot) +* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From cd9917f62a564a87443bb82a961f57cb6bf2498e Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sat, 18 Aug 2018 14:18:21 +0200 Subject: [PATCH 0182/1214] Correct link for quick start guide for lambdas based on Struts2 https://github.com/awslabs/aws-serverless-java-container/issues/149 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f938a946..3823b65b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) -* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) +* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start-Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From e9e474f37193c793c6a72e569799274844bd1a47 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Thu, 23 Aug 2018 09:09:22 +0200 Subject: [PATCH 0183/1214] Switch to latest Struts2 version 2.5.17 with important security fixes https://github.com/awslabs/aws-serverless-java-container/issues/149 --- aws-serverless-java-container-struts2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 60c75bae..f72d6cf6 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ - 2.5.16 + 2.5.17 2.9.5 From 87b83a121bfe3c73b6e7041539f3ae25ab4b7a73 Mon Sep 17 00:00:00 2001 From: Lars Mogren Date: Thu, 30 Aug 2018 12:16:58 +0200 Subject: [PATCH 0184/1214] Solves issue #188 setting the wrong HTTP header. - also solves Maven relativePath problem using a clean build env --- archetypes/jersey/pom.xml | 1 + archetypes/spark/pom.xml | 1 + archetypes/spring/pom.xml | 1 + archetypes/springboot/pom.xml | 1 + aws-serverless-java-container-core/pom.xml | 1 + .../servlet/AwsHttpServletResponse.java | 16 ++++--- .../servlet/AwsHttpServletResponseTest.java | 43 +++++++++++++++++++ aws-serverless-java-container-jersey/pom.xml | 1 + aws-serverless-java-container-spark/pom.xml | 1 + aws-serverless-java-container-spring/pom.xml | 1 + 10 files changed, 62 insertions(+), 5 deletions(-) diff --git a/archetypes/jersey/pom.xml b/archetypes/jersey/pom.xml index 459bdfac..74dcea2c 100644 --- a/archetypes/jersey/pom.xml +++ b/archetypes/jersey/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/spark/pom.xml b/archetypes/spark/pom.xml index 196b1a42..5396c667 100644 --- a/archetypes/spark/pom.xml +++ b/archetypes/spark/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/spring/pom.xml b/archetypes/spring/pom.xml index b69b5728..ce0835f1 100644 --- a/archetypes/spring/pom.xml +++ b/archetypes/spring/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/archetypes/springboot/pom.xml b/archetypes/springboot/pom.xml index af4cb0f1..e697e26c 100644 --- a/archetypes/springboot/pom.xml +++ b/archetypes/springboot/pom.xml @@ -5,6 +5,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + ../.. com.amazonaws.serverless.archetypes diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..b5ad8d61 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index de0f58c2..32d5b814 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -265,14 +265,17 @@ public Collection getHeaderNames() { @Override public String getCharacterEncoding() { - return headers.getFirst(HttpHeaders.CONTENT_ENCODING); + final String contentType = Optional.ofNullable(getContentType()).orElse(""); + if (contentType.contains(";")) { + return contentType.split(";")[1].split("=")[1].trim().toLowerCase(Locale.getDefault()); + } else { + return ""; + } } @Override - public String getContentType() { - return headers.getFirst(HttpHeaders.CONTENT_TYPE); - } + public String getContentType() { return getHeader(HttpHeaders.CONTENT_TYPE); } @Override @@ -334,7 +337,10 @@ public PrintWriter getWriter() throws IOException { @Override public void setCharacterEncoding(String s) { - setHeader(HttpHeaders.CONTENT_ENCODING, s, true); + final String characterEncoding = Optional.ofNullable(s).orElse("").toLowerCase(Locale.getDefault()); + final String oldValue = Optional.ofNullable(getHeader(HttpHeaders.CONTENT_TYPE)).orElse(""); + String contentType = oldValue.contains(";") ? oldValue.split(";")[0].trim(): oldValue; + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", contentType, characterEncoding), true); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 553b7c61..ff889325 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -140,6 +140,49 @@ public void cookie_addCookieWithoutMaxAge_expectNoExpires() { assertFalse(cookieHeader.contains("Expires")); } + @Test + public void characterEncoding_setCharacterEncoding() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json"); + resp.setCharacterEncoding("UTF-8"); + assertNotEquals("UTF-8", resp.getHeader("Content-Encoding")); + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + } + + @Test + public void characterEncoding_setContentType() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json; charset=utf-8"); + resp.setCharacterEncoding("UTF-8"); + + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + assertEquals("utf-8", resp.getCharacterEncoding()); + } + + @Test + public void characterEncoding_setContentTypeAndsetCharacterEncoding() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType("application/json"); + resp.setCharacterEncoding("UTF-8"); + + assertEquals("application/json; charset=utf-8", resp.getContentType()); + assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + assertEquals("utf-8", resp.getCharacterEncoding()); + } + + @Test + public void characterEncoding_setCharacterEncodingAndsetContentType() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("application/json"); + + assertEquals("application/json", resp.getContentType()); + assertEquals("application/json", resp.getHeader("Content-Type")); + assertEquals("", resp.getCharacterEncoding()); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9e7998ec..02573775 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5aac26d2..ff52be35 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c877425c..bac70d84 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -12,6 +12,7 @@ com.amazonaws.serverless aws-serverless-java-container 1.2-SNAPSHOT + .. From 85c9a4a18036ead8384877bbced67d33b47daecf Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sat, 8 Sep 2018 13:26:22 +0200 Subject: [PATCH 0185/1214] Provide a pet store example for lambdas based on apache struts2 framework https://github.com/awslabs/aws-serverless-java-container/issues/149 --- samples/struts/pet-store/README.md | 62 +++++++ samples/struts/pet-store/pom.xml | 167 ++++++++++++++++++ samples/struts/pet-store/sam.yaml | 32 ++++ .../pet-store/src/main/assembly/dist.xml | 31 ++++ .../sample/struts/actions/PetsController.java | 92 ++++++++++ .../serverless/sample/struts/model/Pet.java | 69 ++++++++ .../sample/struts/model/PetData.java | 111 ++++++++++++ .../pet-store/src/main/resources/log4j2.xml | 19 ++ .../pet-store/src/main/resources/struts.xml | 44 +++++ 9 files changed, 627 insertions(+) create mode 100644 samples/struts/pet-store/README.md create mode 100644 samples/struts/pet-store/pom.xml create mode 100644 samples/struts/pet-store/sam.yaml create mode 100644 samples/struts/pet-store/src/main/assembly/dist.xml create mode 100644 samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java create mode 100644 samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java create mode 100644 samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java create mode 100644 samples/struts/pet-store/src/main/resources/log4j2.xml create mode 100644 samples/struts/pet-store/src/main/resources/struts.xml diff --git a/samples/struts/pet-store/README.md b/samples/struts/pet-store/README.md new file mode 100644 index 00000000..9203dd89 --- /dev/null +++ b/samples/struts/pet-store/README.md @@ -0,0 +1,62 @@ +# Serverless Struts2 example +A basic pet store written with the [Apache Struts framework](https://struts.apache.org). The `Struts2LambdaHandler` object provided by the `aws-serverless-java-container-struts2` is the main entry point for Lambda. + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition + +## Installation +To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. + +In a shell, navigate to the sample's folder and use maven to build a deployable jar. +``` +$ mvn package +``` + +This command should generate a `serverless-struts-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the zip file, we can use the AWS CLI to package the template for deployment. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringSample --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SparkPetStoreApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringSample +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "Example Pet Store API written with Apache Struts with the aws-serverless-java-container library", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "OutputKey": "PetStoreApi", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "StrutsSample", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser to test a first request. diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml new file mode 100644 index 00000000..5500cbdf --- /dev/null +++ b/samples/struts/pet-store/pom.xml @@ -0,0 +1,167 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-struts-example + 1.0-SNAPSHOT + Struts2 example for the aws-serverless-java-container library + Simple pet store written with the Apache Struts framework + https://aws.amazon.com/lambda/ + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 1.8 + 1.8 + 2.5.17 + 2.9.5 + 4.12 + 2.8.2 + + + + + com.amazonaws.serverless + aws-serverless-java-container-struts2 + [0.1,) + + + + com.amazonaws + aws-lambda-java-core + 1.2.0 + + + + org.apache.struts + struts2-convention-plugin + ${struts2.version} + + + + org.apache.struts + struts2-rest-plugin + ${struts2.version} + + + + org.apache.struts + struts2-bean-validation-plugin + ${struts2.version} + + + + org.apache.struts + struts2-junit-plugin + ${struts2.version} + test + + + + + com.jgeppert.struts2 + struts2-aws-lambda-support-plugin + 1.0.0 + + + + + org.hibernate + hibernate-validator + 4.3.2.Final + + + + com.fasterxml.jackson.core + jackson-core + 2.9.4 + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.4 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.4 + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.amazonaws + aws-lambda-java-log4j2 + 1.1.0 + + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + src/main/assembly/dist.xml + + + + + lambda + package + + single + + + + + + + + diff --git a/samples/struts/pet-store/sam.yaml b/samples/struts/pet-store/sam.yaml new file mode 100644 index 00000000..e91f9d59 --- /dev/null +++ b/samples/struts/pet-store/sam.yaml @@ -0,0 +1,32 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with Apache Struts based on the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + Runtime: java8 + CodeUri: serverless-struts-example-1.0-SNAPSHOT-lambda.zip + MemorySize: 256 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + SpringPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Export: + Name: Struts2PetStoreApi diff --git a/samples/struts/pet-store/src/main/assembly/dist.xml b/samples/struts/pet-store/src/main/assembly/dist.xml new file mode 100644 index 00000000..029ec01c --- /dev/null +++ b/samples/struts/pet-store/src/main/assembly/dist.xml @@ -0,0 +1,31 @@ + + lambda + + zip + + false + + + lib + false + + + + + ${basedir}/src/main/resources + / + + * + + + + ${project.build.directory}/classes + / + + **/*.class + + + + \ No newline at end of file diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java new file mode 100644 index 00000000..bc2ad8bb --- /dev/null +++ b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java @@ -0,0 +1,92 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.struts.actions; + +import com.amazonaws.serverless.sample.struts.model.Pet; +import com.amazonaws.serverless.sample.struts.model.PetData; +import com.opensymphony.xwork2.ModelDriven; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; +import org.apache.struts2.rest.RestActionSupport; + +import java.util.Collection; +import java.util.UUID; +import java.util.stream.Collectors; + + +public class PetsController extends RestActionSupport implements ModelDriven { + + private Pet model = new Pet(); + private String id; + private Collection list = null; + + // GET /pets/1 + public HttpHeaders show() { + return new DefaultHttpHeaders("show"); + } + + // GET /pets + public HttpHeaders index() { + list = PetData.getNames() + .stream() + .map(petName -> new Pet( + UUID.randomUUID() + .toString(), PetData.getRandomBreed(), petName, PetData.getRandomDoB())) + .collect(Collectors.toList()); + return new DefaultHttpHeaders("index") + .disableCaching(); + } + + // POST /pets + public HttpHeaders create() { + if (model.getName() == null || model.getBreed() == null) { + return null; + } + + Pet dbPet = model; + dbPet.setId(UUID.randomUUID().toString()); + return new DefaultHttpHeaders("success") + .setLocationId(model.getId()); + + } + + // PUT /pets/1 + public String update() { + //TODO: UPDATE LOGIC + return SUCCESS; + } + + // DELETE /petsr/1 + public String destroy() { + //TODO: DELETE LOGIC + return SUCCESS; + } + + public void setId(String id) { + if (id != null) { + this.model = new Pet(id, PetData.getRandomBreed(), PetData.getRandomName(), PetData.getRandomDoB()); + } + this.id = id; + } + + public Object getModel() { + if (list != null) { + return list; + } else { + if (model == null) { + model = new Pet(); + } + return model; + } + } +} diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java new file mode 100644 index 00000000..c9d420ca --- /dev/null +++ b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java @@ -0,0 +1,69 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.struts.model; + +import org.hibernate.validator.constraints.NotBlank; + +import java.util.Date; + +public class Pet { + + private String id; + private String breed; + + @NotBlank + private String name; + private Date dateOfBirth; + + public Pet() { + } + + public Pet(String id, String breed, String name, Date dateOfBirth) { + this.id = id; + this.breed = breed; + this.name = name; + this.dateOfBirth = dateOfBirth; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java new file mode 100644 index 00000000..84be64ea --- /dev/null +++ b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java @@ -0,0 +1,111 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.struts.model; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/struts/pet-store/src/main/resources/log4j2.xml b/samples/struts/pet-store/src/main/resources/log4j2.xml new file mode 100644 index 00000000..6afd44ed --- /dev/null +++ b/samples/struts/pet-store/src/main/resources/log4j2.xml @@ -0,0 +1,19 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/struts/pet-store/src/main/resources/struts.xml b/samples/struts/pet-store/src/main/resources/struts.xml new file mode 100644 index 00000000..038370d3 --- /dev/null +++ b/samples/struts/pet-store/src/main/resources/struts.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bc41b939319393d16d37551b35162724982dbbfb Mon Sep 17 00:00:00 2001 From: Bill Robertson Date: Sun, 9 Sep 2018 18:18:12 -0400 Subject: [PATCH 0186/1214] Allow registration of binary content types --- .../proxy/model/ContainerConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 37cfd2a2..35d90f4f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -4,6 +4,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; @@ -38,6 +39,7 @@ public static ContainerConfig defaultConfig() { private List validFilePaths; private List customDomainNames; private boolean queryStringCaseSensitive; + private final HashSet binaryContentTypes = new HashSet<>(); public ContainerConfig() { validFilePaths = new ArrayList<>(); @@ -219,4 +221,22 @@ public boolean isQueryStringCaseSensitive() { public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) { this.queryStringCaseSensitive = queryStringCaseSensitive; } + + /** + * Configure specified content type as binary + */ + public void addBinaryContentType(String type) { + if(type != null) { + binaryContentTypes.add(type); + } + } + + /** + * Determine if specified content type has been configured as binary + * @param type + * @return + */ + public boolean isBinaryContentType(String type) { + return binaryContentTypes.contains(type); + } } From 58c2c3c58cfb09b52a9462e2733eea7010990c8f Mon Sep 17 00:00:00 2001 From: Bill Robertson Date: Sun, 9 Sep 2018 18:19:37 -0400 Subject: [PATCH 0187/1214] For registered binary content types, skip the utf-8 scan --- .../servlet/AwsProxyHttpServletResponseWriter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 54b36a27..1520a8b3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -15,6 +15,7 @@ import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; @@ -39,7 +40,7 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, if (containerResponse.getAwsResponseBodyString() != null) { String responseString; - if (isValidUtf8(containerResponse.getAwsResponseBodyBytes())) { + if (!isBinary(containerResponse.getContentType()) && isValidUtf8(containerResponse.getAwsResponseBodyBytes())) { responseString = containerResponse.getAwsResponseBodyString(); } else { responseString = Base64.getMimeEncoder().encodeToString(containerResponse.getAwsResponseBodyBytes()); @@ -55,4 +56,8 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, Timer.stop("SERVLET_RESPONSE_WRITE"); return awsProxyResponse; } + + private boolean isBinary(String contentType) { + return contentType == null ? false : LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType); + } } From c3de905581c7af7e6fc86cc5ecf554410b9a9f49 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Mon, 10 Sep 2018 08:17:30 +0200 Subject: [PATCH 0188/1214] Correct some typos https://github.com/awslabs/aws-serverless-java-container/issues/149 --- samples/struts/pet-store/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 5500cbdf..9aab925d 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -25,7 +25,7 @@ 1.8 - 1.8 + 1.8 2.5.17 2.9.5 4.12 @@ -70,7 +70,7 @@ test - + com.jgeppert.struts2 struts2-aws-lambda-support-plugin From d48ca490dafb78b88c910bca54dcc9714df7ccb7 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Mon, 10 Sep 2018 08:20:52 +0200 Subject: [PATCH 0189/1214] Adjust struts2 pet store log4j config https://github.com/awslabs/aws-serverless-java-container/issues/149 --- samples/struts/pet-store/src/main/resources/log4j2.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/samples/struts/pet-store/src/main/resources/log4j2.xml b/samples/struts/pet-store/src/main/resources/log4j2.xml index 6afd44ed..55ed0d21 100644 --- a/samples/struts/pet-store/src/main/resources/log4j2.xml +++ b/samples/struts/pet-store/src/main/resources/log4j2.xml @@ -10,8 +10,6 @@ - - From 1d89996b389e6840040c33b65e8fcf510e99741c Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Mon, 10 Sep 2018 09:05:40 +0200 Subject: [PATCH 0190/1214] Provide archetype for struts2 based lambdas https://github.com/awslabs/aws-serverless-java-container/issues/149 --- archetypes/struts/pom.xml | 47 ++++++ .../META-INF/maven/archetype-metadata.xml | 33 ++++ .../resources/archetype-resources/README.md | 129 +++++++++++++++ .../resources/archetype-resources/pom.xml | 153 ++++++++++++++++++ .../resources/archetype-resources/sam.yaml | 48 ++++++ .../src/main/assembly/dist.xml | 31 ++++ .../src/main/java/actions/PingController.java | 74 +++++++++ .../src/main/resources/application.properties | 3 + .../src/main/resources/log4j2.xml | 17 ++ .../src/main/resources/struts.xml | 45 ++++++ pom.xml | 1 + 11 files changed, 581 insertions(+) create mode 100644 archetypes/struts/pom.xml create mode 100644 archetypes/struts/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 archetypes/struts/src/main/resources/archetype-resources/README.md create mode 100644 archetypes/struts/src/main/resources/archetype-resources/pom.xml create mode 100644 archetypes/struts/src/main/resources/archetype-resources/sam.yaml create mode 100644 archetypes/struts/src/main/resources/archetype-resources/src/main/assembly/dist.xml create mode 100644 archetypes/struts/src/main/resources/archetype-resources/src/main/java/actions/PingController.java create mode 100644 archetypes/struts/src/main/resources/archetype-resources/src/main/resources/application.properties create mode 100644 archetypes/struts/src/main/resources/archetype-resources/src/main/resources/log4j2.xml create mode 100644 archetypes/struts/src/main/resources/archetype-resources/src/main/resources/struts.xml diff --git a/archetypes/struts/pom.xml b/archetypes/struts/pom.xml new file mode 100644 index 00000000..9175a40d --- /dev/null +++ b/archetypes/struts/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.2-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-struts-archetype + 1.2-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + + \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/META-INF/maven/archetype-metadata.xml b/archetypes/struts/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..7aa1c89b --- /dev/null +++ b/archetypes/struts/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,33 @@ + + + + src/main/java + + **/*.java + + + + src/main/resources + + **/*.properties + **/*.xml + + + + src/main/assembly + + **/*.xml + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/archetype-resources/README.md b/archetypes/struts/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..4b646a46 --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false +$ cd my-spring-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessSpringApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/archetype-resources/pom.xml b/archetypes/struts/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..bb05d5ed --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,153 @@ + + + 4.0.0 + + ${groupId} + ${artifactId} + ${version} + jar + + Serverless Spring Boot API + https://github.com/awslabs/aws-serverless-java-container + + + org.springframework.boot + spring-boot-starter-parent + 1.5.10.RELEASE + + + + 1.8 + 1.8 + 2.5.17 + 2.9.5 + 4.12 + 2.8.2 + + + + + com.amazonaws.serverless + aws-serverless-java-container-struts2 + 1.2.0 + + + + com.amazonaws + aws-lambda-java-core + 1.2.0 + + + + org.apache.struts + struts2-convention-plugin + ${struts2.version} + + + + org.apache.struts + struts2-rest-plugin + ${struts2.version} + + + + org.apache.struts + struts2-bean-validation-plugin + ${struts2.version} + + + + org.apache.struts + struts2-junit-plugin + ${struts2.version} + test + + + + + com.jgeppert.struts2 + struts2-aws-lambda-support-plugin + 1.0.0 + + + + + org.hibernate + hibernate-validator + 4.3.2.Final + + + + com.fasterxml.jackson.core + jackson-core + 2.9.4 + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.4 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.4 + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + + com.amazonaws + aws-lambda-java-log4j2 + 1.1.0 + + + + junit + junit + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + src/main/assembly/dist.xml + + + + + lambda + package + + single + + + + + + + diff --git a/archetypes/struts/src/main/resources/archetype-resources/sam.yaml b/archetypes/struts/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..d17e69de --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,48 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Apache Struts2 API - ${groupId}::${artifactId} +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}-lambda.zip + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/archetypes/struts/src/main/resources/archetype-resources/src/main/assembly/dist.xml b/archetypes/struts/src/main/resources/archetype-resources/src/main/assembly/dist.xml new file mode 100644 index 00000000..029ec01c --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/src/main/assembly/dist.xml @@ -0,0 +1,31 @@ + + lambda + + zip + + false + + + lib + false + + + + + ${basedir}/src/main/resources + / + + * + + + + ${project.build.directory}/classes + / + + **/*.class + + + + \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/archetype-resources/src/main/java/actions/PingController.java b/archetypes/struts/src/main/resources/archetype-resources/src/main/java/actions/PingController.java new file mode 100644 index 00000000..b8a67e00 --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/src/main/java/actions/PingController.java @@ -0,0 +1,74 @@ +package ${groupId}.controller; + + +import com.opensymphony.xwork2.ModelDriven; +import org.apache.struts2.rest.DefaultHttpHeaders; +import org.apache.struts2.rest.HttpHeaders; +import org.apache.struts2.rest.RestActionSupport; + + +import java.util.Collection; +import java.util.UUID; + + +public class PingController extends RestActionSupport implements ModelDriven { + + private String model = new String(); + private String id; + private Collection list = null; + + + // GET /ping/1 + public HttpHeaders show() { + return new DefaultHttpHeaders("show"); + } + + // GET /ping + public HttpHeaders index() { + this.model = "Hello, World!"; + return new DefaultHttpHeaders("index") + .disableCaching(); + } + + // POST /ping + public HttpHeaders create() { + if (model.getName() == null || model.getBreed() == null) { + return null; + } + + this.model = UUID.randomUUID().toString(); + return new DefaultHttpHeaders("success") + .setLocationId(model.getId()); + + } + + // PUT /ping/1 + public String update() { + //TODO: UPDATE LOGIC + return SUCCESS; + } + + // DELETE /ping/1 + public String destroy() { + //TODO: DELETE LOGIC + return SUCCESS; + } + + public void setId(String id) { + if (id != null) { + this.model = "New model instance"; + } + this.id = id; + } + + public Object getModel() { + if (list != null) { + return list; + } else { + if (model == null) { + model = "Pong"; + } + return model; + } + } +} diff --git a/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/application.properties b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/application.properties new file mode 100644 index 00000000..ec1cb979 --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# Reduce logging level to make sure the application works with SAM local +# https://github.com/awslabs/aws-serverless-java-container/issues/134 +logging.level.root=WARN \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/log4j2.xml b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/log4j2.xml new file mode 100644 index 00000000..55ed0d21 --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/log4j2.xml @@ -0,0 +1,17 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n + + + + + + + + + + + \ No newline at end of file diff --git a/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/struts.xml b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/struts.xml new file mode 100644 index 00000000..d0a1c31d --- /dev/null +++ b/archetypes/struts/src/main/resources/archetype-resources/src/main/resources/struts.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index b5829f99..ec032e28 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ archetypes/spark archetypes/spring archetypes/springboot + archetypes/struts From afd69161d390dd06509d7702cd3e9d63b23eff98 Mon Sep 17 00:00:00 2001 From: Bill Robertson Date: Sun, 16 Sep 2018 13:22:40 -0400 Subject: [PATCH 0191/1214] Add some default binary types and minor tweaks --- .../AwsProxyHttpServletResponseWriter.java | 11 ++++++++++- .../proxy/model/ContainerConfig.java | 18 +++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 1520a8b3..1a524761 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -58,6 +58,15 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, } private boolean isBinary(String contentType) { - return contentType == null ? false : LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType); + if(contentType != null) { + int semidx = contentType.indexOf(';'); + if(semidx >= 0) { + return LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType.substring(0, semidx)); + } + else { + LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType); + } + } + return false; } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 35d90f4f..3dce0e17 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -23,6 +23,7 @@ public static ContainerConfig defaultConfig() { configuration.setUseStageAsServletContext(false); configuration.setValidFilePaths(DEFAULT_FILE_PATHS); configuration.setQueryStringCaseSensitive(false); + configuration.addBinaryContentTypes("application/octet-stream", "image/jpeg", "image/png", "image/gif"); return configuration; } @@ -223,20 +224,23 @@ public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) { } /** - * Configure specified content type as binary + * Configure specified content type(s) as binary + * @param contentTypes list of exact content types that will be considered as binary */ - public void addBinaryContentType(String type) { - if(type != null) { - binaryContentTypes.add(type); + public void addBinaryContentTypes(String... contentTypes) { + if(contentTypes != null) { + for(String type: contentTypes) { + binaryContentTypes.add(type); + } } } /** * Determine if specified content type has been configured as binary - * @param type + * @param contentType content type to query * @return */ - public boolean isBinaryContentType(String type) { - return binaryContentTypes.contains(type); + public boolean isBinaryContentType(String contentType) { + return contentType != null && binaryContentTypes.contains(contentType.trim()); } } From 2c62ca74897f500feb195b407736feca1be216ae Mon Sep 17 00:00:00 2001 From: Bill Robertson Date: Mon, 17 Sep 2018 00:52:12 -0400 Subject: [PATCH 0192/1214] Fix missing return value --- .../internal/servlet/AwsProxyHttpServletResponseWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 1a524761..7f98bd1f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -64,7 +64,7 @@ private boolean isBinary(String contentType) { return LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType.substring(0, semidx)); } else { - LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType); + return LambdaContainerHandler.getContainerConfig().isBinaryContentType(contentType); } } return false; From 903c118c3e6f51be14cd7e883ef4be8c5c03098a Mon Sep 17 00:00:00 2001 From: Jeff Schwartz Date: Tue, 2 Oct 2018 23:09:52 -0400 Subject: [PATCH 0193/1214] Upgraded Spark to 2.8.0 --- aws-serverless-java-container-spark/pom.xml | 2 +- .../spark/embeddedserver/LambdaEmbeddedServer.java | 13 ++++++++----- .../embeddedserver/LambdaEmbeddedServerFactory.java | 5 +++-- .../embeddedserver/LambdaEmbeddedServerTest.java | 2 +- samples/spark/pet-store/pom.xml | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5aac26d2..e47a0692 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -15,7 +15,7 @@ - 2.7.2 + 2.8.0 diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index 1db167ae..f4f227c4 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import spark.ExceptionMapper; import spark.embeddedserver.EmbeddedServer; import spark.embeddedserver.jetty.websocket.WebSocketHandlerWrapper; import spark.http.matching.MatcherFilter; @@ -24,6 +25,7 @@ public class LambdaEmbeddedServer //------------------------------------------------------------- private Routes applicationRoutes; + private ExceptionMapper exceptionMapper; private MatcherFilter sparkFilter; private StaticFilesConfiguration staticFilesConfiguration; private boolean hasMultipleHandler; @@ -34,14 +36,15 @@ public class LambdaEmbeddedServer // Constructors //------------------------------------------------------------- - LambdaEmbeddedServer(Routes routes, StaticFilesConfiguration filesConfig, boolean multipleHandlers) { + LambdaEmbeddedServer(Routes routes, StaticFilesConfiguration filesConfig, ExceptionMapper exceptionMapper, boolean multipleHandlers) { Timer.start("SPARK_EMBEDDED_SERVER_CONSTRUCTOR"); applicationRoutes = routes; staticFilesConfiguration = filesConfig; hasMultipleHandler = multipleHandlers; + this.exceptionMapper = exceptionMapper; // try to initialize the filter here. - sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, true, hasMultipleHandler); + sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, exceptionMapper, true, hasMultipleHandler); Timer.stop("SPARK_EMBEDDED_SERVER_CONSTRUCTOR"); } @@ -50,17 +53,17 @@ public class LambdaEmbeddedServer // Implementation - EmbeddedServer //------------------------------------------------------------- @Override - public int ignite(String s, int i, SslStores sslStores, int i1, int i2, int i3) + public int ignite(String host, int port, SslStores sslStores, int maxThreads, int minThreads, int threadIdleTimeoutMillis) throws ContainerInitializationException { Timer.start("SPARK_EMBEDDED_IGNITE"); log.info("Starting Spark server, ignoring port and host"); // if not initialized yet if (sparkFilter == null) { - sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, true, hasMultipleHandler); + sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, exceptionMapper, true, hasMultipleHandler); } sparkFilter.init(null); Timer.stop("SPARK_EMBEDDED_IGNITE"); - return i; + return port; } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index 255e442a..a73b0005 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.Timer; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import spark.ExceptionMapper; import spark.embeddedserver.EmbeddedServer; import spark.embeddedserver.EmbeddedServerFactory; import spark.route.Routes; @@ -39,10 +40,10 @@ public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { @Override - public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFilesConfiguration, boolean multipleHandlers) { + public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFilesConfiguration, ExceptionMapper exceptionMapper, boolean multipleHandlers) { Timer.start("SPARK_SERVER_FACTORY_CREATE"); if (embeddedServer == null) { - LambdaEmbeddedServerFactory.embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, multipleHandlers); + LambdaEmbeddedServerFactory.embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, exceptionMapper, multipleHandlers); } Timer.stop("SPARK_SERVER_FACTORY_CREATE"); return embeddedServer; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java index af4dc275..8a0e1f4e 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java @@ -9,7 +9,7 @@ public class LambdaEmbeddedServerTest { - private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, false); + private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, null, false); @Test public void webSocket_configureWebSocket_noException() { diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 6cd8af47..32068617 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -27,14 +27,14 @@ 1.8 1.8 2.9.4 - 2.7.2 + 2.8.0 com.amazonaws.serverless aws-serverless-java-container-spark - [0.1,) + [0.2,) From 5cab2a96ec3b02617f97a6a99f57bcb2c3f6def2 Mon Sep 17 00:00:00 2001 From: Jeff Schwartz Date: Wed, 3 Oct 2018 20:52:57 -0400 Subject: [PATCH 0194/1214] Updated the spark archetype for spark 2.8.0 --- archetypes/spark/src/main/resources/archetype-resources/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archetypes/spark/src/main/resources/archetype-resources/pom.xml b/archetypes/spark/src/main/resources/archetype-resources/pom.xml index c78e6d12..a725d767 100644 --- a/archetypes/spark/src/main/resources/archetype-resources/pom.xml +++ b/archetypes/spark/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.9.5 - 2.7.2 + 2.8.0 From 7e0a5ab1d87208b5cc896d6eb16fff8d2de737c7 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 17 Oct 2018 11:38:46 +0200 Subject: [PATCH 0195/1214] Switch to latest Struts2 version 2.5.18 https://github.com/awslabs/aws-serverless-java-container/issues/149 --- aws-serverless-java-container-struts2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index f72d6cf6..13401b81 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ - 2.5.17 + 2.5.18 2.9.5 From 8ba04bac6f02e55af31952d5784e9dc924f58513 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 19 Oct 2018 13:53:57 -0700 Subject: [PATCH 0196/1214] Added jacoco coverage test to core package and variable for min coverage --- aws-serverless-java-container-core/pom.xml | 44 ++++++++++++++++++++++ pom.xml | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 278a5a98..c2da176d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -67,6 +67,50 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + com.github.spotbugs spotbugs-maven-plugin diff --git a/pom.xml b/pom.xml index 9e57634d..a269aaaa 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ - 0.7 + 0.1 From 7336e3095bb4c830bcea4b5891e35d389fe9e2c4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 19 Oct 2018 15:52:56 -0700 Subject: [PATCH 0197/1214] Added support for the new multiValue headers and query string parameters in both request and response. Issue #198 --- .../proxy/AwsProxyExceptionHandler.java | 5 +- .../servlet/AwsHttpServletRequest.java | 37 ++-- .../servlet/AwsHttpServletResponse.java | 38 ++-- .../servlet/AwsProxyHttpServletRequest.java | 169 ++++++++++-------- .../AwsProxyHttpServletResponseWriter.java | 2 +- .../testutils/AwsProxyRequestBuilder.java | 45 ++--- .../proxy/model/AwsProxyRequest.java | 41 +++-- .../proxy/model/AwsProxyResponse.java | 25 ++- .../proxy/AwsProxyExceptionHandlerTest.java | 20 +-- .../servlet/AwsHttpServletRequestTest.java | 23 ++- .../servlet/AwsHttpServletResponseTest.java | 12 +- .../AwsProxyHttpServletRequestTest.java | 37 +--- .../jersey/JerseyServletResponseWriter.java | 1 - .../proxy/jersey/JerseyAwsProxyTest.java | 18 +- .../proxy/jersey/JerseyParamEncodingTest.java | 6 +- .../spark/HelloWorldSparkStreamTest.java | 4 +- .../proxy/spark/HelloWorldSparkTest.java | 32 ++-- .../SparkLambdaContainerHandlerTest.java | 4 +- .../proxy/spring/SpringAwsProxyTest.java | 8 +- .../proxy/spring/SpringBootAppTest.java | 6 +- .../spring/SpringServletContextTest.java | 18 +- .../proxy/spring/StaticAppProxyTest.java | 4 +- .../proxy/struts2/Struts2AwsProxyTest.java | 16 +- 23 files changed, 282 insertions(+), 289 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index 29a96410..75bf3c6e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -16,6 +16,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -57,14 +58,14 @@ public class AwsProxyExceptionHandler // Variables - Private - Static //------------------------------------------------------------- - private static Map headers = new HashMap<>(); + private static MultiValuedTreeMap headers = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); //------------------------------------------------------------- // Constructors //------------------------------------------------------------- static { - headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index b3a3e64c..5a7174f3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -16,6 +16,7 @@ import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -60,7 +61,6 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final String HEADER_VALUE_SEPARATOR = ";"; static final String HEADER_QUALIFIER_SEPARATOR = ","; static final String FORM_DATA_SEPARATOR = "&"; - static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; static final String ENCODING_VALUE_KEY = "charset"; @@ -295,7 +295,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { * @param encodeCharset Charset to use for encoding the query string * @return The generated query string for the URI */ - protected String generateQueryString(Map parameters, boolean encode, String encodeCharset) + protected String generateQueryString(MultiValuedTreeMap parameters, boolean encode, String encodeCharset) throws ServletException { if (parameters == null || parameters.size() == 0) { return null; @@ -306,27 +306,22 @@ protected String generateQueryString(Map parameters, boolean enc StringBuilder queryStringBuilder = new StringBuilder(); - /*parameters.keySet().stream().forEach(k -> parameters.stream().forEach(v -> { - queryStringBuilder.append("&"); - queryStringBuilder.append(k); - queryStringBuilder.append("="); - queryStringBuilder.append(v); - }));*/ try { - for (Map.Entry e : parameters.entrySet()) { - queryStringBuilder.append("&"); - if (encode) { - queryStringBuilder.append(URLEncoder.encode(e.getKey(), encodeCharset)); - } else { - queryStringBuilder.append(e.getKey()); - } - queryStringBuilder.append("="); - if (encode) { - queryStringBuilder.append(URLEncoder.encode(e.getValue(), encodeCharset)); - } else { - queryStringBuilder.append(e.getValue()); + for (String key : parameters.keySet()) { + for (String val : parameters.get(key)) { + queryStringBuilder.append("&"); + if (encode) { + queryStringBuilder.append(URLEncoder.encode(key, encodeCharset)); + } else { + queryStringBuilder.append(key); + } + queryStringBuilder.append("="); + if (encode) { + queryStringBuilder.append(URLEncoder.encode(val, encodeCharset)); + } else { + queryStringBuilder.append(val); + } } - } } catch (UnsupportedEncodingException e) { throw new ServletException("Invalid charset passed for query string encoding", e); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index d82b3485..9ae65c28 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -12,8 +12,8 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; @@ -24,7 +24,6 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MultivaluedHashMap; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; @@ -53,7 +52,7 @@ public class AwsHttpServletResponse // Variables - Private //------------------------------------------------------------- - private MultivaluedHashMap headers = new MultivaluedHashMap<>(); + private MultiValuedTreeMap headers = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); private int statusCode; private String statusMessage; private String responseBody; @@ -202,7 +201,12 @@ public void setHeader(String s, String s1) { @Override public void addHeader(String s, String s1) { - setHeader(s, s1, false); + // TODO: We should probably have a list of headers that we are not allowed to have multiple values for + if (s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))) { + setHeader(s, s1, true); + } else { + setHeader(s, s1, false); + } } @@ -400,7 +404,7 @@ public boolean isCommitted() { @Override public void reset() { - headers = new MultivaluedHashMap<>(); + headers = new MultiValuedTreeMap<>(); responseBody = null; writer = null; bodyOutputStream = new ByteArrayOutputStream(); @@ -435,28 +439,8 @@ byte[] getAwsResponseBodyBytes() { } - Map getAwsResponseHeaders() { - Map responseHeaders = new TreeMap<>(String::compareToIgnoreCase); - for (String header : getHeaderNames()) { - // special behavior for set cookie - // RFC 2109 allows for a comma separated list of cookies in one Set-Cookie header: https://tools.ietf.org/html/rfc2109 - if (header.equals(HttpHeaders.SET_COOKIE) && LambdaContainerHandler.getContainerConfig().isConsolidateSetCookieHeaders()) { - StringBuilder cookieHeader = new StringBuilder(); - for (String cookieValue : headers.get(header)) { - if (cookieHeader.length() > 0) { - cookieHeader.append(","); - } - - cookieHeader.append(" ").append(cookieValue); - } - - responseHeaders.put(header, cookieHeader.toString()); - } else { - responseHeaders.put(header, headers.get(header).get(headers.get(header).size() - 1)); - } - } - - return responseHeaders; + MultiValuedTreeMap getAwsResponseHeaders() { + return headers; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index cd049980..1d4f3a3d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -86,7 +86,6 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private SecurityContext securityContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; - private Map caseInsensitiveHeaders; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; @@ -105,9 +104,6 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.request = awsProxyRequest; this.securityContext = awsSecurityContext; this.config = config; - - this.caseInsensitiveHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - this.caseInsensitiveHeaders.putAll(awsProxyRequest.getHeaders()); } @@ -128,7 +124,10 @@ public String getAuthType() { @Override public Cookie[] getCookies() { - String cookieHeader = getHeaderCaseInsensitive(HttpHeaders.COOKIE); + if (request.getMultiValueHeaders() == null) { + return new Cookie[0]; + } + String cookieHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.COOKIE); if (cookieHeader == null) { return new Cookie[0]; } @@ -138,7 +137,10 @@ public Cookie[] getCookies() { @Override public long getDateHeader(String s) { - String dateString = getHeaderCaseInsensitive(s); + if (request.getMultiValueHeaders() == null) { + return -1L; + } + String dateString = request.getMultiValueHeaders().getFirst(s); if (dateString == null) { return -1L; } @@ -153,34 +155,38 @@ public long getDateHeader(String s) { @Override public String getHeader(String s) { - return getHeaderCaseInsensitive(s); + List values = getHeaderValues(s); + if (values == null || values.size() == 0) { + return null; + } + return values.get(0); } @Override public Enumeration getHeaders(String s) { - String headerValue = getHeaderCaseInsensitive(s); - if (headerValue == null) { - return Collections.enumeration(new ArrayList()); + if (request.getMultiValueHeaders() == null || request.getMultiValueHeaders().get(s) == null) { + return Collections.emptyEnumeration(); } - List valueCollection = new ArrayList<>(); - valueCollection.add(headerValue); - return Collections.enumeration(valueCollection); + return Collections.enumeration(request.getMultiValueHeaders().get(s)); } @Override public Enumeration getHeaderNames() { - if (caseInsensitiveHeaders == null) { + if (request.getMultiValueHeaders() == null) { return Collections.emptyEnumeration(); } - return Collections.enumeration(caseInsensitiveHeaders.keySet()); + return Collections.enumeration(request.getMultiValueHeaders().keySet()); } @Override public int getIntHeader(String s) { - String headerValue = getHeaderCaseInsensitive(s); + if (request.getMultiValueHeaders() == null) { + return -1; + } + String headerValue = request.getMultiValueHeaders().getFirst(s); if (headerValue == null) { return -1; } @@ -227,7 +233,7 @@ public String getContextPath() { @Override public String getQueryString() { try { - return this.generateQueryString(request.getQueryStringParameters(), true, config.getUriEncoding()); + return this.generateQueryString(request.getMultiValueQueryStringParameters(), true, config.getUriEncoding()); } catch (ServletException e) { log.error("Could not generate query string", e); return null; @@ -328,7 +334,7 @@ public T upgrade(Class aClass) public String getCharacterEncoding() { // we only look at content-type because content-encoding should only be used for // "binary" requests such as gzip/deflate. - String contentTypeHeader = getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + String contentTypeHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader == null) { return null; } @@ -354,7 +360,7 @@ public String getCharacterEncoding() { @Override public void setCharacterEncoding(String s) throws UnsupportedEncodingException { - String currentContentType = getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + String currentContentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (currentContentType == null || "".equals(currentContentType)) { log.error("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); return; @@ -373,10 +379,10 @@ public void setCharacterEncoding(String s) contentType.append(contentTypeString); } - setHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), contentType.toString()); + request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, contentType.toString()); } else { - setHeaderCaseInsensitive( - HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), + request.getMultiValueHeaders().putSingle( + HttpHeaders.CONTENT_TYPE, currentContentType + HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s); } } @@ -384,7 +390,7 @@ public void setCharacterEncoding(String s) @Override public int getContentLength() { - String headerValue = getHeaderCaseInsensitive(HttpHeaders.CONTENT_LENGTH); + String headerValue = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_LENGTH); if (headerValue == null) { return -1; } @@ -394,7 +400,7 @@ public int getContentLength() { @Override public long getContentLengthLong() { - String headerValue = getHeaderCaseInsensitive(HttpHeaders.CONTENT_LENGTH); + String headerValue = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_LENGTH); if (headerValue == null) { return -1; } @@ -404,7 +410,7 @@ public long getContentLengthLong() { @Override public String getContentType() { - String contentTypeHeader = getHeaderCaseInsensitive(HttpHeaders.CONTENT_TYPE); + String contentTypeHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader == null || "".equals(contentTypeHeader.trim())) { return null; } @@ -442,7 +448,7 @@ public ServletInputStream getInputStream() @Override public String getParameter(String s) { - String queryStringParameter = getQueryParamValue(s, config.isQueryStringCaseSensitive()); + String queryStringParameter = getFirstQueryParamValue(s, config.isQueryStringCaseSensitive()); if (queryStringParameter != null) { return queryStringParameter; } @@ -458,12 +464,11 @@ public String getParameter(String s) { @Override public Enumeration getParameterNames() { - List paramNames = new ArrayList<>(); - if (request.getQueryStringParameters() != null) { - paramNames.addAll(request.getQueryStringParameters().keySet()); + if (request.getMultiValueQueryStringParameters() == null) { + return Collections.emptyEnumeration(); } - paramNames.addAll(getFormUrlEncodedParametersMap().keySet()); - return Collections.enumeration(paramNames); + + return Collections.enumeration(request.getMultiValueQueryStringParameters().keySet()); } @@ -471,7 +476,7 @@ public Enumeration getParameterNames() { @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { List values = new ArrayList<>(); - String queryValue = getQueryParamValue(s, config.isQueryStringCaseSensitive()); + String queryValue = getFirstQueryParamValue(s, config.isQueryStringCaseSensitive()); if (queryValue != null) { values.add(queryValue); } @@ -498,14 +503,14 @@ public Map getParameterMap() { output.put(e.getKey(), e.getValue().toArray(new String[0])); }); - if (request.getQueryStringParameters() != null) { - request.getQueryStringParameters().keySet().stream().parallel().forEach(e -> { + if (request.getMultiValueQueryStringParameters() != null) { + request.getMultiValueQueryStringParameters().keySet().stream().parallel().forEach(e -> { List newValues = new ArrayList<>(); if (output.containsKey(e)) { String[] values = output.get(e); newValues.addAll(Arrays.asList(values)); } - newValues.add(getQueryParamValue(e, config.isQueryStringCaseSensitive())); + newValues.add(getFirstQueryParamValue(e, config.isQueryStringCaseSensitive())); output.put(e, newValues.toArray(new String[0])); }); } @@ -522,11 +527,15 @@ public String getProtocol() { @Override public String getScheme() { - String cfScheme = getHeaderCaseInsensitive(CF_PROTOCOL_HEADER_NAME); + // if we don't have any headers to deduce the value we assume HTTPS - API Gateway's default + if (request.getMultiValueHeaders() == null) { + return "https"; + } + String cfScheme = request.getMultiValueHeaders().getFirst(CF_PROTOCOL_HEADER_NAME); if (cfScheme != null && SecurityUtils.isValidScheme(cfScheme)) { return cfScheme; } - String gwScheme = getHeaderCaseInsensitive(PROTOCOL_HEADER_NAME); + String gwScheme = request.getMultiValueHeaders().getFirst(PROTOCOL_HEADER_NAME); if (gwScheme != null && SecurityUtils.isValidScheme(gwScheme)) { return gwScheme; } @@ -542,7 +551,7 @@ public String getServerName() { region = "us-east-1"; } - String hostHeader = getHeaderCaseInsensitive(HOST_HEADER_NAME); + String hostHeader = request.getMultiValueHeaders().getFirst(HOST_HEADER_NAME); if (hostHeader != null && SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { return hostHeader; } @@ -554,7 +563,10 @@ public String getServerName() { } public int getServerPort() { - String port = getHeaderCaseInsensitive(PORT_HEADER_NAME); + if (request.getMultiValueHeaders() == null) { + return 443; + } + String port = request.getMultiValueHeaders().getFirst(PORT_HEADER_NAME); if (SecurityUtils.isValidPort(port)) { return Integer.parseInt(port); } else { @@ -578,7 +590,7 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { - return getHeaderCaseInsensitive(HttpHeaders.HOST); + return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); } @@ -586,7 +598,7 @@ public String getRemoteHost() { public Locale getLocale() { // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 List values = this.parseHeaderValue( - getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" + request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" ); if (values.size() == 0) { return Locale.getDefault(); @@ -598,7 +610,7 @@ public Locale getLocale() { @Override public Enumeration getLocales() { List values = this.parseHeaderValue( - getHeaderCaseInsensitive(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" + request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" ); List locales = new ArrayList<>(); @@ -658,33 +670,6 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se // Methods - Private //------------------------------------------------------------- - - private String getHeaderCaseInsensitive(String key) { - // special cases for referer and user agent headers - if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { - return request.getRequestContext().getIdentity().getCaller(); - } - if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) { - return request.getRequestContext().getIdentity().getUserAgent(); - } - - if (caseInsensitiveHeaders == null) { - return null; - } - return caseInsensitiveHeaders.get(key); - } - - private void setHeaderCaseInsensitive(String key, String value) { - if (caseInsensitiveHeaders == null) { - caseInsensitiveHeaders = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - if (request.getHeaders() != null) { - caseInsensitiveHeaders.putAll(request.getHeaders()); - } - } - - caseInsensitiveHeaders.put(key, value); - } - private String[] getFormBodyParameterCaseInsensitive(String key) { List values = getFormUrlEncodedParametersMap().get(key); if (values != null) { @@ -812,16 +797,36 @@ public static String decodeValueIfEncoded(String value) { } } + private List getHeaderValues(String key) { + // special cases for referer and user agent headers + List values = new ArrayList<>(); + + if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { + values.add(request.getRequestContext().getIdentity().getCaller()); + return values; + } + if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) { + values.add(request.getRequestContext().getIdentity().getUserAgent()); + return values; + } + + if (request.getMultiValueHeaders() == null) { + return null; + } - private String getQueryParamValue(String key, boolean isCaseSensitive) { - if (request.getQueryStringParameters() != null) { + return request.getMultiValueHeaders().get(key); + } + + + private String getFirstQueryParamValue(String key, boolean isCaseSensitive) { + if (request.getMultiValueQueryStringParameters() != null) { if (isCaseSensitive) { - return request.getQueryStringParameters().get(key); + return request.getMultiValueQueryStringParameters().getFirst(key); } - for (String k : request.getQueryStringParameters().keySet()) { + for (String k : request.getMultiValueQueryStringParameters().keySet()) { if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { - return request.getQueryStringParameters().get(k); + return request.getMultiValueQueryStringParameters().getFirst(k); } } } @@ -829,6 +834,22 @@ private String getQueryParamValue(String key, boolean isCaseSensitive) { return null; } + public String[] getQueryParamValues(String key, boolean isCaseSensitive) { + if (request.getMultiValueQueryStringParameters() != null) { + if (isCaseSensitive) { + return request.getMultiValueQueryStringParameters().get(key).toArray(new String[0]); + } + + for (String k : request.getMultiValueQueryStringParameters().keySet()) { + if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { + return request.getMultiValueQueryStringParameters().get(k).toArray(new String[0]); + } + } + } + + return new String[0]; + } + public static class AwsServletInputStream extends ServletInputStream { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 7f98bd1f..7af49b76 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -49,7 +49,7 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, awsProxyResponse.setBody(responseString); } - awsProxyResponse.setHeaders(containerResponse.getAwsResponseHeaders()); + awsProxyResponse.setMultiValueHeaders(containerResponse.getAwsResponseHeaders()); awsProxyResponse.setStatusCode(containerResponse.getStatus()); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 62fdba4d..c0b53610 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -66,10 +67,10 @@ public AwsProxyRequestBuilder(String path) { public AwsProxyRequestBuilder(String path, String httpMethod) { this.request = new AwsProxyRequest(); - this.request.setHeaders(new HashMap<>()); // avoid NPE + this.request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); // avoid NPE this.request.setHttpMethod(httpMethod); this.request.setPath(path); - this.request.setQueryStringParameters(new HashMap<>()); + this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); this.request.setRequestContext(new ApiGatewayRequestContext()); this.request.getRequestContext().setRequestId(UUID.randomUUID().toString()); this.request.getRequestContext().setStage("test"); @@ -108,10 +109,10 @@ public AwsProxyRequestBuilder json() { public AwsProxyRequestBuilder form(String key, String value) { - if (request.getHeaders() == null) { - request.setHeaders(new HashMap<>()); + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); } - request.getHeaders().put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); + request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); String body = request.getBody(); if (body == null) { body = ""; @@ -123,21 +124,21 @@ public AwsProxyRequestBuilder form(String key, String value) { public AwsProxyRequestBuilder header(String key, String value) { - if (this.request.getHeaders() == null) { - this.request.setHeaders(new HashMap<>()); + if (this.request.getMultiValueHeaders() == null) { + this.request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); } - this.request.getHeaders().put(key, value); + this.request.getMultiValueHeaders().add(key, value); return this; } public AwsProxyRequestBuilder queryString(String key, String value) { - if (this.request.getQueryStringParameters() == null) { - this.request.setQueryStringParameters(new HashMap<>()); + if (this.request.getMultiValueQueryStringParameters() == null) { + this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); } - this.request.getQueryStringParameters().put(key, value); + this.request.getMultiValueQueryStringParameters().add(key, value); return this; } @@ -153,7 +154,7 @@ public AwsProxyRequestBuilder nullBody() { } public AwsProxyRequestBuilder body(Object body) { - if (request.getHeaders() != null && request.getHeaders().get(HttpHeaders.CONTENT_TYPE).equals(MediaType.APPLICATION_JSON)) { + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).equals(MediaType.APPLICATION_JSON)) { try { return body(LambdaContainerHandler.getObjectMapper().writeValueAsString(body)); } catch (JsonProcessingException e) { @@ -220,35 +221,35 @@ public AwsProxyRequestBuilder cognitoIdentity(String identityId, String identity public AwsProxyRequestBuilder cookie(String name, String value) { - if (request.getHeaders() == null) { - request.setHeaders(new HashMap<>()); + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); } - String cookies = request.getHeaders().get(HttpHeaders.COOKIE); + String cookies = request.getMultiValueHeaders().getFirst(HttpHeaders.COOKIE); if (cookies == null) { cookies = ""; } cookies += (cookies.equals("")?"":"; ") + name + "=" + value; - request.getHeaders().put(HttpHeaders.COOKIE, cookies); + request.getMultiValueHeaders().putSingle(HttpHeaders.COOKIE, cookies); return this; } public AwsProxyRequestBuilder scheme(String scheme) { - if (request.getHeaders() == null) { - request.setHeaders(new HashMap<>()); + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); } - request.getHeaders().put("CloudFront-Forwarded-Proto", scheme); + request.getMultiValueHeaders().putSingle("CloudFront-Forwarded-Proto", scheme); return this; } public AwsProxyRequestBuilder serverName(String serverName) { - if (request.getHeaders() == null) { - request.setHeaders(new HashMap<>()); + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); } - request.getHeaders().put("Host", serverName); + request.getMultiValueHeaders().putSingle("Host", serverName); return this; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index 00001662..61aa7876 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -31,8 +31,8 @@ public class AwsProxyRequest { private String body; private String resource; private ApiGatewayRequestContext requestContext; - private Map queryStringParameters; - private Map headers; + private MultiValuedTreeMap multiValueQueryStringParameters; + private MultiValuedTreeMap multiValueHeaders; private Map pathParameters; private String httpMethod; private Map stageVariables; @@ -40,8 +40,8 @@ public class AwsProxyRequest { private boolean isBase64Encoded; public AwsProxyRequest() { - queryStringParameters = new HashMap<>(); - headers = new HashMap<>(); + multiValueHeaders = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); + multiValueQueryStringParameters = new MultiValuedTreeMap<>(); pathParameters = new HashMap<>(); stageVariables = new HashMap<>(); } @@ -55,11 +55,15 @@ public AwsProxyRequest() { public String getQueryString() { StringBuilder params = new StringBuilder(""); - if (this.getQueryStringParameters() != null && this.getQueryStringParameters().size() > 0) { - for (String key : this.getQueryStringParameters().keySet()) { + if (this.getMultiValueQueryStringParameters() == null) { + return ""; + } + + for (String key : this.getMultiValueQueryStringParameters().keySet()) { + for (String val : this.getMultiValueQueryStringParameters().get(key)) { String separator = params.length() == 0 ? "?" : "&"; - params.append(separator + key + "=" + this.getQueryStringParameters().get(key)); + params.append(separator + key + "=" + val); } } @@ -96,28 +100,23 @@ public void setRequestContext(ApiGatewayRequestContext requestContext) { this.requestContext = requestContext; } - - public Map getQueryStringParameters() { - return queryStringParameters; + public MultiValuedTreeMap getMultiValueQueryStringParameters() { + return multiValueQueryStringParameters; } - public void setQueryStringParameters(Map queryStringParameters) { - this.queryStringParameters = queryStringParameters; + public void setMultiValueQueryStringParameters( + MultiValuedTreeMap multiValueQueryStringParameters) { + this.multiValueQueryStringParameters = multiValueQueryStringParameters; } - - public Map getHeaders() { - return headers; + public MultiValuedTreeMap getMultiValueHeaders() { + return multiValueHeaders; } - public void setHeaders(Map headers) { - if (null != headers) { - this.headers = headers; - } else { - this.headers.clear(); - } + public void setMultiValueHeaders(MultiValuedTreeMap multiValueHeaders) { + this.multiValueHeaders = multiValueHeaders; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java index 01c289f3..f2e3a63a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java @@ -12,9 +12,6 @@ */ package com.amazonaws.serverless.proxy.model; -import java.util.HashMap; -import java.util.Map; - /** * Response object for an API Gateway method using AWS_PROXY integrations */ @@ -25,7 +22,7 @@ public class AwsProxyResponse { //------------------------------------------------------------- private int statusCode; - private Map headers; + private MultiValuedTreeMap multiValueHeaders; private String body; private boolean isBase64Encoded; @@ -44,14 +41,14 @@ public AwsProxyResponse(int statusCode) { } - public AwsProxyResponse(int statusCode, Map headers) { + public AwsProxyResponse(int statusCode, MultiValuedTreeMap headers) { this(statusCode, headers, null); } - public AwsProxyResponse(int statusCode, Map headers, String body) { + public AwsProxyResponse(int statusCode, MultiValuedTreeMap headers, String body) { this.statusCode = statusCode; - this.headers = headers; + this.multiValueHeaders = headers; this.body = body; } @@ -61,11 +58,11 @@ public AwsProxyResponse(int statusCode, Map headers, String body //------------------------------------------------------------- public void addHeader(String key, String value) { - if (this.headers == null) { - this.headers = new HashMap(); + if (this.multiValueHeaders == null) { + this.multiValueHeaders = new MultiValuedTreeMap(); } - this.headers.put(key, value); + this.multiValueHeaders.add(key, value); } @@ -83,13 +80,13 @@ public void setStatusCode(int statusCode) { } - public Map getHeaders() { - return headers; + public MultiValuedTreeMap getMultiValueHeaders() { + return multiValueHeaders; } - public void setHeaders(Map headers) { - this.headers = headers; + public void setMultiValueHeaders(MultiValuedTreeMap multiValueHeaders) { + this.multiValueHeaders = multiValueHeaders; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index 11adf356..b5ed6f77 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -57,8 +57,8 @@ public void typedHandle_InvalidRequestEventException_jsonContentTypeHeader() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null)); assertNotNull(resp); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @Test @@ -84,8 +84,8 @@ public void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null)); assertNotNull(resp); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @Test @@ -95,8 +95,8 @@ public void typedHandle_NullPointerException_responseObject() assertNotNull(resp); assertEquals(502, resp.getStatusCode()); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); String body = objectMapper.writeValueAsString(new ErrorModel(AwsProxyExceptionHandler.GATEWAY_TIMEOUT_ERROR)); assertEquals(body, resp.getBody()); } @@ -138,8 +138,8 @@ public void streamHandle_InvalidRequestEventException_jsonContentTypeHeader() assertTrue(respStream.size() > 0); AwsProxyResponse resp = objectMapper.readValue(new ByteArrayInputStream(respStream.toByteArray()), AwsProxyResponse.class); assertNotNull(resp); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @Test @@ -179,8 +179,8 @@ public void streamHandle_InvalidResponseObjectException_jsonContentTypeHeader() assertTrue(respStream.size() > 0); AwsProxyResponse resp = objectMapper.readValue(new ByteArrayInputStream(respStream.toByteArray()), AwsProxyResponse.class); assertNotNull(resp); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.APPLICATION_JSON, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @Test diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 22b85149..eac04ef6 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -30,6 +30,8 @@ public class AwsHttpServletRequestTest { .queryString("one", "two").queryString("three", "four").build(); private static final AwsProxyRequest encodedQueryString = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").build(); + private static final AwsProxyRequest multipleParams = new AwsProxyRequestBuilder("/test", "GET") + .queryString("one", "two").queryString("one", "three").queryString("json", "{\"name\":\"faisal\"}").build(); private static final MockLambdaContext mockContext = new MockLambdaContext(); @@ -80,7 +82,7 @@ public void queryString_generateQueryString_validQuery() { String parsedString = null; try { - parsedString = request.generateQueryString(request.getAwsProxyRequest().getQueryStringParameters(), true, config.getUriEncoding()); + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); } catch (ServletException e) { e.printStackTrace(); fail("Could not generate query string"); @@ -97,7 +99,7 @@ public void queryStringWithEncodedParams_generateQueryString_validQuery() { String parsedString = null; try { - parsedString = request.generateQueryString(request.getAwsProxyRequest().getQueryStringParameters(), true, config.getUriEncoding()); + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); } catch (ServletException e) { e.printStackTrace(); fail("Could not generate query string"); @@ -106,4 +108,21 @@ public void queryStringWithEncodedParams_generateQueryString_validQuery() { assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } + + @Test + public void queryStringWithMultipleValues_generateQueryString_validQuery() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(multipleParams, mockContext, null, config); + + String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } + assertTrue(parsedString.contains("one=two")); + assertTrue(parsedString.contains("one=three")); + assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index a3585947..426e0f31 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -1,6 +1,8 @@ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; + import org.junit.Test; import javax.servlet.http.Cookie; @@ -152,20 +154,20 @@ public void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { resp.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); resp.addHeader("content-type", "application/xml"); - Map awsResp = resp.getAwsResponseHeaders(); + MultiValuedTreeMap awsResp = resp.getAwsResponseHeaders(); assertEquals(1, awsResp.size()); - assertEquals("application/json", awsResp.get(HttpHeaders.CONTENT_TYPE)); + assertEquals("application/xml", awsResp.getFirst(HttpHeaders.CONTENT_TYPE)); } @Test - public void responseHeaders_getAwsResponseHeaders_expectMergedCookies() { + public void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.addCookie(new Cookie(COOKIE_NAME, COOKIE_VALUE)); resp.addCookie(new Cookie("Second", "test")); - Map awsResp = resp.getAwsResponseHeaders(); + MultiValuedTreeMap awsResp = resp.getAwsResponseHeaders(); assertEquals(1, awsResp.size()); - assertEquals(2, awsResp.get(HttpHeaders.SET_COOKIE).split(",").length); + assertEquals(2, awsResp.get(HttpHeaders.SET_COOKIE).size()); } @Test diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index ed14ae17..eb40cd2d 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -70,7 +70,7 @@ public class AwsProxyHttpServletRequestTest { private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING; static { AwsProxyRequest awsProxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - awsProxyRequest.setQueryStringParameters(null); + awsProxyRequest.setMultiValueQueryStringParameters(null); REQUEST_NULL_QUERY_STRING = awsProxyRequest; } @@ -335,8 +335,6 @@ public void contentType_duplicateCase_expectSingleContentTypeHeader() { request.setCharacterEncoding(StandardCharsets.ISO_8859_1.name()); assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE)); assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))); - - assertFalse(proxyRequest.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE) && proxyRequest.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))); } catch (UnsupportedEncodingException e) { fail("Unsupported encoding"); e.printStackTrace(); @@ -355,7 +353,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { assertTrue(requestUrl.endsWith(".com/hello")); // set localhost - req.getHeaders().put("Host", "localhost"); + req.getMultiValueHeaders().putSingle("Host", "localhost"); servletRequest = new AwsProxyHttpServletRequest(req, null, null); requestUrl = servletRequest.getRequestURL().toString(); assertTrue(requestUrl.contains("http://localhost")); @@ -402,7 +400,7 @@ public void getLocales_emptyAcceptHeader_expectDefaultLocale() { @Test public void getLocales_validAcceptHeader_expectSingleLocale() { AwsProxyRequest req = getRequestWithHeaders(); - req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); + req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); int localesNo = 0; @@ -417,7 +415,7 @@ public void getLocales_validAcceptHeader_expectSingleLocale() { @Test public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { AwsProxyRequest req = getRequestWithHeaders(); - req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); + req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -438,7 +436,7 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { @Test public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered() { AwsProxyRequest req = getRequestWithHeaders(); - req.getHeaders().put(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); + req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -495,7 +493,7 @@ public void getServerPort_defaultPort_expect443() { @Test public void getServerPort_customPortFromHeader_expectCustomPort() { AwsProxyRequest proxyReq = getRequestWithHeaders(); - proxyReq.getHeaders().put(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); + proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); assertEquals(80, req.getServerPort()); } @@ -503,32 +501,11 @@ public void getServerPort_customPortFromHeader_expectCustomPort() { @Test public void getServerPort_invalidCustomPortFromHeader_expectDefaultPort() { AwsProxyRequest proxyReq = getRequestWithHeaders(); - proxyReq.getHeaders().put(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); + proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); assertEquals(443, req.getServerPort()); } - @Test - public void setHeaderCaseInsensitive_setHeader() { - HttpServletRequest req = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); - try { - Method setMethod = req.getClass().getDeclaredMethod("setHeaderCaseInsensitive", String.class, String.class); - setMethod.setAccessible(true); - setMethod.invoke(req,"Head", "head"); - assertNotNull(req.getHeader("Head")); - assertEquals("head", req.getHeader("Head")); - - assertNotNull(req.getHeader("head")); - assertEquals("head", req.getHeader("head")); - } catch (NoSuchMethodException e) { - fail("Cannot get set header method"); - e.printStackTrace(); - } catch (IllegalAccessException | InvocationTargetException e) { - fail("Cannot invoke method dynamically"); - e.printStackTrace(); - } - } - private AwsProxyRequest getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java index a7df1f18..c2cba731 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java @@ -13,7 +13,6 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 365fe0e5..656a6f52 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -65,7 +65,7 @@ public void headers_getHeaders_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output); } @@ -79,7 +79,7 @@ public void headers_servletRequest_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output); } @@ -92,18 +92,18 @@ public void context_servletResponse_setCustomHeader() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertTrue(output.getHeaders().containsKey(EchoJerseyResource.SERVLET_RESP_HEADER_KEY)); + assertTrue(output.getMultiValueHeaders().containsKey(EchoJerseyResource.SERVLET_RESP_HEADER_KEY)); } @Test public void context_serverInfo_correctContext() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-context", "GET").build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - for (String header : output.getHeaders().keySet()) { - System.out.println(header + ": " + output.getHeaders().get(header)); + for (String header : output.getMultiValueHeaders().keySet()) { + System.out.println(header + ": " + output.getMultiValueHeaders().getFirst(header)); } assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, AwsServletContext.SERVER_INFO); } @@ -116,7 +116,7 @@ public void requestScheme_valid_expectHttps() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, "https"); } @@ -130,7 +130,7 @@ public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } @@ -146,7 +146,7 @@ public void authorizer_securityContext_customAuthorizerContextSuccess() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index c93e903e..bab8a7fc 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -50,7 +50,7 @@ public void queryString_uriInfo_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } @@ -64,7 +64,7 @@ public void queryString_notEncoded_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } @@ -79,7 +79,7 @@ public void queryString_encoded_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type")); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index 7a8d13b6..ccf7eb28 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -69,8 +69,8 @@ public void helloRequest_basicStream_populatesOutputSuccessfully() { AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY)); + assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); + assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } catch (IOException e) { e.printStackTrace(); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index f4870a4a..6f1318b4 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -55,8 +55,8 @@ public void basicServer_handleRequest_emptyFilters() { AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY)); + assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); + assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } @@ -66,10 +66,10 @@ public void addCookie_setCookieOnResponse_validCustomCookie() { AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); } @Test @@ -77,16 +77,14 @@ public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/multi-cookie").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - System.out.println("Cookie: " + response.getHeaders().get(HttpHeaders.SET_COOKIE)); - assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); - // we compare against 4 because the expiration date of the cookies will also contain a string - assertEquals(2, response.getHeaders().get(HttpHeaders.SET_COOKIE).split(",").length); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "2=" + COOKIE_VALUE + "2")); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); - assertTrue(response.getHeaders().get(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); + + assertEquals(2, response.getMultiValueHeaders().get(HttpHeaders.SET_COOKIE).size()); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + assertTrue(response.getMultiValueHeaders().get(HttpHeaders.SET_COOKIE).get(1).contains(COOKIE_NAME + "2=" + COOKIE_VALUE + "2")); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); } @Test @@ -95,8 +93,8 @@ public void rootResource_basicRequest_expectSuccess() { AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getHeaders().get(CUSTOM_HEADER_KEY)); + assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); + assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 48fc881f..400373a4 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -56,8 +56,8 @@ public void filters_onStartupMethod_executeFilters() { assertNotNull(response); assertEquals(200, response.getStatusCode()); - assertTrue(response.getHeaders().containsKey(CustomHeaderFilter.HEADER_NAME)); - assertEquals(CustomHeaderFilter.HEADER_VALUE, response.getHeaders().get(CustomHeaderFilter.HEADER_NAME)); + assertTrue(response.getMultiValueHeaders().containsKey(CustomHeaderFilter.HEADER_NAME)); + assertEquals(CustomHeaderFilter.HEADER_VALUE, response.getMultiValueHeaders().getFirst(CustomHeaderFilter.HEADER_NAME)); assertEquals(RESPONSE_BODY_TEXT, response.getBody()); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 6e7280e9..379329d4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -83,7 +83,7 @@ public void headers_getHeaders_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -97,7 +97,7 @@ public void headers_servletRequest_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -111,7 +111,7 @@ public void queryString_uriInfo_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); validateMapResponseModel(output); } @@ -168,7 +168,7 @@ public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 07388fa8..406fff05 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -40,9 +40,9 @@ public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); assertEquals(404, resp.getStatusCode()); - assertNotNull(resp.getHeaders()); - assertTrue(resp.getHeaders().containsKey("Content-Type")); - assertEquals("application/json;charset=UTF-8", resp.getHeaders().get("Content-Type")); + assertNotNull(resp.getMultiValueHeaders()); + assertTrue(resp.getMultiValueHeaders().containsKey("Content-Type")); + assertEquals("application/json;charset=UTF-8", resp.getMultiValueHeaders().getFirst("Content-Type")); try { JsonNode errorData = mapper.readTree(resp.getBody()); assertNotNull(errorData.findValue("status")); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 95767e41..15e9c5b4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -57,7 +57,7 @@ public void context_autowireValidContext_echoContext() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("text/plain", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("text/plain", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); assertEquals(STAGE, output.getBody()); } @@ -70,7 +70,7 @@ public void context_contextAware_contextEcho() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals("text/plain", output.getHeaders().get("Content-Type").split(";")[0]); + assertEquals("text/plain", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); assertEquals(STAGE, output.getBody()); } @@ -82,10 +82,10 @@ public void filter_customHeaderFilter_echoHeaders() { .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertNotNull(output.getHeaders()); - assertTrue(output.getHeaders().size() > 0); - assertNotNull(output.getHeaders().get(CustomHeaderFilter.HEADER_NAME)); - assertEquals(CustomHeaderFilter.HEADER_VALUE, output.getHeaders().get(CustomHeaderFilter.HEADER_NAME)); + assertNotNull(output.getMultiValueHeaders()); + assertTrue(output.getMultiValueHeaders().size() > 0); + assertNotNull(output.getMultiValueHeaders().get(CustomHeaderFilter.HEADER_NAME)); + assertEquals(CustomHeaderFilter.HEADER_VALUE, output.getMultiValueHeaders().getFirst(CustomHeaderFilter.HEADER_NAME)); } @Test @@ -125,9 +125,9 @@ public void cookie_injectInResponse_expectCustomSetCookie() { assertEquals(200, output.getStatusCode()); - assertTrue(output.getHeaders().containsKey(HttpHeaders.SET_COOKIE)); - assertTrue(output.getHeaders().get(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_NAME + "=" + ContextResource.COOKIE_VALUE)); - assertTrue(output.getHeaders().get(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_DOMAIN)); + assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_NAME + "=" + ContextResource.COOKIE_VALUE)); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(ContextResource.COOKIE_DOMAIN)); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index 08a496dd..38d3e3d2 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -29,7 +29,7 @@ public void staticPage() { assertEquals(200, resp.getStatusCode()); assertTrue(resp.getBody().startsWith("")); - assertTrue(resp.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertEquals(MediaType.TEXT_HTML, resp.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.TEXT_HTML, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } } diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java index f1e4b4b8..d362030f 100644 --- a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -67,7 +67,7 @@ public void headers_getHeaders_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output); } @@ -81,7 +81,7 @@ public void context_servletResponse_setCustomHeader() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertTrue(output.getHeaders().containsKey("XX")); + assertTrue(output.getMultiValueHeaders().containsKey("XX")); } @Test @@ -92,11 +92,11 @@ public void context_serverInfo_correctContext() { .queryString("contentType", "true") .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - for (String header : output.getHeaders().keySet()) { - System.out.println(header + ": " + output.getHeaders().get(header)); + for (String header : output.getMultiValueHeaders().keySet()) { + System.out.println(header + ": " + output.getMultiValueHeaders().getFirst(header)); } assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); System.out.println("Body: " + output.getBody()); validateSingleValueModel(output, "Hello Struts2"); @@ -113,7 +113,7 @@ public void queryString_uriInfo_echo() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); validateMapResponseModel(output); } @@ -128,7 +128,7 @@ public void requestScheme_valid_expectHttps() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, "https"); } @@ -143,7 +143,7 @@ public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getHeaders().get("Content-Type")); + assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } From f6416060350906ab3183d7e47cce0e5fd7eb202a Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 19 Oct 2018 15:55:18 -0700 Subject: [PATCH 0198/1214] If the request is invalid (ie I don't have the parameters I expect) the getRemoteAddr method return the localhost address (#182) --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 1d4f3a3d..d75e80d8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -584,6 +584,9 @@ public BufferedReader getReader() @Override public String getRemoteAddr() { + if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) { + return "127.0.0.1"; + } return request.getRequestContext().getIdentity().getSourceIp(); } From 0ec6f5e69d9292e28bb43d0b072a4569c67909ef Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 12:55:47 -0700 Subject: [PATCH 0199/1214] Fix for Jersey routing issue #200. Added unit tests and fixed the base path stripping method in main container handler. Changed log path format to include the encoded path with the full context --- .../internal/LambdaContainerHandler.java | 9 ++++++-- .../ApacheCombinedServletLogFormatter.java | 2 +- .../servlet/AwsProxyHttpServletRequest.java | 2 +- .../proxy/model/ContainerConfig.java | 2 +- aws-serverless-java-container-jersey/pom.xml | 9 ++++++++ .../proxy/jersey/JerseyHandlerFilter.java | 15 +++++++++++-- .../proxy/jersey/EchoJerseyResource.java | 12 ++++++++--- .../proxy/jersey/JerseyParamEncodingTest.java | 21 +++++++++++++++++++ 8 files changed, 62 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index b3f6c2de..449f7e06 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -135,8 +135,13 @@ public static ObjectMapper getObjectMapper() { * @param basePath The base path to be stripped from the request */ public void stripBasePath(String basePath) { - config.setStripBasePath(true); - config.setServiceBasePath(basePath); + if (basePath == null || "".equals(basePath)) { + config.setStripBasePath(false); + config.setServiceBasePath(null); + } else { + config.setStripBasePath(true); + config.setServiceBasePath(basePath); + } } /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index 8afb60bf..b094d539 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -108,7 +108,7 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType logLineBuilder.append("\""); logLineBuilder.append(servletRequest.getMethod().toUpperCase(Locale.ENGLISH)); logLineBuilder.append(" "); - logLineBuilder.append(servletRequest.getPathInfo()); + logLineBuilder.append(servletRequest.getRequestURI()); logLineBuilder.append(" "); logLineBuilder.append(servletRequest.getProtocol()); logLineBuilder.append("\" "); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index d75e80d8..120eeacb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -203,7 +203,7 @@ public String getMethod() { @Override public String getPathInfo() { - String pathInfo = cleanUri(request.getPath()); //getServletPath().replace(getContextPath(), ""); + String pathInfo = cleanUri(request.getPath()); return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 741ebf4a..aa7e44a2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -19,7 +19,7 @@ public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); configuration.setStripBasePath(false); configuration.setUriEncoding(DEFAULT_URI_ENCODING); - configuration.setConsolidateSetCookieHeaders(true); + configuration.setConsolidateSetCookieHeaders(false); configuration.setUseStageAsServletContext(false); configuration.setValidFilePaths(DEFAULT_FILE_PATHS); configuration.setQueryStringCaseSensitive(false); diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 02573775..a2f20e20 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -84,6 +84,15 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 2.9 + + always + + com.github.spotbugs spotbugs-maven-plugin diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index fbec6769..8dbf9a8d 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier; @@ -34,6 +35,7 @@ import java.util.concurrent.CountDownLatch; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY; @@ -125,7 +127,16 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request baseUri = getBaseUri(request, "/"); } - UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(servletRequest.getPathInfo()); + String requestFullPath = servletRequest.getRequestURI(); + if (LambdaContainerHandler.getContainerConfig().getServiceBasePath() != null && LambdaContainerHandler.getContainerConfig().isStripBasePath()) { + if (requestFullPath.startsWith(LambdaContainerHandler.getContainerConfig().getServiceBasePath())) { + requestFullPath = requestFullPath.replaceFirst(LambdaContainerHandler.getContainerConfig().getServiceBasePath(), ""); + if (!requestFullPath.startsWith("/")) { + requestFullPath = "/" + requestFullPath; + } + } + } + UriBuilder uriBuilder = UriBuilder.fromUri(baseUri).path(requestFullPath); uriBuilder.replaceQuery(servletRequest.getQueryString()); PropertiesDelegate apiGatewayProperties = new MapPropertiesDelegate(); @@ -136,7 +147,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request ContainerRequest requestContext = new ContainerRequest( null, // jersey uses "/" by default - uriBuilder.build(), //requestUri, + uriBuilder.build(), servletRequest.getMethod().toUpperCase(Locale.ENGLISH), (SecurityContext)servletRequest.getAttribute(JAX_SECURITY_CONTEXT_PROPERTY), apiGatewayProperties); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 73cdb6bc..d33105ba 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -27,13 +27,10 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.ContextResolver; -import javax.ws.rs.ext.Providers; import java.util.Enumeration; import java.util.List; import java.util.Random; -import java.util.Set; /** @@ -206,4 +203,13 @@ public Response emptyStream(@PathParam("paramId") String paramId, @PathParam("pa public Response throwException() { throw new UnsupportedOperationException(EXCEPTION_MESSAGE); } + + @Path("/encoded-path/{resource}") @GET + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + public Response encodedPathParam(@Encoded @PathParam("resource") String resource) { + SingleValueModel sv = new SingleValueModel(); + sv.setValue(resource); + return Response.ok(sv).build(); + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index bab8a7fc..ad8c2917 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -141,6 +141,27 @@ public void queryParam_encoding_expectFullyEncodedUrl() { System.out.println("body:" + resp.getBody()); } + @Test + public void pathParam_encoded_routesToCorrectPath() { + String encodedParam = "http%3A%2F%2Fhelloresource.com"; + String path = "/echo/encoded-path/" + encodedParam; + AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build(); + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertNotNull(resp); + assertEquals(resp.getStatusCode(), 200); + validateSingleValueModel(resp, encodedParam); + } + + @Test + public void pathParam_encoded_returns404() { + String encodedParam = "http://helloresource.com"; + String path = "/echo/encoded-path/" + encodedParam; + AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build(); + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertNotNull(resp); + assertEquals(resp.getStatusCode(), 404); + } + @Test @Ignore public void queryParam_listOfString_expectCorrectLength() { From cf0577f5feafbe74bc7357ddcd868039e160c1e0 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 13:04:24 -0700 Subject: [PATCH 0200/1214] Added new extended request ID parameter to proxy event --- .../internal/testutils/AwsProxyRequestBuilder.java | 1 + .../proxy/model/ApiGatewayRequestContext.java | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index c0b53610..01924c06 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -73,6 +73,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); this.request.setRequestContext(new ApiGatewayRequestContext()); this.request.getRequestContext().setRequestId(UUID.randomUUID().toString()); + this.request.getRequestContext().setExtendedRequestId(UUID.randomUUID().toString()); this.request.getRequestContext().setStage("test"); this.request.getRequestContext().setProtocol("HTTP/1.1"); this.request.getRequestContext().setRequestTimeEpoch(System.currentTimeMillis()); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java index edf28e05..37a18822 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java @@ -38,6 +38,7 @@ public class ApiGatewayRequestContext { private String resourcePath; private String httpMethod; private String requestId; + private String extendedRequestId; private String accountId; private ApiGatewayRequestIdentity identity; private ApiGatewayAuthorizerContext authorizer; @@ -102,6 +103,16 @@ public void setRequestId(String requestId) { } + public String getExtendedRequestId() { + return extendedRequestId; + } + + + public void setExtendedRequestId(String extendedRequestId) { + this.extendedRequestId = extendedRequestId; + } + + public String getAccountId() { return accountId; } From 31a53c3e099eb653ad715bb30e77538fdc57f834 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 13:44:05 -0700 Subject: [PATCH 0201/1214] Added ability to set a default charset for Content-Type header when a request doesn't explicitly specify one. This addresses issue #175 --- .../AwsProxyHttpServletRequestReader.java | 29 +++++++++++ .../proxy/model/ContainerConfig.java | 24 +++++++++ .../AwsProxyHttpServletRequestReaderTest.java | 52 +++++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index a22a34c8..6cba61f7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -14,10 +14,12 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; +import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; /** @@ -34,6 +36,11 @@ public class AwsProxyHttpServletRequestReader extends RequestReader getRequestClass() { return AwsProxyRequest.class; } + + //------------------------------------------------------------- + // Methods - Private + //------------------------------------------------------------- + + private String getContentTypeWithCharset(String headerValue, ContainerConfig config) { + if (headerValue == null || "".equals(headerValue.trim())) { + return headerValue; + } + + if (headerValue.contains("charset=")) { + return headerValue; + } + + String newValue = headerValue; + if (!headerValue.trim().endsWith(";")) { + newValue += "; "; + } + + newValue += "charset=" + config.getDefaultContentCharset(); + return newValue; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index aa7e44a2..4f21673d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -13,6 +13,7 @@ */ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; + public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1"; private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; public static ContainerConfig defaultConfig() { @@ -24,6 +25,7 @@ public static ContainerConfig defaultConfig() { configuration.setValidFilePaths(DEFAULT_FILE_PATHS); configuration.setQueryStringCaseSensitive(false); configuration.addBinaryContentTypes("application/octet-stream", "image/jpeg", "image/png", "image/gif"); + configuration.setDefaultContentCharset(DEFAULT_CONTENT_CHARSET); return configuration; } @@ -35,6 +37,7 @@ public static ContainerConfig defaultConfig() { private String serviceBasePath; private boolean stripBasePath; private String uriEncoding; + private String defaultContentCharset; private boolean consolidateSetCookieHeaders; private boolean useStageAsServletContext; private List validFilePaths; @@ -248,4 +251,25 @@ public void addBinaryContentTypes(String... contentTypes) { public boolean isBinaryContentType(String contentType) { return contentType != null && binaryContentTypes.contains(contentType.trim()); } + + + /** + * Returns the name of the default charset appended to the Content-Type header if no charset is specified by the request. The + * default value of this is ISO-8859-1. + * @return The name of the default charset for the Content-Type header + */ + public String getDefaultContentCharset() { + return defaultContentCharset; + } + + + /** + * Sets the default charset value for the Content-Type header if no charset is specified with a request. The default value of this + * is ISO-8859-1. If a request specifies a Content-Type header without a charset property, the value of + * this field is automatically appended to the header. + * @param defaultContentCharset The name of the charset for the content type header. + */ + public void setDefaultContentCharset(String defaultContentCharset) { + this.defaultContentCharset = defaultContentCharset; + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 456e522d..5584918d 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -2,6 +2,7 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; @@ -9,6 +10,7 @@ import org.junit.Test; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; import java.lang.reflect.Method; @@ -57,4 +59,54 @@ public void readRequest_urlDecode_expectDecodedPath() { } } + + @Test + public void readRequest_contentCharset_doesNotOverrideRequestCharset() { + String requestCharset = "application/json; charset=UTF-8"; + AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, requestCharset).build(); + try { + HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); + assertNotNull(servletRequest); + assertNotNull(servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(requestCharset, servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals("UTF-8", servletRequest.getCharacterEncoding()); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Could not read request"); + } + } + + @Test + public void readRequest_contentCharset_setsDefaultCharsetWhenNotSpecified() { + String requestCharset = "application/json"; + AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, requestCharset).build(); + try { + HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); + assertNotNull(servletRequest); + assertNotNull(servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + String contentAndCharset = requestCharset + "; charset=" + LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(); + assertEquals(contentAndCharset, servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(), servletRequest.getCharacterEncoding()); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Could not read request"); + } + } + + @Test + public void readRequest_contentCharset_appendsCharsetToComplextContentType() { + String contentType = "multipart/form-data; boundary=something"; + AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, contentType).build(); + try { + HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); + assertNotNull(servletRequest); + assertNotNull(servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + String contentAndCharset = contentType + "; charset=" + LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(); + assertEquals(contentAndCharset, servletRequest.getHeader(HttpHeaders.CONTENT_TYPE)); + assertEquals(LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(), servletRequest.getCharacterEncoding()); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Could not read request"); + } + } } From 11e128073076be8f79fc7d83a47a07a93edca76f Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 16:14:45 -0700 Subject: [PATCH 0202/1214] Fixes to struts2 implementation and archetype --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../proxy/struts2/Struts2LambdaHandler.java | 17 +++-------------- .../main/resources/archetype-resources/pom.xml | 18 ++++++------------ .../resources/archetype-resources/sam.yaml | 4 ++++ .../src/main/java/actions/PingController.java | 8 ++------ .../src/main/resources/struts.xml | 4 ++-- samples/struts/pet-store/pom.xml | 8 ++++---- 7 files changed, 22 insertions(+), 39 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 13401b81..32987291 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -17,7 +17,7 @@ 2.5.18 - 2.9.5 + 2.9.7 diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java index e2afdfb4..10d30cfe 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java @@ -27,19 +27,8 @@ public class Struts2LambdaHandler implements RequestStreamHandler { .getAwsProxyHandler(); @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) { - - try { - AwsProxyRequest request = LambdaContainerHandler.getObjectMapper() - .readValue(inputStream, AwsProxyRequest.class); - - AwsProxyResponse response = handler.proxy(request, context); - LambdaContainerHandler.getObjectMapper().writeValue(outputStream, response); - - // just in case it wasn't closed by the mapper - outputStream.close(); - } catch (IOException e) { - log.error("An unexpected exception happened while handling request", e); - } + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); } } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index bb05d5ed..8d44c02d 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -9,20 +9,14 @@ ${version} jar - Serverless Spring Boot API + Serverless Struts2 API https://github.com/awslabs/aws-serverless-java-container - - org.springframework.boot - spring-boot-starter-parent - 1.5.10.RELEASE - - 1.8 1.8 2.5.17 - 2.9.5 + 2.9.7 4.12 2.8.2 @@ -31,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-struts2 - 1.2.0 + 1.2 @@ -82,17 +76,17 @@ com.fasterxml.jackson.core jackson-core - 2.9.4 + ${jackson.version} com.fasterxml.jackson.core jackson-annotations - 2.9.4 + ${jackson.version} com.fasterxml.jackson.core jackson-databind - 2.9.4 + ${jackson.version} diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml index d17e69de..023266fc 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml @@ -23,6 +23,10 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Serverless Apache Struts2 API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + Resources: ${resourceName}Function: Type: AWS::Serverless::Function diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java index b8a67e00..f3763f4d 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java @@ -1,4 +1,4 @@ -package ${groupId}.controller; +package ${groupId}.actions; import com.opensymphony.xwork2.ModelDriven; @@ -32,13 +32,9 @@ public HttpHeaders index() { // POST /ping public HttpHeaders create() { - if (model.getName() == null || model.getBreed() == null) { - return null; - } - this.model = UUID.randomUUID().toString(); return new DefaultHttpHeaders("success") - .setLocationId(model.getId()); + .setLocationId(model); } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml index d0a1c31d..5b86eb97 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml @@ -16,7 +16,7 @@ - + @@ -39,7 +39,7 @@ - + diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 9aab925d..0bbde876 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.17 - 2.9.5 + 2.9.7 4.12 2.8.2 @@ -87,17 +87,17 @@ com.fasterxml.jackson.core jackson-core - 2.9.4 + ${jackson.version} com.fasterxml.jackson.core jackson-annotations - 2.9.4 + ${jackson.version} com.fasterxml.jackson.core jackson-databind - 2.9.4 + ${jackson.version} From 18d3385068f8596e94055adcb4d84157dffbece4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 16:16:06 -0700 Subject: [PATCH 0203/1214] Bump Jackson version to address security vulnerability CVE-2018-7489 --- aws-serverless-java-container-core/pom.xml | 10 +++++++++- aws-serverless-java-container-jersey/pom.xml | 12 ++++++++++-- aws-serverless-java-container-spring/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 20 ++++++++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 8a7b7eed..426dc4a2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.9.5 + 2.9.7 2.1 3.1.0 @@ -50,6 +50,14 @@ ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson.version} + + + commons-fileupload diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index a2f20e20..725181ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -59,8 +59,8 @@ com.fasterxml.jackson.core - jackson-annotations - 2.9.5 + jackson-databind + 2.9.7 true test @@ -77,6 +77,14 @@ com.fasterxml.jackson.core jackson-annotations + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index bac70d84..5134121e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -18,7 +18,7 @@ 5.0.7.RELEASE 5.0.1.RELEASE - 2.9.5 + 2.9.7 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index d41c4b5c..6b00c281 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -46,6 +46,20 @@ org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version} + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + @@ -60,6 +74,12 @@ + + com.fasterxml.jackson.core + jackson-databind + 2.9.7 + + io.symphonia From ddebe84803a1f9adcd3cabdbf8ce9a77ac613711 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 16:18:36 -0700 Subject: [PATCH 0204/1214] Updated proxyStream method to handle stream flushing and closing. Changed all samples and archetypes to remove the close() call for issue #183. --- README.md | 3 --- .../serverless/proxy/internal/LambdaContainerHandler.java | 7 +++++++ .../src/main/java/StreamLambdaHandler.java | 7 +++---- .../src/main/java/StreamLambdaHandler.java | 3 --- .../src/main/java/StreamLambdaHandler.java | 3 --- .../src/main/java/StreamLambdaHandler.java | 3 --- .../serverless/sample/jersey/StreamLambdaHandler.java | 4 +--- .../serverless/sample/spark/StreamLambdaHandler.java | 3 --- .../serverless/sample/spring/StreamLambdaHandler.java | 3 --- .../serverless/sample/springboot/StreamLambdaHandler.java | 3 --- 10 files changed, 11 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 3823b65b..e0af625a 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,6 @@ public class StreamLambdaHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } ``` diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 449f7e06..0e61495a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.module.afterburner.AfterburnerModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,6 +82,9 @@ public abstract class LambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); @@ -25,8 +27,5 @@ public class StreamLambdaHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index b185c059..fdd1409a 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -33,8 +33,5 @@ public class StreamLambdaHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index 31b28393..8cddb47e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -29,8 +29,5 @@ public class StreamLambdaHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index fe0075ba..e022540c 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -29,8 +29,5 @@ public class StreamLambdaHandler implements RequestStreamHandler { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } \ No newline at end of file diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java index 96276958..20c6d534 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.sample.jersey; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; @@ -32,8 +33,5 @@ public StreamLambdaHandler() { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java index 09639eae..40ace9d3 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java @@ -50,8 +50,5 @@ public StreamLambdaHandler() { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 158531bc..71fb94ce 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -47,8 +47,5 @@ public StreamLambdaHandler() { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java index 50c75c63..38e6dae8 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java @@ -46,8 +46,5 @@ public StreamLambdaHandler() { public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { handler.proxyStream(inputStream, outputStream, context); - - // just in case it wasn't closed by the mapper - outputStream.close(); } } From 1e00371f9671d2ab515391c31e732cce60e5f605 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 16:19:15 -0700 Subject: [PATCH 0205/1214] Bump of versions in archetypes and changed API Gateway endpoints to be regional --- .../resources/archetype-resources/pom.xml | 22 ++++++++++++++++++- .../resources/archetype-resources/sam.yaml | 4 ++++ .../test/java/StreamLambdaHandlerTest.java | 4 ++-- .../resources/archetype-resources/pom.xml | 2 +- .../resources/archetype-resources/sam.yaml | 4 ++++ .../test/java/StreamLambdaHandlerTest.java | 4 ++-- .../resources/archetype-resources/pom.xml | 2 +- .../resources/archetype-resources/sam.yaml | 4 ++++ .../test/java/StreamLambdaHandlerTest.java | 4 ++-- .../resources/archetype-resources/pom.xml | 2 +- .../resources/archetype-resources/sam.yaml | 4 ++++ .../test/java/StreamLambdaHandlerTest.java | 4 ++-- 12 files changed, 48 insertions(+), 12 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 37a26f72..d29d3f2f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -20,13 +20,33 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 1.1.4 + 1.2 org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version} + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.9.7 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml index ffc9814e..3912003f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml @@ -23,6 +23,10 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Serverless Jersey API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + Resources: ${resourceName}Function: Type: AWS::Serverless::Function diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index d648408f..3f232ebc 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -51,8 +51,8 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("pong")); assertTrue(response.getBody().contains("Hello, World!")); - assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index c78e6d12..ba2b2a84 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.1.4 + 1.2 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml index 7a17ed41..82ea86d8 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml @@ -23,6 +23,10 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Serverless Spark API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + Resources: ${resourceName}Function: Type: AWS::Serverless::Function diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index d648408f..3f232ebc 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -51,8 +51,8 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("pong")); assertTrue(response.getBody().contains("Hello, World!")); - assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 31a8d28d..5d2eb536 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.4 + 1.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml index f51d43cf..9f44fe29 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml @@ -23,6 +23,10 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Serverless Spring API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + Resources: ${resourceName}Function: Type: AWS::Serverless::Function diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index d648408f..3f232ebc 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -51,8 +51,8 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("pong")); assertTrue(response.getBody().contains("Hello, World!")); - assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml index 0b56f279..25a900f4 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.1.4 + 1.2 diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml index 7569beda..62a1e826 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml @@ -23,6 +23,10 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: AWS Serverless Spring Boot API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + Resources: ${resourceName}Function: Type: AWS::Serverless::Function diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index d648408f..3f232ebc 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -51,8 +51,8 @@ public void ping_streamRequest_respondsWithHello() { assertTrue(response.getBody().contains("pong")); assertTrue(response.getBody().contains("Hello, World!")); - assertTrue(response.getHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getHeaders().get(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); } @Test From 9e0ab1a64f067d35e01647db36cb3b182a8d6098 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 17:47:54 -0700 Subject: [PATCH 0206/1214] Added jacoco coverage plugin and set minimum coverage of 50% for build to succeed, beginning to address #160 --- aws-serverless-java-container-jersey/pom.xml | 44 +++++++++++++++++++ aws-serverless-java-container-spark/pom.xml | 44 +++++++++++++++++++ aws-serverless-java-container-spring/pom.xml | 44 +++++++++++++++++++ aws-serverless-java-container-struts2/pom.xml | 44 +++++++++++++++++++ pom.xml | 2 +- 5 files changed, 177 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 725181ec..667334f5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -92,6 +92,50 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + org.apache.maven.plugins diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index ff52be35..ac2f8bf8 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -44,6 +44,50 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + org.apache.maven.plugins diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5134121e..627d88b1 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -160,6 +160,50 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + org.apache.maven.plugins diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 32987291..9af262be 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -98,6 +98,50 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + org.apache.maven.plugins diff --git a/pom.xml b/pom.xml index 7d52b283..f3c7d174 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ - 0.1 + 0.5 From 25ef434ca54e3c97daf59e9de0fb2f9fa3908c5c Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 22 Oct 2018 18:19:34 -0700 Subject: [PATCH 0207/1214] Framework versions bump to address #201 --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 7 ++++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 667334f5..3658a3f7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.26 + 2.27 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 627d88b1..ab49e30e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,9 @@ - 5.0.7.RELEASE - 5.0.1.RELEASE + 5.1.1.RELEASE + 1.5.17.RELEASE + 5.1.1.RELEASE 2.9.7 @@ -83,7 +84,7 @@ org.springframework.boot spring-boot-autoconfigure - 1.5.9.RELEASE + ${springboot.version} test diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index d29d3f2f..d3d1f773 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -13,7 +13,7 @@ 1.8 1.8 - 2.26 + 2.27 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 5d2eb536..2b022bcf 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 5.0.3.RELEASE + 5.1.1.RELEASE 4.12 2.8.2 diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml index 25a900f4..6d136ad7 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.10.RELEASE + 1.5.17.RELEASE From 074f9dcaa4f46b6f583ab97a81944857e572eff2 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 23 Oct 2018 09:12:43 -0700 Subject: [PATCH 0208/1214] Parametrized depedency version in the archetype to pick up the project one. Also added base integration tests to address #178 --- aws-serverless-jersey-archetype/pom.xml | 32 +++++++ .../resources/archetype-resources/pom.xml | 24 ++--- .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + aws-serverless-spark-archetype/pom.xml | 33 +++++++ .../resources/archetype-resources/pom.xml | 10 +- .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + aws-serverless-spring-archetype/pom.xml | 33 +++++++ .../resources/archetype-resources/pom.xml | 8 +- .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + aws-serverless-springboot-archetype/pom.xml | 32 +++++++ .../resources/archetype-resources/pom.xml | 8 +- .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + aws-serverless-struts2-archetype/pom.xml | 32 +++++++ .../META-INF/maven/archetype-metadata.xml | 6 ++ .../resources/archetype-resources/pom.xml | 8 +- .../test/java/StreamLambdaHandlerTest.java | 91 +++++++++++++++++++ .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + 22 files changed, 302 insertions(+), 35 deletions(-) create mode 100644 aws-serverless-jersey-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-jersey-archetype/src/test/resources/projects/base/goal.txt create mode 100644 aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt create mode 100644 aws-serverless-spring-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-spring-archetype/src/test/resources/projects/base/goal.txt create mode 100644 aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt create mode 100644 aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java create mode 100644 aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 459bdfac..d25e4bd8 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -25,6 +25,23 @@ + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + org.apache.maven.archetype @@ -35,10 +52,25 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + org.apache.maven.plugins maven-archetype-plugin 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index d3d1f773..3bb6feb8 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -2,9 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ${groupId} - ${artifactId} - ${version} + \${groupId} + \${artifactId} + \${version} jar Serverless Jersey API @@ -14,13 +14,14 @@ 1.8 1.8 2.27 + 2.9.7 com.amazonaws.serverless aws-serverless-java-container-jersey - 1.2 + ${project.version} @@ -46,7 +47,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.7 + ${jackson.version} @@ -54,19 +55,6 @@ jersey-hk2 ${jersey.version} - - - org.glassfish.hk2 - hk2-api - - - - - - org.glassfish.hk2 - hk2-api - 2.5.0-b42 - javax.inject diff --git a/aws-serverless-jersey-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-jersey-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..06e7362c --- /dev/null +++ b/aws-serverless-jersey-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=jersey-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-jersey-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-jersey-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 196b1a42..e138ed73 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -25,6 +25,23 @@ + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + org.apache.maven.archetype @@ -35,10 +52,26 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + + org.apache.maven.plugins maven-archetype-plugin 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index c25f5fb4..e4705548 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ${groupId} - ${artifactId} - ${version} + \${groupId} + \${artifactId} + \${version} jar Serverless Spark API @@ -15,7 +15,7 @@ 1.8 1.8 - 2.9.5 + 2.9.7 2.8.0 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - 1.2 + ${project.version} diff --git a/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..33825ed0 --- /dev/null +++ b/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=spark-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index b69b5728..870f27db 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -25,6 +25,23 @@ + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + org.apache.maven.archetype @@ -35,10 +52,26 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + + org.apache.maven.plugins maven-archetype-plugin 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 2b022bcf..ff610997 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ${groupId} - ${artifactId} - ${version} + \${groupId} + \${artifactId} + \${version} jar Serverless Spring API @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.2 + ${project.version} diff --git a/aws-serverless-spring-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-spring-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..20f24920 --- /dev/null +++ b/aws-serverless-spring-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=spring-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-spring-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-spring-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-spring-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index af4cb0f1..71e11a75 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -25,6 +25,23 @@ + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + org.apache.maven.archetype @@ -35,10 +52,25 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + org.apache.maven.plugins maven-archetype-plugin 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml index 6d136ad7..532a3db6 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ${groupId} - ${artifactId} - ${version} + \${groupId} + \${artifactId} + \${version} jar Serverless Spring Boot API @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 1.2 + ${project.version} diff --git a/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..7df3bf6e --- /dev/null +++ b/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=springboot-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 9ef60377..c268c542 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -26,6 +26,23 @@ + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + org.apache.maven.archetype @@ -36,10 +53,25 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + org.apache.maven.plugins maven-archetype-plugin 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 7aa1c89b..c2784834 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -9,6 +9,12 @@ **/*.java + + src/test/java + + **/*.java + + src/main/resources diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 8d44c02d..e43d0f88 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ${groupId} - ${artifactId} - ${version} + \${groupId} + \${artifactId} + \${version} jar Serverless Struts2 API @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-struts2 - 1.2 + ${project.version} diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..f429ce66 --- /dev/null +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,91 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static Struts2LambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new Struts2LambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..d731ebe8 --- /dev/null +++ b/aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=struts2-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file From 0f1768c96bfb3ed685007fb0b4fbec8eb7dc3dba Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 23 Oct 2018 12:45:39 -0700 Subject: [PATCH 0209/1214] Added unit tests for stage as context on Jersey routing bug (#200) --- .../proxy/jersey/JerseyAwsProxyTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 656a6f52..6b8977d0 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -239,6 +240,21 @@ public void stripBasePath_route_shouldRouteCorrectly() { handler.stripBasePath(""); } + @Test + public void stripBasePath_route_shouldReturn404WithStageAsContext() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + .stage("prod") + .json() + .queryString("status", "201") + .build(); + handler.stripBasePath("/custompath"); + LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(404, output.getStatusCode()); + handler.stripBasePath(""); + LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); + } + @Test public void stripBasePath_route_shouldReturn404() { AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") From db1916cb648a8e0927e046931c5c23756064f043 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 23 Oct 2018 13:01:17 -0700 Subject: [PATCH 0210/1214] Updated dependency check plugin version --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 426dc4a2..973232df 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -162,7 +162,7 @@ org.owasp dependency-check-maven - 3.1.1 + 3.3.2 true diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 3658a3f7..21cf3528 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -187,7 +187,7 @@ org.owasp dependency-check-maven - 3.1.1 + 3.3.2 true diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c81bf0df..c0d9e80a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -139,7 +139,7 @@ org.owasp dependency-check-maven - 3.1.1 + 3.3.2 true diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ab49e30e..04653f92 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -256,7 +256,7 @@ org.owasp dependency-check-maven - 3.1.1 + 3.3.2 true diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 9af262be..3b191ea2 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -193,7 +193,7 @@ org.owasp dependency-check-maven - 3.1.1 + 3.3.2 true From 5b7cb7472777fcb10789899bb64eecb7ad325f53 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 23 Oct 2018 13:01:30 -0700 Subject: [PATCH 0211/1214] Bump dependency versions in samples --- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot/pet-store/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 6b00c281..aa4f0e80 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.26 + 2.27 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 32068617..9efd591c 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.4 + 2.9.7 2.8.0 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 495680f6..ebdc509a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.0.3.RELEASE + 5.1.1.RELEASE 4.12 2.8.2 diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index 2f342e1b..a8522d0e 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.9.RELEASE + 1.5.17.RELEASE From 373e9d166e89410aa4abe08633f44889ebd90550 Mon Sep 17 00:00:00 2001 From: Tom Jordahl Date: Wed, 24 Oct 2018 14:00:15 -0400 Subject: [PATCH 0212/1214] Do not call SecurityUtils.getValidFilePath when processing a Multipart form as it will reject almost anything a user might put there. Just use the base filename --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 120eeacb..cfc226d7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -25,6 +25,7 @@ import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; @@ -63,6 +64,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Enumeration; +import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -685,7 +687,7 @@ private String[] getFormBodyParameterCaseInsensitive(String key) { } - @SuppressFBWarnings("FILE_UPLOAD_FILENAME") + @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) private Map getMultipartFormParametersMap() { if (multipartFormParameters != null) { return multipartFormParameters; @@ -701,7 +703,7 @@ private Map getMultipartFormParametersMap() { try { List items = upload.parseRequest(this); for (FileItem item : items) { - String fileName = SecurityUtils.getValidFilePath(item.getName(), true); + String fileName = FilenameUtils.getName(item.getName()); AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); newPart.setName(fileName); newPart.setSubmittedFileName(item.getFieldName()); From 22101e1a69e5a92fef3b49ede70d0513e17b8dd8 Mon Sep 17 00:00:00 2001 From: Tom Jordahl Date: Wed, 24 Oct 2018 14:11:58 -0400 Subject: [PATCH 0213/1214] Unused import --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index cfc226d7..303ac218 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -64,7 +64,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Enumeration; -import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; From eb69c2ef5a90ec656830eb0aff0fc8c9c1c507b9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 11:50:43 -0700 Subject: [PATCH 0214/1214] Bump maven GPG plugin version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f3c7d174..d10edfe7 100644 --- a/pom.xml +++ b/pom.xml @@ -150,7 +150,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.4 + 1.6 sign-artifacts From 4c98b48a5aa90c9837e1cb53de8c02d442a38e5d Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 11:57:40 -0700 Subject: [PATCH 0215/1214] Changed pin entry mode --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index d10edfe7..1851cde4 100644 --- a/pom.xml +++ b/pom.xml @@ -158,6 +158,12 @@ sign + + + --pinentry-mode + loopback + + From ae67f7f51b73a7eb48973b2d76f45046f8266f5c Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 12:05:37 -0700 Subject: [PATCH 0216/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 9 ++++----- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 7 +++---- pom.xml | 2 +- 11 files changed, 27 insertions(+), 29 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 973232df..3bb63c22 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 21cf3528..4ce6435c 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c0d9e80a..1b72ac91 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 04653f92..63e4b08e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.2 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 3b191ea2..c37179f3 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -1,18 +1,17 @@ - + 4.0.0 aws-serverless-java-container-struts2 AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 @@ -25,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2-SNAPSHOT + 1.2 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d25e4bd8..0b8c29d5 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2-SNAPSHOT + 1.2 maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index e138ed73..059c8ffd 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2-SNAPSHOT + 1.2 maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 870f27db..df47ed1d 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2-SNAPSHOT + 1.2 maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 71e11a75..8e15ae7c 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2-SNAPSHOT + 1.2 maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c268c542..bca4f4e3 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -1,16 +1,15 @@ - + 4.0.0 com.amazonaws.serverless aws-serverless-java-container - 1.2-SNAPSHOT + 1.2 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.2-SNAPSHOT + 1.2 maven-archetype diff --git a/pom.xml b/pom.xml index 1851cde4..13dc3a45 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2-SNAPSHOT + 1.2 AWS Serverless Java container From 89cb996d268963cea5927c53f8d834affe5cf051 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 12:05:38 -0700 Subject: [PATCH 0217/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3bb63c22..9747f28e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 4ce6435c..87af8432 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2 + 1.3-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 1b72ac91..01f9ac7a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2 + 1.3-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 63e4b08e..9336e942 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2 + 1.3-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index c37179f3..1e916d0b 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.2 + 1.3-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 0b8c29d5..268ccb2f 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.2 + 1.3-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 059c8ffd..3e69d967 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.2 + 1.3-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index df47ed1d..1b9aa17f 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.2 + 1.3-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 8e15ae7c..c2090717 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.2 + 1.3-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index bca4f4e3..f37ce969 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.2 + 1.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.2 + 1.3-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index 13dc3a45..d1275e73 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.2 + 1.3-SNAPSHOT AWS Serverless Java container From 65703b9d8d48c69f7c54f00252a0608cecfad1dd Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 12:58:47 -0700 Subject: [PATCH 0218/1214] Removed loopback pin entry for gpg plugin --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index d1275e73..cfd050b9 100644 --- a/pom.xml +++ b/pom.xml @@ -158,12 +158,6 @@ sign - - - --pinentry-mode - loopback - - From f0841771ab34f89f134f917dfaa248e1d0650237 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 24 Oct 2018 17:23:10 -0700 Subject: [PATCH 0219/1214] Fixed typo in readme link for struts quickstart --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e0af625a..66ffc502 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) -* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start-Struts) +* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From ba7a33c88966135e23e573c16c1e2e8ea11da519 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 31 Oct 2018 10:29:52 -0700 Subject: [PATCH 0220/1214] Changed ContainerRequest creation to use the method for the headers. Simple add was sending to an unimplemented addNull if the list didn't already exist. Also added unit test for issue #208 --- .../proxy/jersey/JerseyHandlerFilter.java | 5 +++-- .../proxy/jersey/EchoJerseyResource.java | 12 ++++++++++++ .../proxy/jersey/JerseyAwsProxyTest.java | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 8dbf9a8d..88fa48c2 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -30,6 +30,8 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.Locale; import java.util.concurrent.CountDownLatch; @@ -167,8 +169,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request while (headerNames.hasMoreElements()) { String headerKey = headerNames.nextElement(); - //requestContext.header(headerKey, servletRequest.getHeader(headerKey)); - requestContext.getHeaders().add(headerKey, servletRequest.getHeader(headerKey)); + requestContext.getHeaders().addAll(headerKey, Collections.list(servletRequest.getHeaders(headerKey))); } Timer.stop("JERSEY_SERVLET_REQUEST_TO_CONTAINER"); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index d33105ba..1b25bd92 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -17,6 +17,8 @@ import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; +import org.glassfish.jersey.server.ContainerRequest; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -212,4 +214,14 @@ public Response encodedPathParam(@Encoded @PathParam("resource") String resource sv.setValue(resource); return Response.ok(sv).build(); } + + @Path("/referer-header") @GET + @Produces(MediaType.APPLICATION_JSON) + @Consumes(MediaType.APPLICATION_JSON) + public Response referer(@HeaderParam("Referer") String referer) { + System.out.println("Received referer: " + referer); + SingleValueModel sv = new SingleValueModel(); + sv.setValue(referer); + return Response.ok(sv).build(); + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 6b8977d0..3187797f 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -288,6 +288,20 @@ public void emptyStream_putNullBody_expectPutToSucceed() { validateSingleValueModel(resp, CUSTOM_HEADER_KEY); } + @Test + public void refererHeader_headerParam_expectCorrectInjection() { + String refererValue = "test-referer"; + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/referer-header", "GET") + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header("Referer", refererValue) + .build(); + + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, refererValue); + } + private void validateMapResponseModel(AwsProxyResponse output) { validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); } From e826de6ff7d0eab7f340dead462c4b34e97b079e Mon Sep 17 00:00:00 2001 From: feinstein Date: Fri, 7 Dec 2018 18:24:50 -0200 Subject: [PATCH 0221/1214] PingResource has a `createPet` method that doesn't make much sense. --- .../src/main/java/resource/PingResource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java index 68f8c275..137ed030 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java @@ -18,9 +18,9 @@ public class PingResource { @GET @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.WILDCARD) - public Response createPet() { + public Response ping() { Map pong = new HashMap<>(); pong.put("pong", "Hello, World!"); return Response.status(200).entity(pong).build(); } -} \ No newline at end of file +} From 53ffdf909890db54fb411aa927279d097675c92b Mon Sep 17 00:00:00 2001 From: Eirik Jakobsen Date: Sun, 16 Dec 2018 01:50:20 +0100 Subject: [PATCH 0222/1214] Fixes issue where headers were treated as case sensitive after deserialization. --- .../proxy/AwsProxyExceptionHandler.java | 9 +-- .../servlet/AwsHttpServletResponse.java | 8 +- .../testutils/AwsProxyRequestBuilder.java | 16 ++-- .../proxy/model/AwsProxyRequest.java | 8 +- .../proxy/model/AwsProxyResponse.java | 12 +-- .../serverless/proxy/model/Headers.java | 10 +++ .../servlet/AwsHttpServletResponseTest.java | 7 +- .../proxy/model/AwsProxyRequestTest.java | 79 +++++++++++++++++++ .../proxy/model/MultiValuedTreeMapTest.java | 2 +- .../spring/springbootapp/TestApplication.java | 2 +- 10 files changed, 117 insertions(+), 36 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index 75bf3c6e..d2b96d8e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -16,12 +16,9 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.serverless.proxy.model.Headers; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat; -import com.fasterxml.jackson.databind.ser.std.JsonValueSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,8 +27,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.util.HashMap; -import java.util.Map; /** * Default implementation of the ExceptionHandler object that returns AwsProxyResponse objects. @@ -58,7 +53,7 @@ public class AwsProxyExceptionHandler // Variables - Private - Static //------------------------------------------------------------- - private static MultiValuedTreeMap headers = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); + private static Headers headers = new Headers(); //------------------------------------------------------------- // Constructors diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 9ae65c28..3ea2deda 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -13,7 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.internal.SecurityUtils; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.serverless.proxy.model.Headers; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; @@ -52,7 +52,7 @@ public class AwsHttpServletResponse // Variables - Private //------------------------------------------------------------- - private MultiValuedTreeMap headers = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); + private Headers headers = new Headers(); private int statusCode; private String statusMessage; private String responseBody; @@ -404,7 +404,7 @@ public boolean isCommitted() { @Override public void reset() { - headers = new MultiValuedTreeMap<>(); + headers = new Headers(); responseBody = null; writer = null; bodyOutputStream = new ByteArrayOutputStream(); @@ -439,7 +439,7 @@ byte[] getAwsResponseBodyBytes() { } - MultiValuedTreeMap getAwsResponseHeaders() { + Headers getAwsResponseHeaders() { return headers; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 01924c06..d2a9b050 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -18,10 +18,10 @@ import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; @@ -32,10 +32,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.HashMap; import java.util.UUID; @@ -67,7 +65,7 @@ public AwsProxyRequestBuilder(String path) { public AwsProxyRequestBuilder(String path, String httpMethod) { this.request = new AwsProxyRequest(); - this.request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); // avoid NPE + this.request.setMultiValueHeaders(new Headers()); // avoid NPE this.request.setHttpMethod(httpMethod); this.request.setPath(path); this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); @@ -111,7 +109,7 @@ public AwsProxyRequestBuilder json() { public AwsProxyRequestBuilder form(String key, String value) { if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED); String body = request.getBody(); @@ -126,7 +124,7 @@ public AwsProxyRequestBuilder form(String key, String value) { public AwsProxyRequestBuilder header(String key, String value) { if (this.request.getMultiValueHeaders() == null) { - this.request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + this.request.setMultiValueHeaders(new Headers()); } this.request.getMultiValueHeaders().add(key, value); @@ -223,7 +221,7 @@ public AwsProxyRequestBuilder cognitoIdentity(String identityId, String identity public AwsProxyRequestBuilder cookie(String name, String value) { if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } String cookies = request.getMultiValueHeaders().getFirst(HttpHeaders.COOKIE); @@ -238,7 +236,7 @@ public AwsProxyRequestBuilder cookie(String name, String value) { public AwsProxyRequestBuilder scheme(String scheme) { if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } request.getMultiValueHeaders().putSingle("CloudFront-Forwarded-Proto", scheme); @@ -247,7 +245,7 @@ public AwsProxyRequestBuilder scheme(String scheme) { public AwsProxyRequestBuilder serverName(String serverName) { if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } request.getMultiValueHeaders().putSingle("Host", serverName); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index 61aa7876..a607595b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -32,7 +32,7 @@ public class AwsProxyRequest { private String resource; private ApiGatewayRequestContext requestContext; private MultiValuedTreeMap multiValueQueryStringParameters; - private MultiValuedTreeMap multiValueHeaders; + private Headers multiValueHeaders; private Map pathParameters; private String httpMethod; private Map stageVariables; @@ -40,7 +40,7 @@ public class AwsProxyRequest { private boolean isBase64Encoded; public AwsProxyRequest() { - multiValueHeaders = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); + multiValueHeaders = new Headers(); multiValueQueryStringParameters = new MultiValuedTreeMap<>(); pathParameters = new HashMap<>(); stageVariables = new HashMap<>(); @@ -110,12 +110,12 @@ public void setMultiValueQueryStringParameters( this.multiValueQueryStringParameters = multiValueQueryStringParameters; } - public MultiValuedTreeMap getMultiValueHeaders() { + public Headers getMultiValueHeaders() { return multiValueHeaders; } - public void setMultiValueHeaders(MultiValuedTreeMap multiValueHeaders) { + public void setMultiValueHeaders(Headers multiValueHeaders) { this.multiValueHeaders = multiValueHeaders; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java index f2e3a63a..74118bfa 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java @@ -22,7 +22,7 @@ public class AwsProxyResponse { //------------------------------------------------------------- private int statusCode; - private MultiValuedTreeMap multiValueHeaders; + private Headers multiValueHeaders; private String body; private boolean isBase64Encoded; @@ -41,12 +41,12 @@ public AwsProxyResponse(int statusCode) { } - public AwsProxyResponse(int statusCode, MultiValuedTreeMap headers) { + public AwsProxyResponse(int statusCode, Headers headers) { this(statusCode, headers, null); } - public AwsProxyResponse(int statusCode, MultiValuedTreeMap headers, String body) { + public AwsProxyResponse(int statusCode, Headers headers, String body) { this.statusCode = statusCode; this.multiValueHeaders = headers; this.body = body; @@ -59,7 +59,7 @@ public AwsProxyResponse(int statusCode, MultiValuedTreeMap heade public void addHeader(String key, String value) { if (this.multiValueHeaders == null) { - this.multiValueHeaders = new MultiValuedTreeMap(); + this.multiValueHeaders = new Headers(); } this.multiValueHeaders.add(key, value); @@ -80,12 +80,12 @@ public void setStatusCode(int statusCode) { } - public MultiValuedTreeMap getMultiValueHeaders() { + public Headers getMultiValueHeaders() { return multiValueHeaders; } - public void setMultiValueHeaders(MultiValuedTreeMap multiValueHeaders) { + public void setMultiValueHeaders(Headers multiValueHeaders) { this.multiValueHeaders = multiValueHeaders; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java new file mode 100644 index 00000000..0de0d204 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java @@ -0,0 +1,10 @@ +package com.amazonaws.serverless.proxy.model; + +public class Headers extends MultiValuedTreeMap { + + private static final long serialVersionUID = 42L; + + public Headers() { + super(String.CASE_INSENSITIVE_ORDER); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 426e0f31..d9a4e742 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.serverless.proxy.model.Headers; import org.junit.Test; @@ -15,7 +15,6 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.util.Calendar; -import java.util.Map; import java.util.TimeZone; import java.util.concurrent.CountDownLatch; import java.util.regex.Matcher; @@ -154,7 +153,7 @@ public void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { resp.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); resp.addHeader("content-type", "application/xml"); - MultiValuedTreeMap awsResp = resp.getAwsResponseHeaders(); + Headers awsResp = resp.getAwsResponseHeaders(); assertEquals(1, awsResp.size()); assertEquals("application/xml", awsResp.getFirst(HttpHeaders.CONTENT_TYPE)); } @@ -165,7 +164,7 @@ public void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() resp.addCookie(new Cookie(COOKIE_NAME, COOKIE_VALUE)); resp.addCookie(new Cookie("Second", "test")); - MultiValuedTreeMap awsResp = resp.getAwsResponseHeaders(); + Headers awsResp = resp.getAwsResponseHeaders(); assertEquals(1, awsResp.size()); assertEquals(2, awsResp.get(HttpHeaders.SET_COOKIE).size()); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java new file mode 100644 index 00000000..6763bbda --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -0,0 +1,79 @@ +package com.amazonaws.serverless.proxy.model; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class AwsProxyRequestTest { + private static final String CUSTOM_HEADER_KEY_LOWER_CASE = "custom-header"; + private static final String CUSTOM_HEADER_VALUE = "123456"; + public static final String REQUEST_JSON = "{\n" + + " \"resource\": \"/api/{proxy+}\",\n" + + " \"path\": \"/api/endpoint\",\n" + + " \"httpMethod\": \"OPTIONS\",\n" + + " \"headers\": {\n" + + " \"Accept\": \"*/*\",\n" + + " \"User-Agent\": \"PostmanRuntime/7.1.1\",\n" + + " \"" + CUSTOM_HEADER_KEY_LOWER_CASE +"\":" + "\"" + CUSTOM_HEADER_VALUE + "\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Accept\": [\n" + + " \"*/*\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"PostmanRuntime/7.1.1\"\n" + + " ],\n" + + " \"" + CUSTOM_HEADER_KEY_LOWER_CASE + "\": [\n" + + " \"" + CUSTOM_HEADER_VALUE + "\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": null,\n" + + " \"multiValueQueryStringParameters\": null,\n" + + " \"pathParameters\": {\n" + + " \"proxy\": \"endpoint\"\n" + + " },\n" + + " \"stageVariables\": null,\n" + + " \"requestContext\": {\n" + + " \"resourceId\": null,\n" + + " \"resourcePath\": \"/api/{proxy+}\",\n" + + " \"httpMethod\": \"OPTIONS\",\n" + + " \"extendedRequestId\": null,\n" + + " \"requestTime\": \"15/Dec/2018:20:37:47 +0000\",\n" + + " \"path\": \"/api/endpoint\",\n" + + " \"accountId\": null,\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"stage\": \"stage_name\",\n" + + " \"domainPrefix\": null,\n" + + " \"requestTimeEpoch\": 1544906267828,\n" + + " \"requestId\": null,\n" + + " \"identity\": {\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"accountId\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"caller\": null,\n" + + " \"sourceIp\": \"54.240.196.171\",\n" + + " \"accessKey\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"cognitoAuthenticationProvider\": null,\n" + + " \"userArn\": null,\n" + + " \"userAgent\": \"PostmanRuntime/7.1.1\",\n" + + " \"user\": null\n" + + " },\n" + + " \"domainName\": \"https://apiId.execute-api.eu-central-1.amazonaws.com/\",\n" + + " \"apiId\": \"apiId\"\n" + + " },\n" + + " \"body\": null,\n" + + " \"isBase64Encoded\": false\n" + + "}"; + + @Test + public void deserialize_multiValuedHeaders_caseInsensitive() throws IOException { + AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString(REQUEST_JSON).build(); + assertNotNull(req.getMultiValueHeaders().get(CUSTOM_HEADER_KEY_LOWER_CASE.toUpperCase())); + assertEquals(CUSTOM_HEADER_VALUE, req.getMultiValueHeaders().get(CUSTOM_HEADER_KEY_LOWER_CASE.toUpperCase()).get(0)); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java index 3e215850..edc6d281 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java @@ -29,7 +29,7 @@ public void add_sameNameCaseSensitive_expectBothValues() { @Test public void add_sameNameCaseInsensitive_expectOneValue() { - MultiValuedTreeMap map = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); + Headers map = new Headers(); map.add("Test", "test"); assertNotNull(map.get("Test")); assertNotNull(map.get("test")); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java index 2ebe5f03..d70aac98 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java @@ -12,5 +12,5 @@ @SpringBootApplication @ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp") public class TestApplication extends SpringBootServletInitializer { - + } From 0fdd8cf19c821bfada34ad53d649901f190f54cf Mon Sep 17 00:00:00 2001 From: superweijiafeng Date: Tue, 18 Dec 2018 11:36:45 +0800 Subject: [PATCH 0223/1214] Fix get multivalue query parameter --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 303ac218..3f7d61f0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -511,7 +511,7 @@ public Map getParameterMap() { String[] values = output.get(e); newValues.addAll(Arrays.asList(values)); } - newValues.add(getFirstQueryParamValue(e, config.isQueryStringCaseSensitive())); + newValues.addAll(Arrays.asList(getQueryParamValues(e, config.isQueryStringCaseSensitive()))); output.put(e, newValues.toArray(new String[0])); }); } From e182e73ea341dce10a2c80f78ffd03339b99d505 Mon Sep 17 00:00:00 2001 From: Sergio Escalante Date: Tue, 18 Dec 2018 17:17:15 -0300 Subject: [PATCH 0224/1214] Removing unused unnecessary imports --- .../serverless/proxy/AwsProxyExceptionHandler.java | 5 ----- .../amazonaws/serverless/proxy/internal/SecurityUtils.java | 2 -- .../proxy/internal/servlet/AwsHttpServletRequest.java | 4 ---- .../internal/servlet/AwsLambdaServletContainerHandler.java | 1 - .../internal/servlet/AwsProxyHttpServletRequestReader.java | 1 - .../proxy/internal/servlet/AwsProxyRequestDispatcher.java | 2 -- .../proxy/internal/servlet/AwsServletContext.java | 1 - .../proxy/internal/servlet/filters/UrlPathValidator.java | 1 - .../proxy/internal/testutils/AwsProxyRequestBuilder.java | 3 --- .../serverless/proxy/jersey/JerseyHandlerFilter.java | 1 - .../proxy/spring/LambdaSpringApplicationInitializer.java | 6 ------ .../proxy/spring/SpringLambdaContainerHandler.java | 1 - .../serverless/proxy/struts2/Struts2LambdaHandler.java | 1 - 13 files changed, 29 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index 75bf3c6e..2521fcb0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -19,9 +19,6 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat; -import com.fasterxml.jackson.databind.ser.std.JsonValueSerializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,8 +27,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.util.HashMap; -import java.util.Map; /** * Default implementation of the ExceptionHandler object that returns AwsProxyResponse objects. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index 564882de..03dced87 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -7,9 +7,7 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Locale; import java.util.Set; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 5a7174f3..61239727 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -19,7 +19,6 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,16 +33,13 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.time.format.DateTimeFormatter; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 36445c3b..1c380829 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -17,7 +17,6 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 6cba61f7..63f7a0de 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -14,7 +14,6 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 8faa16c9..2155323b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -1,8 +1,6 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; - import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 938b143e..5a6dc85d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -35,7 +35,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index e4e38914..c0ec98d9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.util.regex.Pattern; /** * Simple path validator filter. This is a default implementation to prevent malformed paths from hitting the framework diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 01924c06..6f68d7bb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -21,7 +21,6 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; @@ -32,10 +31,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.HashMap; import java.util.UUID; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 8dbf9a8d..4fa15998 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -35,7 +35,6 @@ import java.util.concurrent.CountDownLatch; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; -import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index d2a40c04..7207b9c0 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -18,17 +18,11 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.ContextStoppedEvent; -import org.springframework.context.event.GenericApplicationListenerAdapter; -import org.springframework.context.support.AbstractRefreshableApplicationContext; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.context.support.ServletRequestHandledEvent; import org.springframework.web.servlet.DispatcherServlet; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 18bd5a21..28bff8af 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -29,7 +29,6 @@ import javax.servlet.ServletException; -import java.util.Arrays; import java.util.concurrent.CountDownLatch; /** diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java index 10d30cfe..1e63daf9 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java @@ -1,6 +1,5 @@ package com.amazonaws.serverless.proxy.struts2; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; From d74545393a085a625af825730229860163f98c02 Mon Sep 17 00:00:00 2001 From: Sergio Escalante Date: Tue, 18 Dec 2018 17:24:23 -0300 Subject: [PATCH 0225/1214] Fixing typos --- .../serverless/proxy/AwsProxySecurityContextWriter.java | 2 +- .../com/amazonaws/serverless/proxy/ExceptionHandler.java | 2 +- .../com/amazonaws/serverless/proxy/RequestReader.java | 2 +- .../com/amazonaws/serverless/proxy/ResponseWriter.java | 2 +- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- .../serverless/proxy/internal/servlet/AwsHttpSession.java | 8 ++++---- .../servlet/AwsLambdaServletContainerHandler.java | 2 +- .../proxy/internal/servlet/FilterChainHolder.java | 2 +- .../proxy/internal/servlet/FilterChainManager.java | 2 +- .../serverless/proxy/internal/servlet/FilterHolder.java | 2 +- .../serverless/proxy/model/ApiGatewayRequestIdentity.java | 2 +- .../amazonaws/serverless/proxy/model/ContainerConfig.java | 2 +- .../com/amazonaws/serverless/proxy/model/ErrorModel.java | 2 +- .../proxy/spark/SparkLambdaContainerHandler.java | 2 +- .../spark/embeddedserver/LambdaEmbeddedServerFactory.java | 2 +- 15 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java index 1929d3a4..4410626d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java @@ -19,7 +19,7 @@ import javax.ws.rs.core.SecurityContext; /** - * Default impolementation of SecurityContextWriter. Creates a SecurityContext object based on an API Gateway + * Default implementation of SecurityContextWriter. Creates a SecurityContext object based on an API Gateway * event and the Lambda context. This returns the default AwsProxySecurityContext instance. */ public class AwsProxySecurityContextWriter implements SecurityContextWriter { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java index 846c6478..7470c66d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ExceptionHandler.java @@ -20,7 +20,7 @@ * handled by the client applications directly within the container and a valid HTTP response is expected. This handler * is used for exceptions thrown by the library while marshalling and unmarshalling requests and responses. * - * The interface delcares two methods. A typed handle method for requests that are being proxied using a + * The interface declares two methods. A typed handle method for requests that are being proxied using a * request and response type LambdaContainerHandler, and a stream-based * handle method for * Lambda's RequestStreamHandler. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index 9a812f32..271eb807 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -27,7 +27,7 @@ * object that supports requests for the AWS_PROXY integration. * * @param The type for the AWS Lambda event - * @param The type for the undelying container request object + * @param The type for the underlying container request object */ public abstract class RequestReader { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java index 68d6e7b1..6984af2f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/ResponseWriter.java @@ -25,7 +25,7 @@ * or a ResponseReader implementation. For example, the Jersey library passes the response reader object to * the default implementation of this class. * - * @param The response object expceted from the underlying container + * @param The response object expected from the underlying container * @param The type for the Lambda function return value */ public abstract class ResponseWriter { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 5a7174f3..f371489f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -92,7 +92,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { //------------------------------------------------------------- /** - * Protected constructors for implemnenting classes. This should be called first with the context received from + * Protected constructors for implementing classes. This should be called first with the context received from * AWS Lambda * @param lambdaContext The Lambda function context. This object is used for utility methods such as log */ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 2b7b4257..1372b8f3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -91,7 +91,7 @@ public Object getAttribute(String name) { @Override @Deprecated public Object getValue(String name) { - throw new UnsupportedOperationException("Session values are deprecated and not suported"); + throw new UnsupportedOperationException("Session values are deprecated and not supported"); } @Override @@ -103,7 +103,7 @@ public Enumeration getAttributeNames() { @Override @Deprecated public String[] getValueNames() { - throw new UnsupportedOperationException("Session values are deprecated and not suported"); + throw new UnsupportedOperationException("Session values are deprecated and not supported"); } @Override @@ -115,7 +115,7 @@ public void setAttribute(String name, Object value) { @Override @Deprecated public void putValue(String name, Object value) { - throw new UnsupportedOperationException("Session values are deprecated and not suported"); + throw new UnsupportedOperationException("Session values are deprecated and not supported"); } @Override @@ -127,7 +127,7 @@ public void removeAttribute(String name) { @Override @Deprecated public void removeValue(String name) { - throw new UnsupportedOperationException("Session values are deprecated and not suported"); + throw new UnsupportedOperationException("Session values are deprecated and not supported"); } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 36445c3b..d1b00fc3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -87,7 +87,7 @@ protected AwsLambdaServletContainerHandler(Class requestTypeClass, //------------------------------------------------------------- /** - * Fowards a request to the existing framework container. This is called by the AwsProxyRequestDispatcher object + * Forwards a request to the existing framework container. This is called by the AwsProxyRequestDispatcher object * @param servletRequest The modified request object with the new request path * @param servletResponse The original servlet response * @throws ServletException diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index 682230dd..44c8fa95 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -24,7 +24,7 @@ /** * Implementation of the FilterChain interface. FilterChainHolder objects should be accessed through the - * FilterChainManager. Once a filter chain is loaded, use the doFilter emthod to run the chain + * FilterChainManager. Once a filter chain is loaded, use the doFilter method to run the chain * during a request lifecycle */ public class FilterChainHolder implements FilterChain { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index bd7087fa..8da92f1b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -38,7 +38,7 @@ * implementations that use the HttpServletRequest and HttpServletResponse objects. * * For example, the Spring implementation creates the ServletContext when the application is initialized the first time - * and creates a FitlerChainManager to execute its filters for each request. + * and creates a FilterChainManager to execute its filters for each request. */ public abstract class FilterChainManager { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index 60978969..2610622d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -123,7 +123,7 @@ public FilterConfig getFilterConfig() { /** * Returns the Registration object for the filter. The Registration object defined in this file implements * both FilterRegistration and FilterRegistration.Dynamic - * @return The registration obejct + * @return The registration object */ public Registration getRegistration() { return registration; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java index dfce0f72..89b1ea2a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestIdentity.java @@ -20,7 +20,7 @@ /** * Identity model for the API Gateway request context. This is used in the default AwsProxyRequest object. Contains - * all of the properties declared in the $context.identity API Gateway object so could be re-used for other implemnetations + * all of the properties declared in the $context.identity API Gateway object so could be re-used for other implementations * * @see AwsProxyRequest * @see RequestReader diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 4f21673d..a51cdd8a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -225,7 +225,7 @@ public boolean isQueryStringCaseSensitive() { /** * Sets whether query string parameter names should be treated as case sensitive. The default * value of this option is false for backward compatibility. - * @param queryStringCaseSensitive Tells the framework to treat query string parmaeter names as case sensitive + * @param queryStringCaseSensitive Tells the framework to treat query string parameter names as case sensitive */ public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) { this.queryStringCaseSensitive = queryStringCaseSensitive; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java index 5046a6c2..64514691 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ErrorModel.java @@ -13,7 +13,7 @@ package com.amazonaws.serverless.proxy.model; /** - * Default error response model. This object is used by the AwsProxyExceptionHandler objcect. + * Default error response model. This object is used by the AwsProxyExceptionHandler object. */ public class ErrorModel { diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 8acc4373..24714041 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -114,7 +114,7 @@ public static SparkLambdaContainerHandler get new AwsProxyExceptionHandler(), new LambdaEmbeddedServerFactory()); - // For Spark we cannot call intialize here. It needs to be called manually after the routes are set + // For Spark we cannot call initialize here. It needs to be called manually after the routes are set //newHandler.initialize(); return newHandler; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index a73b0005..3455170f 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -28,7 +28,7 @@ public LambdaEmbeddedServerFactory() {} * Constructor used in unit tests to inject a mocked embedded server * @param server The mocked server */ - @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") // suppressing the warining as this constructor is only used for unit tests + @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") // suppressing the warning as this constructor is only used for unit tests public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { LambdaEmbeddedServerFactory.embeddedServer = server; } From 123e3b48b39a914b50d383b4b3795cbf700ad145 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 19 Dec 2018 22:23:22 -0800 Subject: [PATCH 0226/1214] Bump in slf4j version and temporary exclusion to fix build --- aws-serverless-java-container-struts2/pom.xml | 6 ++++++ owasp-suppression.xml | 5 +++++ pom.xml | 4 ++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 1e916d0b..976d8b17 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -71,6 +71,12 @@ org.apache.logging.log4j log4j-to-slf4j 2.10.0 + + + org.slf4j + slf4j-api + + diff --git a/owasp-suppression.xml b/owasp-suppression.xml index ad54a679..3cdb0372 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -28,4 +28,9 @@ cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ + + + cpe:/a:slf4j:slf4j:1.8.0.beta + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index cfd050b9..afc23e5a 100644 --- a/pom.xml +++ b/pom.xml @@ -58,14 +58,14 @@ org.slf4j slf4j-api - 1.7.25 + 1.8.0-beta2 org.slf4j slf4j-simple - 1.7.25 + 1.8.0-beta2 test From e8754bfb6a06e48ce4858eaa87a2452638eae71a Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 19 Dec 2018 22:26:58 -0800 Subject: [PATCH 0227/1214] Fixed issue with multipart uploads --- aws-serverless-java-container-core/pom.xml | 16 +++++++- .../servlet/AwsProxyHttpServletRequest.java | 13 ++----- .../internal/servlet/AwsProxyRequestPart.java | 7 ++-- .../testutils/AwsProxyRequestBuilder.java | 38 +++++++++++++++++++ .../proxy/spring/SpringAwsProxyTest.java | 14 +++++++ .../proxy/spring/echoapp/EchoResource.java | 20 ++++++++++ 6 files changed, 95 insertions(+), 13 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9747f28e..aab42c99 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -69,9 +69,23 @@ org.apache.httpcomponents httpmime - 4.5.3 + 4.5.6 + compile + + + + + org.apache.httpcomponents + httpclient + 4.5.6 test + + org.apache.httpcomponents + httpcore + 4.4.10 + compile + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 303ac218..a740e92c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -699,6 +699,7 @@ private Map getMultipartFormParametersMap() { multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); + try { List items = upload.parseRequest(this); for (FileItem item : items) { @@ -708,15 +709,9 @@ private Map getMultipartFormParametersMap() { newPart.setSubmittedFileName(item.getFieldName()); newPart.setContentType(item.getContentType()); newPart.setSize(item.getSize()); - - Iterator headerNamesIterator = item.getHeaders().getHeaderNames(); - while (headerNamesIterator.hasNext()) { - String headerName = headerNamesIterator.next(); - Iterator headerValuesIterator = item.getHeaders().getHeaders(headerName); - while (headerValuesIterator.hasNext()) { - newPart.addHeader(headerName, headerValuesIterator.next()); - } - } + item.getHeaders().getHeaderNames().forEachRemaining(h -> { + newPart.addHeader(h, item.getHeaders().getHeader(h)); + }); multipartFormParameters.put(item.getFieldName(), newPart); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java index ff46314c..a8c6a7c6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -37,7 +38,7 @@ public class AwsProxyRequestPart private String submittedFileName; private long size; private String contentType; - private MultivaluedHashMap headers; + private MultiValuedTreeMap headers; private byte[] content; @@ -137,7 +138,7 @@ public Collection getHeaderNames() { public void addHeader(String key, String value) { if (headers == null) { - headers = new MultivaluedHashMap<>(); + headers = new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER); } if (headers.containsKey(key)) { @@ -172,7 +173,7 @@ public void setContentType(String contentType) { } - public void setHeaders(MultivaluedHashMap headers) { + public void setHeaders(MultiValuedTreeMap headers) { this.headers = headers; } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 01924c06..03c652a7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -24,6 +24,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.entity.mime.FormBodyPart; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.entity.mime.content.ByteArrayBody; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -49,6 +53,7 @@ public class AwsProxyRequestBuilder { //------------------------------------------------------------- private AwsProxyRequest request; + private MultipartEntityBuilder multipartBuilder; //------------------------------------------------------------- // Constructors @@ -123,6 +128,39 @@ public AwsProxyRequestBuilder form(String key, String value) { return this; } + public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, byte[] content) throws IOException { + if (multipartBuilder == null) { + multipartBuilder = MultipartEntityBuilder.create(); + } + multipartBuilder.addPart(fieldName, new ByteArrayBody(content, fileName)); + HttpEntity bodyEntity = multipartBuilder.build(); + InputStream bodyStream = bodyEntity.getContent(); + byte[] buffer = new byte[bodyStream.available()]; + IOUtils.readFully(bodyStream, buffer); + request.setBody("\n\n" + new String(buffer, Charset.defaultCharset())); + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + } + request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue()); + if (bodyEntity.getContentEncoding() != null) { + request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_ENCODING, bodyEntity.getContentEncoding().getValue()); + } + request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + ""); + return this; + } + + public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) { + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + } + request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA); + if (multipartBuilder == null) { + multipartBuilder = MultipartEntityBuilder.create(); + } + // TODO: implement + return this; + } + public AwsProxyRequestBuilder header(String key, String value) { if (this.request.getMultiValueHeaders() == null) { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 379329d4..cfce6d38 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -363,6 +363,20 @@ public void contextPath_generateLink_returnsCorrectPath() { SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } + @Test + public void multipart_getFileName_rerutrnsCorrectFileName() + throws IOException { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/attachment", "POST") + .formFilePart("testFile", "myFile.txt", "hello".getBytes()) + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + System.out.println("Response: " + output.getBody()); + + assertEquals("testFile", output.getBody()); + } + private void validateMapResponseModel(AwsProxyResponse output) { try { MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 00b3360a..aeb00bf4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -5,14 +5,19 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartResolver; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.net.URI; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -33,6 +38,13 @@ public class EchoResource { public static final String TEST_GENERATE_URI = "test"; public static final String STRING_BODY = "Hello"; + @Bean + public MultipartResolver multipartResolver() { + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); + multipartResolver.setMaxUploadSize(1000000); + return multipartResolver; + } + @Autowired ServletContext servletContext; @@ -167,4 +179,12 @@ public ResponseEntity echoLastModified() { .lastModified(Instant.now().minus(1, ChronoUnit.DAYS).toEpochMilli()) .body(STRING_BODY); } + + @RequestMapping(path = "/attachment", method=RequestMethod.POST) + public ResponseEntity receiveFile(@RequestParam("testFile") MultipartFile file) throws IOException { + String fileName = file.getName(); + byte[] fileContents = file.getBytes(); + System.out.println("Content length: " + fileContents.length); + return ResponseEntity.ok(fileName); + } } From 9bf5e7a03decdab767369b1011c76bcc031a5393 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 19 Dec 2018 22:27:25 -0800 Subject: [PATCH 0228/1214] Removed unused imports --- .../proxy/spring/springbootapp/TestApplication.java | 4 ---- .../serverless/proxy/spring/springbootapp/TestController.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java index 2ebe5f03..d203a56e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java @@ -2,15 +2,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.filter.CharacterEncodingFilter; @SpringBootApplication @ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp") public class TestApplication extends SpringBootServletInitializer { - } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index 3a87b64a..e03ff434 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -4,20 +4,16 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import org.springframework.context.annotation.Configuration; -import org.springframework.http.MediaType; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.web.accept.ContentNegotiationStrategy; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; From 591e359b3c531a87bd95cda2cca34cdf9cb67916 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 19 Dec 2018 22:30:18 -0800 Subject: [PATCH 0229/1214] Move unused imports --- .../serverless/proxy/jersey/JerseyHandlerFilter.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 88fa48c2..cd6aa3e9 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -30,14 +30,12 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; -import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Locale; import java.util.concurrent.CountDownLatch; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; -import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY; @@ -166,7 +164,7 @@ private ContainerRequest servletRequestToContainerRequest(ServletRequest request } Enumeration headerNames = servletRequest.getHeaderNames(); - + while (headerNames.hasMoreElements()) { String headerKey = headerNames.nextElement(); requestContext.getHeaders().addAll(headerKey, Collections.list(servletRequest.getHeaders(headerKey))); From 2be72a587612b8099247092b9c99e85ff44787b6 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 08:18:34 -0800 Subject: [PATCH 0230/1214] Added tests for issue #217 --- .../proxy/spring/SpringAwsProxyTest.java | 18 ++++++++++++++++++ .../proxy/spring/echoapp/EchoResource.java | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index cfce6d38..e287aa95 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -129,6 +129,24 @@ public void queryString_listParameter_expectCorrectLength() { validateSingleValueModel(output, "3"); } + @Test + public void queryString_multiParam_expectCorrectValueCount() + throws IOException { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/multivalue-query-string", "GET") + .json() + .queryString("multiple", "first") + .queryString("multiple", "second") + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); + + assertEquals(2, response.getValues().size()); + assertTrue(response.getValues().containsKey("first")); + assertTrue(response.getValues().containsKey("second")); + } + @Test public void dateHeader_notModified_expect304() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index aeb00bf4..8aea30cc 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartResolver; @@ -80,6 +81,15 @@ public MapResponseModel echoQueryString(HttpServletRequest request, @RequestPara return queryStrings; } + @RequestMapping(path = "/multivalue-query-string", method = RequestMethod.GET) + public MapResponseModel countMultivalueQueryParams(@RequestParam MultiValueMap multipleParams) { + MapResponseModel out = new MapResponseModel(); + for (String v : multipleParams.get("multiple")) { + out.addValue(v, "ok"); + } + return out; + } + @RequestMapping(path = "/list-query-string", method = RequestMethod.GET) public SingleValueModel echoListQueryString(@RequestParam(value="list") List valueList) { SingleValueModel value = new SingleValueModel(); From 3d8b655c909f166113780ee2ca52bdfd2cbd99cf Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 08:40:28 -0800 Subject: [PATCH 0231/1214] Added proxiable property to ServletRequest, Context, and Response suppliers to allow injection in a request scope. Addresses issue #211 --- .../jersey/JerseyLambdaContainerHandler.java | 18 ++++++++++++--- .../proxy/jersey/EchoJerseyResource.java | 13 +++++++++++ .../proxy/jersey/JerseyAwsProxyTest.java | 15 +++++++++++++ .../providers/ServletRequestFilter.java | 22 +++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 54a4ac0c..576d2b66 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -137,9 +137,21 @@ public JerseyLambdaContainerHandler(Class requestTypeClass, ((ResourceConfig)jaxRsApplication).register(new AbstractBinder() { @Override protected void configure() { - bindFactory(AwsProxyServletContextSupplier.class).to(ServletContext.class).in(RequestScoped.class); - bindFactory(AwsProxyServletRequestSupplier.class).to(HttpServletRequest.class).in(RequestScoped.class); - bindFactory(AwsProxyServletResponseSupplier.class).to(HttpServletResponse.class).in(RequestScoped.class); + bindFactory(AwsProxyServletContextSupplier.class) + .proxy(true) + .proxyForSameScope(true) + .to(ServletContext.class) + .in(RequestScoped.class); + bindFactory(AwsProxyServletRequestSupplier.class) + .proxy(true) + .proxyForSameScope(true) + .to(HttpServletRequest.class) + .in(RequestScoped.class); + bindFactory(AwsProxyServletResponseSupplier.class) + .proxy(true) + .proxyForSameScope(true) + .to(HttpServletResponse.class) + .in(RequestScoped.class); } }); } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 1b25bd92..4381e8d0 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.jersey; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; @@ -54,6 +55,18 @@ public SingleValueModel echoDecodedParam(@QueryParam("param") String param) { return model; } + @Path("/filter-attribute") @GET + @Produces(MediaType.APPLICATION_JSON) + public SingleValueModel returnFilterAttribute(@Context HttpServletRequest req) { + SingleValueModel model = new SingleValueModel(); + if (req.getAttribute(ServletRequestFilter.FILTER_ATTRIBUTE_NAME) == null) { + model.setValue(""); + } else { + model.setValue(req.getAttribute(ServletRequestFilter.FILTER_ATTRIBUTE_NAME).toString()); + } + return model; + } + @Path("/list-query-string") @GET @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoQueryStringLength(@QueryParam("list") List param) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 3187797f..7d459359 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -14,6 +14,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -52,6 +53,7 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") .register(LoggingFeature.class) + .register(ServletRequestFilter.class) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); @@ -122,6 +124,19 @@ public void requestScheme_valid_expectHttps() { validateSingleValueModel(output, "https"); } + @Test + public void requestFilter_injectsServletRequest_expectCustomAttribute() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/filter-attribute", "GET") + .json() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + + validateSingleValueModel(output, ServletRequestFilter.FILTER_ATTRIBUTE_VALUE); + } + @Test public void authorizer_securityContext_customPrincipalSuccess() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java new file mode 100644 index 00000000..70d65a64 --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java @@ -0,0 +1,22 @@ +package com.amazonaws.serverless.proxy.jersey.providers; + + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.core.Context; + +import java.io.IOException; + + +public class ServletRequestFilter implements ContainerRequestFilter { + public static final String FILTER_ATTRIBUTE_NAME = "ServletFilter"; + public static final String FILTER_ATTRIBUTE_VALUE = "done"; + + @Context HttpServletRequest request; + + public void filter(ContainerRequestContext ctx) throws IOException { + request.setAttribute(FILTER_ATTRIBUTE_NAME, FILTER_ATTRIBUTE_VALUE); + } + +} \ No newline at end of file From d3cc501966e2d9e4c5b5c6c3523957707a3c7407 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 13:03:08 -0800 Subject: [PATCH 0232/1214] Experimental ALB support to address issue #214 --- .../serverless/proxy/RequestReader.java | 5 ++ .../jaxrs/AwsProxySecurityContext.java | 46 +++++++++++++++---- .../ApacheCombinedServletLogFormatter.java | 9 ++-- .../servlet/AwsHttpServletRequest.java | 8 +--- .../servlet/AwsHttpServletResponse.java | 8 ++++ .../servlet/AwsProxyHttpServletRequest.java | 16 ++++--- .../AwsProxyHttpServletRequestReader.java | 2 + .../AwsProxyHttpServletResponseWriter.java | 12 +++++ .../testutils/AwsProxyRequestBuilder.java | 22 +++++---- .../serverless/proxy/model/AlbContext.java | 19 ++++++++ .../proxy/model/AwsProxyRequest.java | 19 ++++++-- ...ntext.java => AwsProxyRequestContext.java} | 14 +++++- .../proxy/model/AwsProxyResponse.java | 31 +++++++++++++ .../proxy/jersey/EchoJerseyResource.java | 16 +++---- .../proxy/jersey/JerseyAwsProxyTest.java | 17 +++++++ .../proxy/spring/echoapp/EchoResource.java | 8 ++-- .../echoapp/EchoRequestInfoAction.java | 8 ++-- .../spark/filter/CognitoIdentityFilter.java | 6 +-- 18 files changed, 209 insertions(+), 57 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java rename aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/{ApiGatewayRequestContext.java => AwsProxyRequestContext.java} (95%) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index 9a812f32..274a8972 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -45,6 +45,11 @@ public abstract class RequestReader { */ public static final String API_GATEWAY_STAGE_VARS_PROPERTY = "com.amazonaws.apigateway.stage.variables"; + /** + * The key for the ALB context property in the PropertiesDelegate object + */ + public static final String ALB_CONTEXT_PROPERTY = "com.amazonaws.alb.request.context"; + /** * The key to store the entire API Gateway event */ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 5d91e142..3d7f3fc2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -12,12 +12,23 @@ */ package com.amazonaws.serverless.proxy.internal.jaxrs; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.core.type.TypeReference; + import javax.ws.rs.core.SecurityContext; + +import java.io.IOException; import java.security.Principal; +import java.util.Base64; +import java.util.Map; + +import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.*; +import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.RequestSource.API_GATEWAY; + /** * default implementation of the SecurityContext object. This class supports 3 API Gateway's authorization methods: @@ -38,6 +49,9 @@ public class AwsProxySecurityContext private static final String AUTH_SCHEME_COGNITO_POOL = "COGNITO_USER_POOL"; private static final String AUTH_SCHEME_AWS_IAM = "AWS_IAM"; + private static final String ALB_ACESS_TOKEN_HEADER = "x-amzn-oidc-accesstoken"; + private static final String ALB_IDENTITY_HEADER = "x-amzn-oidc-identity"; + //------------------------------------------------------------- // Variables - Private @@ -78,7 +92,12 @@ public Principal getUserPrincipal() { if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM) || getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { return () -> { if (getAuthenticationScheme().equals(AUTH_SCHEME_CUSTOM)) { - return event.getRequestContext().getAuthorizer().getPrincipalId(); + switch (event.getRequestSource()) { + case API_GATEWAY: + return event.getRequestContext().getAuthorizer().getPrincipalId(); + case ALB: + return event.getMultiValueHeaders().getFirst(ALB_IDENTITY_HEADER); + } } else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { // if we received credentials from Cognito Federated Identities then we return the identity id if (event.getRequestContext().getIdentity().getCognitoIdentityId() != null) { @@ -112,15 +131,24 @@ public boolean isSecure() { public String getAuthenticationScheme() { - if (event.getRequestContext().getAuthorizer() != null && event.getRequestContext().getAuthorizer().getClaims() != null && event.getRequestContext().getAuthorizer().getClaims().getSubject() != null) { - return AUTH_SCHEME_COGNITO_POOL; - } else if (event.getRequestContext().getAuthorizer() != null) { - return AUTH_SCHEME_CUSTOM; - } else if (event.getRequestContext().getIdentity().getAccessKey() != null) { - return AUTH_SCHEME_AWS_IAM; - } else { - return null; + switch (event.getRequestSource()) { + case API_GATEWAY: + if (event.getRequestContext().getAuthorizer() != null && event.getRequestContext().getAuthorizer().getClaims() != null + && event.getRequestContext().getAuthorizer().getClaims().getSubject() != null) { + return AUTH_SCHEME_COGNITO_POOL; + } else if (event.getRequestContext().getAuthorizer() != null) { + return AUTH_SCHEME_CUSTOM; + } else if (event.getRequestContext().getIdentity().getAccessKey() != null) { + return AUTH_SCHEME_AWS_IAM; + } else { + return null; + } + case ALB: + if (event.getMultiValueHeaders().containsKey(ALB_ACESS_TOKEN_HEADER)) { + return AUTH_SCHEME_CUSTOM; + } } + return null; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index b094d539..def4ecdf 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -2,7 +2,8 @@ import com.amazonaws.serverless.proxy.LogFormatter; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -19,6 +20,7 @@ import java.util.Locale; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static java.time.temporal.ChronoField.DAY_OF_MONTH; import static java.time.temporal.ChronoField.HOUR_OF_DAY; import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; @@ -64,14 +66,15 @@ public ApacheCombinedServletLogFormatter() { public String format(ContainerRequestType servletRequest, ContainerResponseType servletResponse, SecurityContext ctx) { //LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined StringBuilder logLineBuilder = new StringBuilder(); - ApiGatewayRequestContext gatewayContext = (ApiGatewayRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY); + AwsProxyRequest req = (AwsProxyRequest)servletRequest.getAttribute(API_GATEWAY_EVENT_PROPERTY); + AwsProxyRequestContext gatewayContext = req.getRequestContext(); // %h logLineBuilder.append(servletRequest.getRemoteAddr()); logLineBuilder.append(" "); // %l - if (gatewayContext != null) { + if (gatewayContext != null && req.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { if (gatewayContext.getIdentity().getUserArn() != null) { logLineBuilder.append(gatewayContext.getIdentity().getUserArn()); } else { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 5a7174f3..d1f4cfeb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -14,12 +14,11 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.internal.SecurityUtils; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,16 +33,13 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.time.format.DateTimeFormatter; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** @@ -116,7 +112,7 @@ public String getRequestedSessionId() { public HttpSession getSession(boolean b) { log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session"); if (b && null == this.session) { - ApiGatewayRequestContext requestContext = (ApiGatewayRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + AwsProxyRequestContext requestContext = (AwsProxyRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); this.session = new AwsHttpSession(requestContext.getRequestId()); } return this.session; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 9ae65c28..58ea102a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -13,6 +13,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -33,6 +34,9 @@ import java.util.*; import java.util.concurrent.CountDownLatch; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; + + /** * Basic implementation of the HttpServletResponse object. This is used by the AwsProxyHttpServletResponseWriter * to generate an AwsProxyResponse object. We have an additional getAwsResponseHeaders() method @@ -443,6 +447,10 @@ MultiValuedTreeMap getAwsResponseHeaders() { return headers; } + AwsProxyRequest getAwsProxyRequest() { + return (AwsProxyRequest)request.getAttribute(API_GATEWAY_EVENT_PROPERTY); + } + //------------------------------------------------------------- // Methods - Private diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 84443519..bd1650ba 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -800,13 +800,15 @@ private List getHeaderValues(String key) { // special cases for referer and user agent headers List values = new ArrayList<>(); - if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { - values.add(request.getRequestContext().getIdentity().getCaller()); - return values; - } - if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) { - values.add(request.getRequestContext().getIdentity().getUserAgent()); - return values; + if (request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { + values.add(request.getRequestContext().getIdentity().getCaller()); + return values; + } + if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) { + values.add(request.getRequestContext().getIdentity().getUserAgent()); + return values; + } } if (request.getMultiValueHeaders() == null) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 6cba61f7..c8555a4c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -35,6 +35,7 @@ public class AwsProxyHttpServletRequestReader extends RequestReaderAwsProxyResponse object given an AwsHttpServletResponse object. If the @@ -53,6 +61,10 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, awsProxyResponse.setStatusCode(containerResponse.getStatus()); + if (containerResponse.getAwsProxyRequest().getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + awsProxyResponse.setStatusDescription(containerResponse.getStatus() + " " + Response.Status.fromStatusCode(containerResponse.getStatus()).getReasonPhrase()); + } + Timer.stop("SERVLET_RESPONSE_WRITE"); return awsProxyResponse; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 03c652a7..8aed3804 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -13,19 +13,18 @@ package com.amazonaws.serverless.proxy.internal.testutils; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AlbContext; import com.amazonaws.serverless.proxy.model.ApiGatewayAuthorizerContext; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; -import org.apache.http.entity.mime.FormBodyPart; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.ByteArrayBody; @@ -39,7 +38,6 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; -import java.util.HashMap; import java.util.UUID; @@ -70,13 +68,12 @@ public AwsProxyRequestBuilder(String path) { public AwsProxyRequestBuilder(String path, String httpMethod) { - this.request = new AwsProxyRequest(); this.request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); // avoid NPE this.request.setHttpMethod(httpMethod); this.request.setPath(path); this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); - this.request.setRequestContext(new ApiGatewayRequestContext()); + this.request.setRequestContext(new AwsProxyRequestContext()); this.request.getRequestContext().setRequestId(UUID.randomUUID().toString()); this.request.getRequestContext().setExtendedRequestId(UUID.randomUUID().toString()); this.request.getRequestContext().setStage("test"); @@ -92,6 +89,15 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { // Methods - Public //------------------------------------------------------------- + public AwsProxyRequestBuilder alb() { + this.request.setRequestContext(new AwsProxyRequestContext()); + this.request.getRequestContext().setElb(new AlbContext()); + this.request.getRequestContext().getElb().setTargetGroupArn( + "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-target/d6190d154bc908a5" + ); + return this; + } + public AwsProxyRequestBuilder stage(String stageName) { this.request.getRequestContext().setStage(stageName); return this; @@ -294,7 +300,7 @@ public AwsProxyRequestBuilder serverName(String serverName) { public AwsProxyRequestBuilder userAgent(String agent) { if (request.getRequestContext() == null) { - request.setRequestContext(new ApiGatewayRequestContext()); + request.setRequestContext(new AwsProxyRequestContext()); } if (request.getRequestContext().getIdentity() == null) { request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity()); @@ -306,7 +312,7 @@ public AwsProxyRequestBuilder userAgent(String agent) { public AwsProxyRequestBuilder referer(String referer) { if (request.getRequestContext() == null) { - request.setRequestContext(new ApiGatewayRequestContext()); + request.setRequestContext(new AwsProxyRequestContext()); } if (request.getRequestContext().getIdentity() == null) { request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity()); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java new file mode 100644 index 00000000..1965231b --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java @@ -0,0 +1,19 @@ +package com.amazonaws.serverless.proxy.model; + + +/*** + * Context passed by ALB proxy events + */ +public class AlbContext { + private String targetGroupArn; + + + public String getTargetGroupArn() { + return targetGroupArn; + } + + + public void setTargetGroupArn(String targetGroupArn) { + this.targetGroupArn = targetGroupArn; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index 61aa7876..d738b5ac 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -30,7 +30,7 @@ public class AwsProxyRequest { private String body; private String resource; - private ApiGatewayRequestContext requestContext; + private AwsProxyRequestContext requestContext; private MultiValuedTreeMap multiValueQueryStringParameters; private MultiValuedTreeMap multiValueHeaders; private Map pathParameters; @@ -70,6 +70,14 @@ public String getQueryString() { return params.toString(); } + public RequestSource getRequestSource() { + if (getRequestContext() != null && getRequestContext().getElb() != null) { + return RequestSource.ALB; + } + + return RequestSource.API_GATEWAY; + } + public String getBody() { return body; @@ -91,12 +99,12 @@ public void setResource(String resource) { } - public ApiGatewayRequestContext getRequestContext() { + public AwsProxyRequestContext getRequestContext() { return requestContext; } - public void setRequestContext(ApiGatewayRequestContext requestContext) { + public void setRequestContext(AwsProxyRequestContext requestContext) { this.requestContext = requestContext; } @@ -168,4 +176,9 @@ public boolean isBase64Encoded() { public void setIsBase64Encoded(boolean base64Encoded) { isBase64Encoded = base64Encoded; } + + public static enum RequestSource { + ALB, + API_GATEWAY + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestContext.java similarity index 95% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java rename to aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestContext.java index 37a18822..e7cb1bf6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestContext.java @@ -27,7 +27,7 @@ * @see RequestReader */ @JsonIgnoreProperties(ignoreUnknown = true) -public class ApiGatewayRequestContext { +public class AwsProxyRequestContext { //------------------------------------------------------------- // Variables - Private @@ -48,6 +48,8 @@ public class ApiGatewayRequestContext { private String requestTime; private long requestTimeEpoch; + private AlbContext elb; + //------------------------------------------------------------- // Methods - Getter/Setter @@ -190,4 +192,14 @@ public long getRequestTimeEpoch() { public void setRequestTimeEpoch(long requestTimeEpoch) { this.requestTimeEpoch = requestTimeEpoch; } + + + public AlbContext getElb() { + return elb; + } + + + public void setElb(AlbContext elb) { + this.elb = elb; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java index f2e3a63a..f8c8ca8a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyResponse.java @@ -12,9 +12,17 @@ */ package com.amazonaws.serverless.proxy.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; + + /** * Response object for an API Gateway method using AWS_PROXY integrations */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class AwsProxyResponse { //------------------------------------------------------------- @@ -22,6 +30,8 @@ public class AwsProxyResponse { //------------------------------------------------------------- private int statusCode; + private String statusDescription; + private Map headers; private MultiValuedTreeMap multiValueHeaders; private String body; private boolean isBase64Encoded; @@ -80,6 +90,16 @@ public void setStatusCode(int statusCode) { } + public Map getHeaders() { + return headers; + } + + + public void setHeaders(Map headers) { + this.headers = headers; + } + + public MultiValuedTreeMap getMultiValueHeaders() { return multiValueHeaders; } @@ -99,6 +119,7 @@ public void setBody(String body) { this.body = body; } + @JsonProperty("isBase64Encoded") public boolean isBase64Encoded() { return isBase64Encoded; } @@ -106,4 +127,14 @@ public boolean isBase64Encoded() { public void setBase64Encoded(boolean base64Encoded) { isBase64Encoded = base64Encoded; } + + + public String getStatusDescription() { + return statusDescription; + } + + + public void setStatusDescription(String statusDescription) { + this.statusDescription = statusDescription; + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 4381e8d0..db552d71 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -14,12 +14,10 @@ import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; -import org.glassfish.jersey.server.ContainerRequest; - import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -150,9 +148,9 @@ public SingleValueModel echoRequestScheme(@Context UriInfo context) { @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoAuthorizerPrincipal(@Context ContainerRequestContext context) { SingleValueModel valueModel = new SingleValueModel(); - ApiGatewayRequestContext apiGatewayRequestContext = - (ApiGatewayRequestContext) context.getProperty(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - valueModel.setValue(apiGatewayRequestContext.getAuthorizer().getPrincipalId()); + AwsProxyRequestContext awsProxyRequestContext = + (AwsProxyRequestContext) context.getProperty(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + valueModel.setValue(awsProxyRequestContext.getAuthorizer().getPrincipalId()); return valueModel; } @@ -161,9 +159,9 @@ public SingleValueModel echoAuthorizerPrincipal(@Context ContainerRequestContext @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoAuthorizerContext(@Context ContainerRequestContext context, @QueryParam("key") String key) { SingleValueModel valueModel = new SingleValueModel(); - ApiGatewayRequestContext apiGatewayRequestContext = - (ApiGatewayRequestContext) context.getProperty(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - valueModel.setValue(apiGatewayRequestContext.getAuthorizer().getContextValue(key)); + AwsProxyRequestContext awsProxyRequestContext = + (AwsProxyRequestContext) context.getProperty(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + valueModel.setValue(awsProxyRequestContext.getAuthorizer().getContextValue(key)); return valueModel; } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 7d459359..bf426715 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -59,6 +59,23 @@ public class JerseyAwsProxyTest { private static Context lambdaContext = new MockLambdaContext(); + @Test + public void alb_basicRequest_expectSuccess() { + AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .alb() + .build(); + + AwsProxyResponse output = handler.proxy(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + assertNotNull(output.getStatusDescription()); + System.out.println(output.getStatusDescription()); + + validateMapResponseModel(output); + } + @Test public void headers_getHeaders_echo() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 8aea30cc..1487297d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.spring.echoapp; import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import org.springframework.beans.factory.annotation.Autowired; @@ -100,9 +100,9 @@ public SingleValueModel echoListQueryString(@RequestParam(value="list") List Date: Thu, 20 Dec 2018 14:00:22 -0800 Subject: [PATCH 0233/1214] Updated samples to reflect the changes in the ALB support issue (#214) --- .../sample/spring/filter/CognitoIdentityFilter.java | 7 +++---- .../sample/springboot/filter/CognitoIdentityFilter.java | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java index 03793dc8..d9eefdc9 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java @@ -2,7 +2,7 @@ import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +13,6 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -43,12 +42,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo log.warn("API Gateway context is null"); filterChain.doFilter(servletRequest, servletResponse); } - if (!ApiGatewayRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { log.warn("API Gateway context object is not of valid type"); filterChain.doFilter(servletRequest, servletResponse); } - ApiGatewayRequestContext ctx = (ApiGatewayRequestContext)apiGwContext; + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; if (ctx.getIdentity() == null) { log.warn("Identity context is null"); filterChain.doFilter(servletRequest, servletResponse); diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java index cdf8e31e..025f565d 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java @@ -2,7 +2,7 @@ import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +20,7 @@ /** * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.spring.StreamLambdaHandler} class. + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot.StreamLambdaHandler} class. */ public class CognitoIdentityFilter implements Filter { public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; @@ -42,12 +42,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo log.warn("API Gateway context is null"); filterChain.doFilter(servletRequest, servletResponse); } - if (!ApiGatewayRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { log.warn("API Gateway context object is not of valid type"); filterChain.doFilter(servletRequest, servletResponse); } - ApiGatewayRequestContext ctx = (ApiGatewayRequestContext)apiGwContext; + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; if (ctx.getIdentity() == null) { log.warn("Identity context is null"); filterChain.doFilter(servletRequest, servletResponse); From 3b40604d29f0b40dab620e5ef46298b1135d8b30 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 14:00:37 -0800 Subject: [PATCH 0234/1214] Added SpringBoot 2 sample to address issue #181 --- samples/springboot2/pet-store/README.md | 62 ++++++++++ samples/springboot2/pet-store/pom.xml | 69 +++++++++++ samples/springboot2/pet-store/sam.yaml | 32 +++++ .../sample/springboot2/Application.java | 49 ++++++++ .../springboot2/StreamLambdaHandler.java | 50 ++++++++ .../controller/PetsController.java | 77 ++++++++++++ .../filter/CognitoIdentityFilter.java | 68 ++++++++++ .../sample/springboot2/model/Error.java | 29 +++++ .../sample/springboot2/model/Pet.java | 55 ++++++++ .../sample/springboot2/model/PetData.java | 117 ++++++++++++++++++ .../pet-store/src/main/resources/logback.xml | 5 + 11 files changed, 613 insertions(+) create mode 100644 samples/springboot2/pet-store/README.md create mode 100644 samples/springboot2/pet-store/pom.xml create mode 100644 samples/springboot2/pet-store/sam.yaml create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java create mode 100644 samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java create mode 100644 samples/springboot2/pet-store/src/main/resources/logback.xml diff --git a/samples/springboot2/pet-store/README.md b/samples/springboot2/pet-store/README.md new file mode 100644 index 00000000..5f8edb68 --- /dev/null +++ b/samples/springboot2/pet-store/README.md @@ -0,0 +1,62 @@ +# Serverless Spring Boot 2 example +A basic pet store written with the [Spring Boot 2 framework](https://projects.spring.io/spring-boot/). The `LambdaHandler` object is the main entry point for Lambda. + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition + +## Installation +To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. + +In a shell, navigate to the sample's folder and use maven to build a deployable jar. +``` +$ mvn package +``` + +This command should generate a `serverless-spring-boot-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringBootSample --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SpringBootPetStoreApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringBootSample +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "OutputKey": "SpringBootPetStoreApi", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "JerseySample", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser to test a first request. diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml new file mode 100644 index 00000000..92768453 --- /dev/null +++ b/samples/springboot2/pet-store/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-springboot2-example + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + + 1.8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + com.amazonaws.serverless + aws-serverless-java-container-spring + [0.1,) + + + + + io.symphonia + lambda-logging + 1.0.1 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + \ No newline at end of file diff --git a/samples/springboot2/pet-store/sam.yaml b/samples/springboot2/pet-store/sam.yaml new file mode 100644 index 00000000..2e4a7183 --- /dev/null +++ b/samples/springboot2/pet-store/sam.yaml @@ -0,0 +1,32 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT.jar + MemorySize: 1512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 60 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Export: + Name: SpringBootPetStoreApi diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java new file mode 100644 index 00000000..e49b1f6d --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.sample.springboot2; + +import com.amazonaws.serverless.sample.springboot2.controller.PetsController; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application extends SpringBootServletInitializer { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java new file mode 100644 index 00000000..cecee6db --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.sample.springboot2; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.sample.springboot2.filter.CognitoIdentityFilter; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.EnumSet; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + }); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java new file mode 100644 index 00000000..bbf69b08 --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot2.controller; + + + +import com.amazonaws.serverless.sample.springboot2.model.Pet; +import com.amazonaws.serverless.sample.springboot2.model.PetData; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet listPets() { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..3097bb80 --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java @@ -0,0 +1,68 @@ +package com.amazonaws.serverless.sample.springboot2.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java new file mode 100644 index 00000000..a2278ed0 --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot2.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java new file mode 100644 index 00000000..ee9a1e02 --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot2.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java new file mode 100644 index 00000000..34a32421 --- /dev/null +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot2.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot2/pet-store/src/main/resources/logback.xml b/samples/springboot2/pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..14a3a84f --- /dev/null +++ b/samples/springboot2/pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 59cae60a2f24e47a926ad0d48e999304848958d5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 14:23:56 -0800 Subject: [PATCH 0235/1214] Addded SpringBoot 2 archetype to close #181 --- aws-serverless-springboot2-archetype/pom.xml | 78 +++++++++++ .../META-INF/maven/archetype-metadata.xml | 32 +++++ .../resources/archetype-resources/README.md | 129 ++++++++++++++++++ .../resources/archetype-resources/pom.xml | 73 ++++++++++ .../resources/archetype-resources/sam.yaml | 52 +++++++ .../src/main/java/Application.java | 52 +++++++ .../src/main/java/StreamLambdaHandler.java | 33 +++++ .../main/java/controller/PingController.java | 20 +++ .../src/main/resources/application.properties | 3 + .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++++ .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + pom.xml | 1 + 13 files changed, 567 insertions(+) create mode 100644 aws-serverless-springboot2-archetype/pom.xml create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java create mode 100644 aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml new file mode 100644 index 00000000..1fe2e126 --- /dev/null +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -0,0 +1,78 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.3-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-springboot2-archetype + 1.3-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + src/main/resources + true + + archetype-resources/pom.xml + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + integration-test + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..065bd97a --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,32 @@ + + + + src/main/java + + **/*.java + + + + src/main/resources + + **/*.properties + + + + src/test/java + + **/*.java + + + + + + sam.yaml + README.md + + + + \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..4b646a46 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md @@ -0,0 +1,129 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# ${artifactId} serverless API +The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). + +## Building the project +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. + +```bash +$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false +$ cd my-spring-api +$ mvn clean package + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD SUCCESS +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 6.546 s +[INFO] Finished at: 2018-02-15T08:39:33-08:00 +[INFO] Final Memory: XXM/XXXM +[INFO] ------------------------------------------------------------------------ +``` + +## Testing locally with SAM local +You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. + +First, install SAM local: + +```bash +$ npm install -g aws-sam-local +``` + +Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. + +```bash +$ sam local start-api --template sam.yaml + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +## Deploying to AWS +You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. + +You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: + +``` +$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket +Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) +Successfully packaged artifacts and wrote output template to file output-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +``` + +As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. + +``` +$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +``` + +Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: + +``` +$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi +{ + "Stacks": [ + { + "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", + "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", + "Tags": [], + "Outputs": [ + { + "Description": "URL for application", + "ExportName": "${resourceName}Api", + "OutputKey": "${resourceName}Api", + "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" + } + ], + "CreationTime": "2016-12-13T22:59:31.552Z", + "Capabilities": [ + "CAPABILITY_IAM" + ], + "StackName": "ServerlessSpringApi", + "NotificationARNs": [], + "StackStatus": "UPDATE_COMPLETE" + } + ] +} + +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..325e9665 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + \${groupId} + \${artifactId} + \${version} + jar + + Serverless Spring Boot 2 API + https://github.com/awslabs/aws-serverless-java-container + + + org.springframework.boot + spring-boot-starter-parent + 2.1.1.RELEASE + + + + 1.8 + 1.8 + + + + + com.amazonaws.serverless + aws-serverless-java-container-spring + ${project.version} + + + + org.springframework.boot + spring-boot-starter-web + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml new file mode 100644 index 00000000..2f208f55 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml @@ -0,0 +1,52 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spring Boot 2 API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java8 + CodeUri: target/${artifactId}-${version}.jar + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java new file mode 100644 index 00000000..7351392f --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java @@ -0,0 +1,52 @@ +#macro(loggingOff) + logging.level.root:OFF +#end +#set($logging = "#loggingOff()") +#set($logging = $logging.replaceAll("\n", "").trim()) +package ${groupId}; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import ${groupId}.controller.PingController; + + +@SpringBootApplication +// We use direct @Import instead of @ComponentScan to speed up cold starts +// @ComponentScan(basePackages = "${groupId}.controller") +@Import({ PingController.class }) +public class Application extends SpringBootServletInitializer { + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..e022540c --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,33 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java new file mode 100644 index 00000000..94f517f0 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java @@ -0,0 +1,20 @@ +package ${groupId}.controller; + + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@EnableWebMvc +public class PingController { + @RequestMapping(path = "/ping", method = RequestMethod.GET) + public Map ping() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return pong; + } +} diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties new file mode 100644 index 00000000..ec1cb979 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# Reduce logging level to make sure the application works with SAM local +# https://github.com/awslabs/aws-serverless-java-container/issues/134 +logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..3f232ebc --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..7df3bf6e --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=springboot-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/pom.xml b/pom.xml index afc23e5a..65bc1933 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ aws-serverless-spark-archetype aws-serverless-spring-archetype aws-serverless-springboot-archetype + aws-serverless-springboot2-archetype From b37433ae4ba9929120c503c2c96b89da4e6e33b8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Dec 2018 20:45:16 -0800 Subject: [PATCH 0236/1214] Added Gradle build to samples as requested in #212 --- .gitignore | 2 ++ samples/jersey/pet-store/build.gradle | 35 ++++++++++++++++++++++ samples/spark/pet-store/build.gradle | 32 ++++++++++++++++++++ samples/spring/pet-store/build.gradle | 29 ++++++++++++++++++ samples/springboot/pet-store/build.gradle | 31 +++++++++++++++++++ samples/springboot2/pet-store/build.gradle | 31 +++++++++++++++++++ samples/struts/pet-store/build.gradle | 33 ++++++++++++++++++++ 7 files changed, 193 insertions(+) create mode 100644 samples/jersey/pet-store/build.gradle create mode 100644 samples/spark/pet-store/build.gradle create mode 100644 samples/spring/pet-store/build.gradle create mode 100644 samples/springboot/pet-store/build.gradle create mode 100644 samples/springboot2/pet-store/build.gradle create mode 100644 samples/struts/pet-store/build.gradle diff --git a/.gitignore b/.gitignore index c79f7d61..a77c6956 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties +.gradle/ +build/ # Exclude maven wrapper !/.mvn/wrapper/maven-wrapper.jar diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle new file mode 100644 index 00000000..790a3fcb --- /dev/null +++ b/samples/jersey/pet-store/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.amazonaws:aws-lambda-java-core:1.2.0', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'io.symphonia:lambda-logging:1.0.1' + ) + + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.27") { + exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" + exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" + exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" + } + + compile("org.glassfish.jersey.inject:jersey-hk2:2.27") { + exclude group: 'javax.inject', module: "javax.inject" + } +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from configurations.compileClasspath + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle new file mode 100644 index 00000000..8a7b06b6 --- /dev/null +++ b/samples/spark/pet-store/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.sparkjava:spark-core:2.8.0', + 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'io.symphonia:lambda-logging:1.0.1' + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'jetty-http*' + exclude 'jetty-client*' + exclude 'jetty-webapp*' + exclude 'jetty-xml*' + exclude 'jetty-io*' + exclude 'websocket*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle new file mode 100644 index 00000000..8bf70780 --- /dev/null +++ b/samples/spring/pet-store/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework:spring-webmvc:5.1.1.RELEASE', + 'org.springframework:spring-context:5.1.1.RELEASE', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'org.apache.logging.log4j:log4j-core:2.8.2', + 'org.apache.logging.log4j:log4j-api:2.8.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/springboot/pet-store/build.gradle b/samples/springboot/pet-store/build.gradle new file mode 100644 index 00000000..d86874e7 --- /dev/null +++ b/samples/springboot/pet-store/build.gradle @@ -0,0 +1,31 @@ +plugins { + id 'org.springframework.boot' version '1.5.17.RELEASE' +} +apply plugin: 'java' + +repositories { + jcenter() + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework.boot:spring-boot-starter-web', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'io.symphonia:lambda-logging:1.0.1' + ) + testCompile("junit:junit") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle new file mode 100644 index 00000000..2d01e2f3 --- /dev/null +++ b/samples/springboot2/pet-store/build.gradle @@ -0,0 +1,31 @@ +plugins { + id 'org.springframework.boot' version '2.1.1.RELEASE' +} +apply plugin: 'java' + +repositories { + jcenter() + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'io.symphonia:lambda-logging:1.0.1' + ) + testCompile("junit:junit") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle new file mode 100644 index 00000000..e0fbffff --- /dev/null +++ b/samples/struts/pet-store/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', + 'org.apache.struts:struts2-convention-plugin:2.5.17', + 'org.apache.struts:struts2-rest-plugin:2.5.17', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.17', + 'org.apache.struts:struts2-junit-plugin:2.5.17', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', + 'org.hibernate:hibernate-validator:4.3.2.Final', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'org.apache.logging.log4j:log4j-core:2.8.2', + 'org.apache.logging.log4j:log4j-api:2.8.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) + } +} + +build.dependsOn buildZip \ No newline at end of file From 22edc6e65dcdefab46145f80c80dcb274b0eedd4 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 09:36:52 -0800 Subject: [PATCH 0237/1214] Switched samples to maven assembly plugin. Beginning to address #133 --- samples/jersey/pet-store/pom.xml | 109 +++++++++++--- samples/jersey/pet-store/sam.yaml | 2 +- samples/jersey/pet-store/src/assembly/bin.xml | 24 ++++ samples/spark/pet-store/pom.xml | 134 +++++++++++++----- samples/spark/pet-store/sam.yaml | 2 +- samples/spark/pet-store/src/assembly/bin.xml | 32 +++++ samples/spring/pet-store/pom.xml | 131 ++++++++++++----- samples/spring/pet-store/sam.yaml | 2 +- samples/spring/pet-store/src/assembly/bin.xml | 24 ++++ samples/springboot/pet-store/pom.xml | 117 +++++++++++---- samples/springboot/pet-store/sam.yaml | 2 +- .../springboot/pet-store/src/assembly/bin.xml | 27 ++++ samples/springboot2/pet-store/pom.xml | 118 +++++++++++---- samples/springboot2/pet-store/sam.yaml | 2 +- .../pet-store/src/assembly/bin.xml | 27 ++++ 15 files changed, 612 insertions(+), 141 deletions(-) create mode 100644 samples/jersey/pet-store/src/assembly/bin.xml create mode 100644 samples/spark/pet-store/src/assembly/bin.xml create mode 100644 samples/spring/pet-store/src/assembly/bin.xml create mode 100644 samples/springboot/pet-store/src/assembly/bin.xml create mode 100644 samples/springboot2/pet-store/src/assembly/bin.xml diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index aa4f0e80..45573ea8 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -84,29 +84,96 @@ io.symphonia lambda-logging - 1.0.1 + 1.0.3 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - - - - - - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + diff --git a/samples/jersey/pet-store/sam.yaml b/samples/jersey/pet-store/sam.yaml index dbac9bf8..7ca060da 100644 --- a/samples/jersey/pet-store/sam.yaml +++ b/samples/jersey/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.jersey.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-jersey-example-1.0-SNAPSHOT.jar + CodeUri: target/serverless-jersey-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 20 diff --git a/samples/jersey/pet-store/src/assembly/bin.xml b/samples/jersey/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1ffd82d1 --- /dev/null +++ b/samples/jersey/pet-store/src/assembly/bin.xml @@ -0,0 +1,24 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 9efd591c..a7902811 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -59,39 +59,107 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - - org.eclipse.jetty.websocket:* - org.eclipse.jetty:jetty-http - org.eclipse.jetty:jetty-client - org.eclipse.jetty:jetty-webapp - org.eclipse.jetty:jetty-xml - org.eclipse.jetty:jetty-io - - + false - - - - - + + + package + + shade + + + + + + org.eclipse.jetty.websocket:* + org.eclipse.jetty:jetty-http + org.eclipse.jetty:jetty-client + org.eclipse.jetty:jetty-webapp + org.eclipse.jetty:jetty-xml + org.eclipse.jetty:jetty-io + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + diff --git a/samples/spark/pet-store/sam.yaml b/samples/spark/pet-store/sam.yaml index eddfc9a2..b1608653 100644 --- a/samples/spark/pet-store/sam.yaml +++ b/samples/spark/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.spark.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spark-example-1.0-SNAPSHOT.jar + CodeUri: target/serverless-spark-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 20 diff --git a/samples/spark/pet-store/src/assembly/bin.xml b/samples/spark/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..fcb93503 --- /dev/null +++ b/samples/spark/pet-store/src/assembly/bin.xml @@ -0,0 +1,32 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + + websocket* + jetty-http* + jetty-client* + jetty-webapp* + jetty-xml* + jetty-io* + + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ebdc509a..1f60ce0b 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -101,36 +101,103 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - - package - - shade - - - false - - - - - - - - - - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - 2.8.1 - - - - - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + false + + + + + + + + + + com.github.edwgiz + maven-shade-plugin.log4j2-cachefile-transformer + 2.8.1 + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + diff --git a/samples/spring/pet-store/sam.yaml b/samples/spring/pet-store/sam.yaml index 1e08ef03..6a6f07e4 100644 --- a/samples/spring/pet-store/sam.yaml +++ b/samples/spring/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.spring.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spring-example-1.0-SNAPSHOT.jar + CodeUri: target/serverless-spring-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 diff --git a/samples/spring/pet-store/src/assembly/bin.xml b/samples/spring/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1ffd82d1 --- /dev/null +++ b/samples/spring/pet-store/src/assembly/bin.xml @@ -0,0 +1,24 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index a8522d0e..bcd839ef 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -38,32 +38,99 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - org.apache.tomcat.embed:* - - + false - - - - - + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + \ No newline at end of file diff --git a/samples/springboot/pet-store/sam.yaml b/samples/springboot/pet-store/sam.yaml index 2e4a7183..23e143a9 100644 --- a/samples/springboot/pet-store/sam.yaml +++ b/samples/springboot/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT.jar + CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 diff --git a/samples/springboot/pet-store/src/assembly/bin.xml b/samples/springboot/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/samples/springboot/pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 92768453..3357d782 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -38,32 +38,100 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - org.apache.tomcat.embed:* - - + false - - - - - + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + \ No newline at end of file diff --git a/samples/springboot2/pet-store/sam.yaml b/samples/springboot2/pet-store/sam.yaml index 2e4a7183..8fd903a5 100644 --- a/samples/springboot2/pet-store/sam.yaml +++ b/samples/springboot2/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT.jar + CodeUri: target/serverless-springboot2-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 diff --git a/samples/springboot2/pet-store/src/assembly/bin.xml b/samples/springboot2/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/samples/springboot2/pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file From 7aa9b06100d35bbec764b093f0c86285158abc21 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 13:20:33 -0800 Subject: [PATCH 0238/1214] Updated archetypes to use assembly plugin and added a gradle build file to each one, addressing both #212 and #133 --- .../META-INF/maven/archetype-metadata.xml | 7 + .../archetype-resources/build.gradle | 37 +++++ .../resources/archetype-resources/pom.xml | 108 +++++++++++--- .../resources/archetype-resources/sam.yaml | 2 +- .../archetype-resources/src/assembly/bin.xml | 24 ++++ .../META-INF/maven/archetype-metadata.xml | 7 + .../archetype-resources/build.gradle | 34 +++++ .../resources/archetype-resources/pom.xml | 134 +++++++++++++----- .../resources/archetype-resources/sam.yaml | 2 +- .../archetype-resources/src/assembly/bin.xml | 32 +++++ .../META-INF/maven/archetype-metadata.xml | 7 + .../archetype-resources/build.gradle | 31 ++++ .../resources/archetype-resources/pom.xml | 132 ++++++++++++----- .../resources/archetype-resources/sam.yaml | 2 +- .../archetype-resources/src/assembly/bin.xml | 24 ++++ .../META-INF/maven/archetype-metadata.xml | 7 + .../archetype-resources/build.gradle | 32 +++++ .../resources/archetype-resources/pom.xml | 118 +++++++++++---- .../resources/archetype-resources/sam.yaml | 2 +- .../archetype-resources/src/assembly/bin.xml | 27 ++++ .../META-INF/maven/archetype-metadata.xml | 7 + .../archetype-resources/build.gradle | 32 +++++ .../resources/archetype-resources/pom.xml | 118 +++++++++++---- .../resources/archetype-resources/sam.yaml | 2 +- .../archetype-resources/src/assembly/bin.xml | 27 ++++ .../META-INF/maven/archetype-metadata.xml | 1 + .../archetype-resources/build.gradle | 35 +++++ samples/struts/pet-store/sam.yaml | 2 +- 28 files changed, 852 insertions(+), 141 deletions(-) create mode 100644 aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle diff --git a/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index c6728645..b934c4a4 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -15,11 +15,18 @@ **/*.java + + src/assembly + + * + + sam.yaml README.md + build.gradle diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..48b88094 --- /dev/null +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.amazonaws:aws-lambda-java-core:1.2.0', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'io.symphonia:lambda-logging:1.0.1' + ) + + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.27") { + exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" + exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" + exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" + } + + compile("org.glassfish.jersey.inject:jersey-hk2:2.27") { + exclude group: 'javax.inject', module: "javax.inject" + } + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from configurations.compileClasspath + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 3bb6feb8..1aa27d0e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,3 +1,4 @@ +#set($dollar = '$') 4.0.0 @@ -71,24 +72,91 @@ - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - - - - - - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + false + + + + package + + shade + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml index 3912003f..9df80ae8 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml @@ -33,7 +33,7 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}.jar + CodeUri: target/${artifactId}-${version}-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1ffd82d1 --- /dev/null +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,24 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 3bb813f1..45dc2c1a 100644 --- a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -15,11 +15,18 @@ **/*.java + + src/assembly + + * + + sam.yaml README.md + build.gradle diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..543573c3 --- /dev/null +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.sparkjava:spark-core:2.8.0', + 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'io.symphonia:lambda-logging:1.0.1' + ) + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'jetty-http*' + exclude 'jetty-client*' + exclude 'jetty-webapp*' + exclude 'jetty-xml*' + exclude 'jetty-io*' + exclude 'websocket*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index e4705548..ea9f3f49 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,3 +1,4 @@ +#set($dollar = '$') - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - - org.eclipse.jetty.websocket:* - org.eclipse.jetty:jetty-http - org.eclipse.jetty:jetty-client - org.eclipse.jetty:jetty-webapp - org.eclipse.jetty:jetty-xml - org.eclipse.jetty:jetty-io - - + false - - - - - + + + package + + shade + + + + + + org.eclipse.jetty.websocket:* + org.eclipse.jetty:jetty-http + org.eclipse.jetty:jetty-client + org.eclipse.jetty:jetty-webapp + org.eclipse.jetty:jetty-xml + org.eclipse.jetty:jetty-io + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml index 82ea86d8..674c769a 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml @@ -33,7 +33,7 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}.jar + CodeUri: target/${artifactId}-${version}-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..fcb93503 --- /dev/null +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,32 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + + websocket* + jetty-http* + jetty-client* + jetty-webapp* + jetty-xml* + jetty-io* + + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index ab816387..9295c645 100644 --- a/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -21,11 +21,18 @@ **/*.xml + + src/assembly + + * + + sam.yaml README.md + build.gradle diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..da124af5 --- /dev/null +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,31 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework:spring-webmvc:5.1.1.RELEASE', + 'org.springframework:spring-context:5.1.1.RELEASE', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'org.apache.logging.log4j:log4j-core:2.8.2', + 'org.apache.logging.log4j:log4j-api:2.8.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + ) + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index ff610997..9fb967fe 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,3 +1,4 @@ +#set($dollar = '$') - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - - package - - shade - - - false - - - - - - - - - - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - 2.8.1 - - - - - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + false + + + + + + + + + + com.github.edwgiz + maven-shade-plugin.log4j2-cachefile-transformer + 2.8.1 + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${dollar}{projecft.artifactId}-${dollar}{.projectversion} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml index 9f44fe29..374dfe59 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml @@ -33,7 +33,7 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}.jar + CodeUri: target/${artifactId}-${version}-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1ffd82d1 --- /dev/null +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,24 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 065bd97a..ec02bb6a 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -21,11 +21,18 @@ **/*.java + + src/assembly + + * + + sam.yaml README.md + build.gradle diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..a6d54d46 --- /dev/null +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,32 @@ +plugins { + id 'org.springframework.boot' version '1.5.17.RELEASE' +} +apply plugin: 'java' + +repositories { + jcenter() + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework.boot:spring-boot-starter-web', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'io.symphonia:lambda-logging:1.0.1' + ) + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml index 532a3db6..e0ee7b74 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,3 +1,4 @@ +#set($dollar = '$') - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - org.apache.tomcat.embed:* - - + false - - - - - + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml index 62a1e826..3fbd348b 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml @@ -33,7 +33,7 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}.jar + CodeUri: target/${artifactId}-${version}-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 065bd97a..ec02bb6a 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -21,11 +21,18 @@ **/*.java + + src/assembly + + * + + sam.yaml README.md + build.gradle diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..80bbc21d --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,32 @@ +plugins { + id 'org.springframework.boot' version '2.1.1.RELEASE' +} +apply plugin: 'java' + +repositories { + jcenter() + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'io.symphonia:lambda-logging:1.0.1' + ) + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 325e9665..fcdf963f 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,3 +1,4 @@ +#set($dollar = '$') - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 - - - org.apache.tomcat.embed:* - - + false - - - - - + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + default-jar + none + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml index 2f208f55..970025c4 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml @@ -33,7 +33,7 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}.jar + CodeUri: target/${artifactId}-${version}-lambda-package.zip MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index c2784834..91a53e56 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -33,6 +33,7 @@ sam.yaml README.md + build.gradle diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..ad9c0051 --- /dev/null +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + compile ( + 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', + 'org.apache.struts:struts2-convention-plugin:2.5.17', + 'org.apache.struts:struts2-rest-plugin:2.5.17', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.17', + 'org.apache.struts:struts2-junit-plugin:2.5.17', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', + 'org.hibernate:hibernate-validator:4.3.2.Final', + 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'org.apache.logging.log4j:log4j-core:2.8.2', + 'org.apache.logging.log4j:log4j-api:2.8.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + ) + + testCompile("junit:junit:4.12") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) + } +} + +build.dependsOn buildZip \ No newline at end of file diff --git a/samples/struts/pet-store/sam.yaml b/samples/struts/pet-store/sam.yaml index e91f9d59..c44aa320 100644 --- a/samples/struts/pet-store/sam.yaml +++ b/samples/struts/pet-store/sam.yaml @@ -13,7 +13,7 @@ Resources: Properties: Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest Runtime: java8 - CodeUri: serverless-struts-example-1.0-SNAPSHOT-lambda.zip + CodeUri: target/serverless-struts-example-1.0-SNAPSHOT-lambda.zip MemorySize: 256 Policies: AWSLambdaBasicExecutionRole Timeout: 30 From 82fddf28212ee29f03233535096172c8e5391602 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 13:21:09 -0800 Subject: [PATCH 0239/1214] New build process that should test all samples and archetypes including gradle. Also verifies the generated zip file against the one specified in the SAM template --- .travis.yml | 5 ++-- travis.sh | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100755 travis.sh diff --git a/.travis.yml b/.travis.yml index edc61950..82623fb2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +dist: trusty jdk: - - oraclejdk8 -script: mvn install + - openjdk8 +script: ./travis.sh diff --git a/travis.sh b/travis.sh new file mode 100755 index 00000000..6d61a7c9 --- /dev/null +++ b/travis.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +IFS=$'\n' + +echo "STARTING TRAVIS BUILD in $(pwd)" +cd $TRAVIS_BUILD_DIR +mvn install +echo "COMPLETED MAIN FRAMEWORK INSTALL" + +echo "STARTING SAMPLES BUILD" +for SAMPLE in $(find samples -type d -maxdepth 2 -mindepth 2); +do + echo "BUILDING SAMPLE '$SAMPLE'" + cd $SAMPLE + mvn clean package + gradle clean build + + SAM_FILE="$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml" + if [[ -f "$SAM_FILE" ]]; then + TARGET_ZIP=$(cat $SAM_FILE | grep CodeUri | sed -e 's/^.*:\ //g') + if [[ ! -f "./$TARGET_ZIP" ]]; then + echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP for $SAMPLE" + exit 1 + fi + else + echo "COULD NOT FIND SAM FILE: '$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml'" + exit 1 + fi + + cd $TRAVIS_BUILD_DIR + echo "'$SAMPLE' BUILT SUCCESSFULLY" +done +echo "COMPLETED SAMPLES BUILD" + +cd $TRAVIS_BUILD_DIR +rm -rf tmp +echo "STARTING ARCHETYPE BUILD" +for ARCH in $(find . -name "*archetype" -type d); +do + echo "TESTING ARCHETYPE '$ARCH'" + ARCH_NAME=$(basename $ARCH) + TEST_PROJ="TEST-$ARCH_NAME" + mkdir tmp && cd tmp + mvn archetype:generate -DgroupId=my.service -DartifactId=$TEST_PROJ -Dversion=1.0-SNAPSHOT \ + -DarchetypeGroupId=com.amazonaws.serverless.archetypes \ + -DarchetypeArtifactId=$ARCH_NAME \ + -DarchetypeCatalog=local \ + -DinteractiveMode=false + cd ${TEST_PROJ} + mvn clean package -Pshaded-jar + mvn clean package + if [[ -f "$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/build.gradle" ]]; then + gradle clean build + else + echo "GRADLE BUILD FILE NOT FOUND" + fi + + SAM_FILE="$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/sam.yaml" + if [[ -f "$SAM_FILE" ]]; then + TARGET_ZIP=$(cat $SAM_FILE | grep CodeUri | sed -e 's/^.*:\ //g') + if [[ ! -f "./$TARGET_ZIP" ]]; then + echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP for $ARCH" + exit 1 + fi + else + echo "COULD NOT FIND SAM FILE: '$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml'" + exit 1 + fi + + + echo "'$ARCH' BUILT SUCCESSFULLY" + cd $TRAVIS_BUILD_DIR + rm -rf tmp +done +echo "COMPLETED ARCHETYPE BUILD" \ No newline at end of file From bf8f03224fadf0463144a041b51dd5faec7af125 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 16:27:36 -0800 Subject: [PATCH 0240/1214] Fixed build warning by removing references to the file system root / --- .../resources/archetype-resources/src/main/assembly/dist.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml index 029ec01c..0466b85c 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml @@ -15,14 +15,14 @@ ${basedir}/src/main/resources - / + * ${project.build.directory}/classes - / + **/*.class From 9d4da29d768c4071dee642a03c059c044e29f5aa Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 16:28:10 -0800 Subject: [PATCH 0241/1214] Build script update to fail on errors from maven or gradle. Switched to gradle wrapper to force gradle 5 --- .gitignore | 2 ++ .travis.yml | 1 + travis.sh | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a77c6956..870a2d42 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,9 @@ dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties .gradle/ +gradle/ build/ +gradlew* # Exclude maven wrapper !/.mvn/wrapper/maven-wrapper.jar diff --git a/.travis.yml b/.travis.yml index 82623fb2..9536fb60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,5 @@ language: java dist: trusty jdk: - openjdk8 +install: true script: ./travis.sh diff --git a/travis.sh b/travis.sh index 6d61a7c9..64aa4f2d 100755 --- a/travis.sh +++ b/travis.sh @@ -5,6 +5,9 @@ IFS=$'\n' echo "STARTING TRAVIS BUILD in $(pwd)" cd $TRAVIS_BUILD_DIR mvn install +if [[ "$?" -ne 0 ]]; then + exit 1 +fi echo "COMPLETED MAIN FRAMEWORK INSTALL" echo "STARTING SAMPLES BUILD" @@ -13,7 +16,21 @@ do echo "BUILDING SAMPLE '$SAMPLE'" cd $SAMPLE mvn clean package - gradle clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + gradle wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + ./gradlew wrapper --gradle-version 5.0 + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + ./gradlew clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi SAM_FILE="$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml" if [[ -f "$SAM_FILE" ]]; then @@ -46,11 +63,31 @@ do -DarchetypeArtifactId=$ARCH_NAME \ -DarchetypeCatalog=local \ -DinteractiveMode=false + if [[ "$?" -ne 0 ]]; then + exit 1 + fi cd ${TEST_PROJ} mvn clean package -Pshaded-jar + if [[ "$?" -ne 0 ]]; then + exit 1 + fi mvn clean package + if [[ "$?" -ne 0 ]]; then + exit 1 + fi if [[ -f "$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/build.gradle" ]]; then - gradle clean build + gradle wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + ./gradlew wrapper --gradle-version 5.0 + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + ./gradlew clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi else echo "GRADLE BUILD FILE NOT FOUND" fi From 452d07adceb092e45db2e14da89a13ef565977d8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 16:38:39 -0800 Subject: [PATCH 0242/1214] Added basic security context ALB tests for #214 --- .../jaxrs/AwsProxySecurityContext.java | 12 +++---- .../jaxrs/AwsProxySecurityContextTest.java | 31 +++++++++++++++++-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 3d7f3fc2..f8cf413e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -42,15 +42,15 @@ public class AwsProxySecurityContext implements SecurityContext { //------------------------------------------------------------- - // Constants - Private + // Constants - Package //------------------------------------------------------------- - private static final String AUTH_SCHEME_CUSTOM = "CUSTOM_AUTHORIZER"; - private static final String AUTH_SCHEME_COGNITO_POOL = "COGNITO_USER_POOL"; - private static final String AUTH_SCHEME_AWS_IAM = "AWS_IAM"; + static final String AUTH_SCHEME_CUSTOM = "CUSTOM_AUTHORIZER"; + static final String AUTH_SCHEME_COGNITO_POOL = "COGNITO_USER_POOL"; + static final String AUTH_SCHEME_AWS_IAM = "AWS_IAM"; - private static final String ALB_ACESS_TOKEN_HEADER = "x-amzn-oidc-accesstoken"; - private static final String ALB_IDENTITY_HEADER = "x-amzn-oidc-identity"; + static final String ALB_ACESS_TOKEN_HEADER = "x-amzn-oidc-accesstoken"; + static final String ALB_IDENTITY_HEADER = "x-amzn-oidc-identity"; //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index 5f4f2857..db1b9c10 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -6,6 +6,10 @@ import java.security.Principal; +import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.ALB_ACESS_TOKEN_HEADER; +import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.ALB_IDENTITY_HEADER; +import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.AUTH_SCHEME_COGNITO_POOL; +import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.AUTH_SCHEME_CUSTOM; import static org.junit.Assert.*; public class AwsProxySecurityContextTest { @@ -13,8 +17,14 @@ public class AwsProxySecurityContextTest { private static final String CLAIM_VALUE = "customClaimant"; private static final String COGNITO_IDENTITY_ID = "us-east-2:123123123123"; private static final AwsProxyRequest REQUEST_NO_AUTH = new AwsProxyRequestBuilder("/hello", "GET").build(); + private static final AwsProxyRequest ALB_REQUEST_NO_AUTH = new AwsProxyRequestBuilder("/hello", "GET").alb().build(); private static final AwsProxyRequest REQUEST_COGNITO_USER_POOL = new AwsProxyRequestBuilder("/hello", "GET") .cognitoUserPool(COGNITO_IDENTITY_ID).claim(CLAIM_KEY, CLAIM_VALUE).build(); + private static final AwsProxyRequest ALB_REQUEST_COGNITO_USER_POOL = new AwsProxyRequestBuilder("/hello", "GET") + .alb() + .header(ALB_ACESS_TOKEN_HEADER, "xxxxx") + .header(ALB_IDENTITY_HEADER, COGNITO_IDENTITY_ID) + .build(); @Test public void localVars_constructor_nullValues() { @@ -30,17 +40,34 @@ public void localVars_constructor_ValidRequest() { assertNull(context.getLambdaContext()); } + @Test + public void alb_noAuth_expectEmptyScheme() { + AwsProxySecurityContext context = new AwsProxySecurityContext(null, ALB_REQUEST_NO_AUTH); + assertEquals(ALB_REQUEST_NO_AUTH, context.getEvent()); + assertNull(context.getLambdaContext()); + assertFalse(context.isSecure()); + assertNull(context.getAuthenticationScheme()); + } + @Test public void authScheme_getAuthenticationScheme_userPool() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); assertNotNull(context.getAuthenticationScheme()); - assertEquals("COGNITO_USER_POOL", context.getAuthenticationScheme()); + assertEquals(AUTH_SCHEME_COGNITO_POOL, context.getAuthenticationScheme()); } @Test public void authScheme_getPrincipal_userPool() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); - assertEquals("COGNITO_USER_POOL", context.getAuthenticationScheme()); + assertEquals(AUTH_SCHEME_COGNITO_POOL, context.getAuthenticationScheme()); + assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); + } + + @Test + public void alb_cognitoAuth_expectCustomSchemeAndCorrectPrincipal() { + AwsProxySecurityContext context = new AwsProxySecurityContext(null, ALB_REQUEST_COGNITO_USER_POOL); + assertTrue(context.isSecure()); + assertEquals(AUTH_SCHEME_CUSTOM, context.getAuthenticationScheme()); assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); } From 516fd51717ca251f6eee51238f0cb40611267a9a Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 16:45:13 -0800 Subject: [PATCH 0243/1214] Added comments as suggested in #167 --- .../archetype-resources/src/main/java/SpringApiConfig.java | 2 ++ .../archetype-resources/src/main/java/Application.java | 2 ++ .../serverless/sample/spring/PetStoreSpringAppConfig.java | 2 ++ .../com/amazonaws/serverless/sample/springboot/Application.java | 2 ++ 4 files changed, 8 insertions(+) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java index e40ad8bb..0982c6b0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java @@ -44,6 +44,8 @@ public HandlerAdapter handlerAdapter() { * * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including * an expensive ObjectMapper instance. + * + * To enable custom @ControllerAdvice classes remove this bean. */ @Bean public HandlerExceptionResolver handlerExceptionResolver() { diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java index 119f698f..0d25d61b 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java @@ -52,6 +52,8 @@ public HandlerAdapter handlerAdapter() { * * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including * an expensive ObjectMapper instance. + * + * To enable custom @ControllerAdvice classes remove this bean. */ @Bean public HandlerExceptionResolver handlerExceptionResolver() { diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java index 6655c501..81179933 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java @@ -51,6 +51,8 @@ public HandlerAdapter handlerAdapter() { * * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including * an expensive ObjectMapper instance. + * + * To enable custom @ControllerAdvice classes remove this bean. */ @Bean public HandlerExceptionResolver handlerExceptionResolver() { diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java index 7988133a..3019b05e 100644 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java +++ b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java @@ -49,6 +49,8 @@ public HandlerAdapter handlerAdapter() { * * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including * an expensive ObjectMapper instance. + * + * To enable custom @ControllerAdvice classes remove this bean. */ @Bean public HandlerExceptionResolver handlerExceptionResolver() { From 27b390713e6b93ce2dd9810f69bdf8a82b8b9256 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 17:17:02 -0800 Subject: [PATCH 0244/1214] Fixed conflicts with PR merges --- .../proxy/internal/testutils/AwsProxyRequestBuilder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 49fce657..c1819f73 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -36,6 +36,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.UUID; @@ -145,7 +146,7 @@ public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, by IOUtils.readFully(bodyStream, buffer); request.setBody("\n\n" + new String(buffer, Charset.defaultCharset())); if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue()); if (bodyEntity.getContentEncoding() != null) { @@ -157,7 +158,7 @@ public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, by public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) { if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new MultiValuedTreeMap<>(String.CASE_INSENSITIVE_ORDER)); + request.setMultiValueHeaders(new Headers()); } request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA); if (multipartBuilder == null) { From 8d49f643b4ed947b77f9f758629cbc34a1b1bcd3 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 17:17:25 -0800 Subject: [PATCH 0245/1214] Removed commented-out code from the path validator --- .../proxy/internal/servlet/filters/UrlPathValidator.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index c0ec98d9..a8df2217 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -83,10 +83,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo setErrorResponse(servletResponse); return; } - //if (!PATH_PATTERN.matcher(path).matches()) { - // setErrorResponse(servletResponse); - // return; - //} // Logic taken from the Apache UrlValidator. I opted not to include Apache lib as a dependency to save space // in the final Lambda function package From 6dba79ba11288dcce0449181de8669af1905e362 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 17:38:08 -0800 Subject: [PATCH 0246/1214] Trying to manually install gradle 5 in build environment --- .travis.yml | 8 ++++++++ travis.sh | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9536fb60..5af33b10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,13 @@ language: java dist: trusty jdk: - openjdk8 +addons: + apt: + update: true +before_install: + - curl https://gradle.org/next-steps/?version=5.0&format=bin + - mkdir /opt/gradle + - unzip -d /opt/gradle gradle-5.0-bin.zip + - export GRADLE=/opt/gradle/gradle-5.0/bin/gradle install: true script: ./travis.sh diff --git a/travis.sh b/travis.sh index 64aa4f2d..13996f10 100755 --- a/travis.sh +++ b/travis.sh @@ -19,7 +19,7 @@ do if [[ "$?" -ne 0 ]]; then exit 1 fi - gradle wrapper + $GRADLE wrapper if [[ "$?" -ne 0 ]]; then exit 1 fi @@ -76,7 +76,7 @@ do exit 1 fi if [[ -f "$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/build.gradle" ]]; then - gradle wrapper + $GRADLE wrapper if [[ "$?" -ne 0 ]]; then exit 1 fi From f710f311259f06a64fbb64fc654f95eae70c67b0 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 17:42:43 -0800 Subject: [PATCH 0247/1214] Switched to wget and final url for gradle 5 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5af33b10..f79cc86b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ addons: apt: update: true before_install: - - curl https://gradle.org/next-steps/?version=5.0&format=bin + - wget https://services.gradle.org/distributions/gradle-5.0-bin.zip - mkdir /opt/gradle - unzip -d /opt/gradle gradle-5.0-bin.zip - export GRADLE=/opt/gradle/gradle-5.0/bin/gradle From 2c52bd094ba02534fc109161df6b8a8d0af1ab72 Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Dec 2018 18:43:31 -0800 Subject: [PATCH 0248/1214] Fixed type in assembly output file name --- .../src/main/resources/archetype-resources/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 9fb967fe..f9c2ee98 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -172,7 +172,7 @@ single - ${dollar}{projecft.artifactId}-${dollar}{.projectversion} + ${dollar}{project.artifactId}-${dollar}{project.version} src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml From 9ab50f7e67e36297cf1fe7180741c54b50bb14ec Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 09:38:12 -0800 Subject: [PATCH 0249/1214] Additional changes and unit tests for ALB support (#214). Turns out that the behavior between ALB and API Gateway differs: ALB does not decode encoded query parameters, API Gateway does. --- .../servlet/AwsProxyHttpServletRequest.java | 6 +- .../testutils/AwsProxyRequestBuilder.java | 41 ++++++++-- .../proxy/jersey/JerseyAwsProxyTest.java | 77 +++++++++++++------ .../proxy/jersey/JerseyParamEncodingTest.java | 45 ++++++++--- .../spark/HelloWorldSparkStreamTest.java | 27 ++++++- .../proxy/spark/HelloWorldSparkTest.java | 32 +++++++- 6 files changed, 178 insertions(+), 50 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index bd1650ba..e13eb261 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -234,7 +234,11 @@ public String getContextPath() { @Override public String getQueryString() { try { - return this.generateQueryString(request.getMultiValueQueryStringParameters(), true, config.getUriEncoding()); + return this.generateQueryString( + request.getMultiValueQueryStringParameters(), + // ALB does not automatically decode parameters, so we don't want to re-encode them + request.getRequestSource() != AwsProxyRequest.RequestSource.ALB, + config.getUriEncoding()); } catch (ServletException e) { log.error("Could not generate query string", e); return null; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index c1819f73..a16195c7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -19,6 +19,7 @@ import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; @@ -36,6 +37,9 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; @@ -184,7 +188,24 @@ public AwsProxyRequestBuilder queryString(String key, String value) { this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); } - this.request.getMultiValueQueryStringParameters().add(key, value); + if (request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + this.request.getMultiValueQueryStringParameters().add(key, value); + } + // ALB does not decode parameters automatically like API Gateway. + if (request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + String albValue = value; + try { + //if (URLDecoder.decode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET).equals(value)) { + // TODO: Assume we are always given an unencoded value, smarter check here to encode + // only if necessary + albValue = URLEncoder.encode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET); + //} + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + this.request.getMultiValueQueryStringParameters().add(key, albValue); + } return this; } @@ -219,14 +240,20 @@ public AwsProxyRequestBuilder binaryBody(InputStream is) public AwsProxyRequestBuilder authorizerPrincipal(String principal) { - if (this.request.getRequestContext().getAuthorizer() == null) { - this.request.getRequestContext().setAuthorizer(new ApiGatewayAuthorizerContext()); + if (this.request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + if (this.request.getRequestContext().getAuthorizer() == null) { + this.request.getRequestContext().setAuthorizer(new ApiGatewayAuthorizerContext()); + } + this.request.getRequestContext().getAuthorizer().setPrincipalId(principal); + if (this.request.getRequestContext().getAuthorizer().getClaims() == null) { + this.request.getRequestContext().getAuthorizer().setClaims(new CognitoAuthorizerClaims()); + } + this.request.getRequestContext().getAuthorizer().getClaims().setSubject(principal); } - this.request.getRequestContext().getAuthorizer().setPrincipalId(principal); - if (this.request.getRequestContext().getAuthorizer().getClaims() == null) { - this.request.getRequestContext().getAuthorizer().setClaims(new CognitoAuthorizerClaims()); + if (this.request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + header("x-amzn-oidc-identity", principal); + header("x-amzn-oidc-accesstoken", Base64.getMimeEncoder().encodeToString("test-token".getBytes())); } - this.request.getRequestContext().getAuthorizer().getClaims().setSubject(principal); return this; } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index bf426715..5943b7fc 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -30,12 +30,16 @@ import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; import java.util.UUID; import static org.junit.Assert.*; @@ -43,6 +47,7 @@ /** * Unit test class for the Jersey AWS_PROXY default implementation */ +@RunWith(Parameterized.class) public class JerseyAwsProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; @@ -59,9 +64,28 @@ public class JerseyAwsProxyTest { private static Context lambdaContext = new MockLambdaContext(); + private boolean isAlb; + + public JerseyAwsProxyTest(boolean alb) { + isAlb = alb; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { false, true }); + } + + private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(path, method); + if (isAlb) builder.alb(); + + return builder; + } + + @Test public void alb_basicRequest_expectSuccess() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .alb() @@ -78,7 +102,7 @@ public void alb_basicRequest_expectSuccess() { @Test public void headers_getHeaders_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .build(); @@ -92,7 +116,7 @@ public void headers_getHeaders_echo() { @Test public void headers_servletRequest_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-headers", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/servlet-headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .build(); @@ -106,7 +130,7 @@ public void headers_servletRequest_echo() { @Test public void context_servletResponse_setCustomHeader() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-response", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/servlet-response", "GET") .json() .build(); @@ -117,7 +141,7 @@ public void context_servletResponse_setCustomHeader() { @Test public void context_serverInfo_correctContext() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-context", "GET").build(); + AwsProxyRequest request = getRequestBuilder("/echo/servlet-context", "GET").build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); for (String header : output.getMultiValueHeaders().keySet()) { System.out.println(header + ": " + output.getMultiValueHeaders().getFirst(header)); @@ -130,7 +154,7 @@ public void context_serverInfo_correctContext() { @Test public void requestScheme_valid_expectHttps() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/scheme", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/scheme", "GET") .json() .build(); @@ -143,7 +167,7 @@ public void requestScheme_valid_expectHttps() { @Test public void requestFilter_injectsServletRequest_expectCustomAttribute() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/filter-attribute", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/filter-attribute", "GET") .json() .build(); @@ -156,21 +180,24 @@ public void requestFilter_injectsServletRequest_expectCustomAttribute() { @Test public void authorizer_securityContext_customPrincipalSuccess() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/authorizer-principal", "GET") .json() .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + if (!isAlb) { + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); + } + - validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } @Test public void authorizer_securityContext_customAuthorizerContextSuccess() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-context", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/authorizer-context", "GET") .json() .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) .authorizerContextValue(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) @@ -186,7 +213,7 @@ public void authorizer_securityContext_customAuthorizerContextSuccess() { @Test public void errors_unknownRoute_expect404() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/test33", "GET").build(); + AwsProxyRequest request = getRequestBuilder("/echo/test33", "GET").build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(404, output.getStatusCode()); @@ -194,7 +221,7 @@ public void errors_unknownRoute_expect404() { @Test public void error_contentType_invalidContentType() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/json-body", "POST") + AwsProxyRequest request = getRequestBuilder("/echo/json-body", "POST") .header("Content-Type", "application/octet-stream") .body("asdasdasd") .build(); @@ -205,7 +232,7 @@ public void error_contentType_invalidContentType() { @Test public void error_statusCode_methodNotAllowed() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "POST") + AwsProxyRequest request = getRequestBuilder("/echo/status-code", "POST") .json() .queryString("status", "201") .build(); @@ -218,7 +245,7 @@ public void error_statusCode_methodNotAllowed() { public void responseBody_responseWriter_validBody() throws JsonProcessingException { SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/json-body", "POST") + AwsProxyRequest request = getRequestBuilder("/echo/json-body", "POST") .json() .body(objectMapper.writeValueAsString(singleValueModel)) .build(); @@ -232,7 +259,7 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti @Test public void statusCode_responseStatusCode_customStatusCode() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/status-code", "GET") .json() .queryString("status", "201") .build(); @@ -243,7 +270,7 @@ public void statusCode_responseStatusCode_customStatusCode() { @Test public void base64_binaryResponse_base64Encoding() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/binary", "GET").build(); + AwsProxyRequest request = getRequestBuilder("/echo/binary", "GET").build(); AwsProxyResponse response = handler.proxy(request, lambdaContext); assertNotNull(response.getBody()); @@ -252,7 +279,7 @@ public void base64_binaryResponse_base64Encoding() { @Test public void exception_mapException_mapToNotImplemented() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/exception", "GET").build(); + AwsProxyRequest request = getRequestBuilder("/echo/exception", "GET").build(); AwsProxyResponse response = handler.proxy(request, lambdaContext); assertNotNull(response.getBody()); @@ -262,7 +289,7 @@ public void exception_mapException_mapToNotImplemented() { @Test public void stripBasePath_route_shouldRouteCorrectly() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") .json() .queryString("status", "201") .build(); @@ -274,7 +301,7 @@ public void stripBasePath_route_shouldRouteCorrectly() { @Test public void stripBasePath_route_shouldReturn404WithStageAsContext() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") .stage("prod") .json() .queryString("status", "201") @@ -289,7 +316,7 @@ public void stripBasePath_route_shouldReturn404WithStageAsContext() { @Test public void stripBasePath_route_shouldReturn404() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") .json() .queryString("status", "201") .build(); @@ -301,7 +328,7 @@ public void stripBasePath_route_shouldReturn404() { @Test public void securityContext_injectPrincipal_expectPrincipalName() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/security-context", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/security-context", "GET") .authorizerPrincipal(USER_PRINCIPAL).build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); @@ -311,7 +338,7 @@ public void securityContext_injectPrincipal_expectPrincipalName() { @Test public void emptyStream_putNullBody_expectPutToSucceed() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") + AwsProxyRequest request = getRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") .nullBody() .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .build(); @@ -323,7 +350,7 @@ public void emptyStream_putNullBody_expectPutToSucceed() { @Test public void refererHeader_headerParam_expectCorrectInjection() { String refererValue = "test-referer"; - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/referer-header", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/referer-header", "GET") .nullBody() .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .header("Referer", refererValue) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index ad8c2917..07bfac53 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -14,16 +14,21 @@ import org.glassfish.jersey.server.ResourceConfig; import org.junit.Ignore; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.Arrays; +import java.util.Collection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; +@RunWith(Parameterized.class) public class JerseyParamEncodingTest { private static final String SIMPLE_ENCODED_PARAM = "p/z+3"; @@ -41,9 +46,27 @@ public class JerseyParamEncodingTest { private static Context lambdaContext = new MockLambdaContext(); + private boolean isAlb; + + public JerseyParamEncodingTest(boolean alb) { + isAlb = alb; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { false, true }); + } + + private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(path, method); + if (isAlb) builder.alb(); + + return builder; + } + @Test public void queryString_uriInfo_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") .json() .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) .build(); @@ -57,7 +80,7 @@ public void queryString_uriInfo_echo() { @Test public void queryString_notEncoded_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") .json() .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) .build(); @@ -72,7 +95,7 @@ public void queryString_notEncoded_echo() { @Test @Ignore("We expect to only receive decoded values from API Gateway") public void queryString_encoded_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") .json() .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) .build(); @@ -86,7 +109,7 @@ public void queryString_encoded_echo() { @Test public void simpleQueryParam_encoding_expectDecodedParam() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + AwsProxyRequest request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertEquals(200, resp.getStatusCode()); @@ -95,7 +118,7 @@ public void simpleQueryParam_encoding_expectDecodedParam() { @Test public void jsonQueryParam_encoding_expectDecodedParam() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + AwsProxyRequest request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertEquals(200, resp.getStatusCode()); @@ -104,7 +127,7 @@ public void jsonQueryParam_encoding_expectDecodedParam() { @Test public void simpleQueryParam_encoding_expectEncodedParam() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); String encodedVal = ""; try { encodedVal = URLEncoder.encode(SIMPLE_ENCODED_PARAM, "UTF-8"); @@ -118,7 +141,7 @@ public void simpleQueryParam_encoding_expectEncodedParam() { @Test public void jsonQueryParam_encoding_expectEncodedParam() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); String encodedVal = ""; try { encodedVal = URLEncoder.encode(JSON_ENCODED_PARAM, "UTF-8"); @@ -133,7 +156,7 @@ public void jsonQueryParam_encoding_expectEncodedParam() { @Test public void queryParam_encoding_expectFullyEncodedUrl() { String paramValue = "/+="; - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); + AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); @@ -145,7 +168,7 @@ public void queryParam_encoding_expectFullyEncodedUrl() { public void pathParam_encoded_routesToCorrectPath() { String encodedParam = "http%3A%2F%2Fhelloresource.com"; String path = "/echo/encoded-path/" + encodedParam; - AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build(); + AwsProxyRequest request = getRequestBuilder(path, "GET").build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); @@ -156,7 +179,7 @@ public void pathParam_encoded_routesToCorrectPath() { public void pathParam_encoded_returns404() { String encodedParam = "http://helloresource.com"; String path = "/echo/encoded-path/" + encodedParam; - AwsProxyRequest request = new AwsProxyRequestBuilder(path, "GET").build(); + AwsProxyRequest request = getRequestBuilder(path, "GET").build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 404); @@ -165,7 +188,7 @@ public void pathParam_encoded_returns404() { @Test @Ignore public void queryParam_listOfString_expectCorrectLength() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3").build(); + AwsProxyRequest request = getRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3").build(); AwsProxyResponse resp = handler.proxy(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index ccf7eb28..2fa334fb 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -12,6 +12,8 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import spark.Spark; import javax.servlet.http.Cookie; @@ -21,6 +23,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Arrays; +import java.util.Collection; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -30,6 +34,7 @@ // This class doesn't actually test Spark. Instead it tests the proxyStream method of the // LambdaContainerHandler object. We use the Spark implementation for this because it's the // fastest to start +@RunWith(Parameterized.class) public class HelloWorldSparkStreamTest { private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "My Header Value"; @@ -42,6 +47,24 @@ public class HelloWorldSparkStreamTest { private static SparkLambdaContainerHandler handler; + private boolean isAlb; + + public HelloWorldSparkStreamTest(boolean alb) { + isAlb = alb; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { false, true }); + } + + private AwsProxyRequestBuilder getRequestBuilder() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(); + if (isAlb) builder.alb(); + + return builder; + } + @BeforeClass public static void initializeServer() { try { @@ -62,7 +85,7 @@ public static void stopSpark() { @Test public void helloRequest_basicStream_populatesOutputSuccessfully() { - InputStream req = new AwsProxyRequestBuilder().method("GET").path("/hello").buildStream(); + InputStream req = getRequestBuilder().method("GET").path("/hello").buildStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { handler.proxyStream(req, outputStream, new MockLambdaContext()); @@ -80,7 +103,7 @@ public void helloRequest_basicStream_populatesOutputSuccessfully() { @Test public void nullPathRequest_doesntFail_expectA404() { - InputStream req = new AwsProxyRequestBuilder().method("GET").path(null).buildStream(); + InputStream req = getRequestBuilder().method("GET").path(null).buildStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { handler.proxyStream(req, outputStream, new MockLambdaContext()); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 6f1318b4..4e09a35d 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -10,15 +10,21 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import spark.Spark; import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; +import java.util.Arrays; +import java.util.Collection; + import static org.junit.Assert.*; import static spark.Spark.get; +@RunWith(Parameterized.class) public class HelloWorldSparkTest { private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "My Header Value"; @@ -31,6 +37,24 @@ public class HelloWorldSparkTest { private static SparkLambdaContainerHandler handler; + private boolean isAlb; + + public HelloWorldSparkTest(boolean alb) { + isAlb = alb; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { false, true }); + } + + private AwsProxyRequestBuilder getRequestBuilder() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(); + if (isAlb) builder.alb(); + + return builder; + } + @BeforeClass public static void initializeServer() { try { @@ -51,7 +75,7 @@ public static void stopSpark() { @Test public void basicServer_handleRequest_emptyFilters() { - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/hello").build(); + AwsProxyRequest req = getRequestBuilder().method("GET").path("/hello").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); @@ -62,7 +86,7 @@ public void basicServer_handleRequest_emptyFilters() { @Test public void addCookie_setCookieOnResponse_validCustomCookie() { - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/cookie").build(); + AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); @@ -74,7 +98,7 @@ public void addCookie_setCookieOnResponse_validCustomCookie() { @Test public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/multi-cookie").build(); + AwsProxyRequest req = getRequestBuilder().method("GET").path("/multi-cookie").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); @@ -89,7 +113,7 @@ public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { @Test public void rootResource_basicRequest_expectSuccess() { - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/").build(); + AwsProxyRequest req = getRequestBuilder().method("GET").path("/").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals(200, response.getStatusCode()); From 3961897420548060b4a5ca3af6c12dc0f9f333d9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 09:51:48 -0800 Subject: [PATCH 0250/1214] Fix build --- .../testutils/AwsProxyRequestBuilder.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index a16195c7..fa450444 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -193,18 +193,20 @@ public AwsProxyRequestBuilder queryString(String key, String value) { } // ALB does not decode parameters automatically like API Gateway. if (request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { - String albValue = value; try { //if (URLDecoder.decode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET).equals(value)) { // TODO: Assume we are always given an unencoded value, smarter check here to encode // only if necessary - albValue = URLEncoder.encode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET); + this.request.getMultiValueQueryStringParameters().add( + key, + URLEncoder.encode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET) + ); //} } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } - this.request.getMultiValueQueryStringParameters().add(key, albValue); + } return this; } @@ -252,7 +254,16 @@ public AwsProxyRequestBuilder authorizerPrincipal(String principal) { } if (this.request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { header("x-amzn-oidc-identity", principal); - header("x-amzn-oidc-accesstoken", Base64.getMimeEncoder().encodeToString("test-token".getBytes())); + try { + header( + "x-amzn-oidc-accesstoken", + Base64.getMimeEncoder().encodeToString( + "test-token".getBytes(ContainerConfig.DEFAULT_CONTENT_CHARSET) + ) + ); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } } return this; } From 5f3e2af74171e6aa41bda772d3e371f1e446c4ee Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 10:17:42 -0800 Subject: [PATCH 0251/1214] More details on the slf4j vulnerability suppression --- owasp-suppression.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/owasp-suppression.xml b/owasp-suppression.xml index 3cdb0372..99ecfb83 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -28,6 +28,10 @@ cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ + + cpe:/a:slf4j:slf4j:1.8.0.beta From 38871ca41dfdd1d779fbf52c38bb0fe691287e4e Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 10:17:58 -0800 Subject: [PATCH 0252/1214] Bump version of dependency check plugin --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- pom.xml | 1 + 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index aab42c99..3aea8033 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -176,7 +176,7 @@ org.owasp dependency-check-maven - 3.3.2 + ${dependencyCheck.version} true diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 87af8432..cd365a08 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -187,7 +187,7 @@ org.owasp dependency-check-maven - 3.3.2 + ${dependencyCheck.version} true diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 01f9ac7a..1e7e75cd 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -139,7 +139,7 @@ org.owasp dependency-check-maven - 3.3.2 + ${dependencyCheck.version} true diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9336e942..618007ab 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -256,7 +256,7 @@ org.owasp dependency-check-maven - 3.3.2 + ${dependencyCheck.version} true diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 976d8b17..d42a75d6 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -198,7 +198,7 @@ org.owasp dependency-check-maven - 3.3.2 + ${dependencyCheck.version} true diff --git a/pom.xml b/pom.xml index 65bc1933..3edc9729 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,7 @@ 0.5 + 4.0.1 From 8af1e48e4993073a05fae445f509fcb051c8ef0a Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 10:37:39 -0800 Subject: [PATCH 0253/1214] Fixed suppression for latest version of dep check plugin --- owasp-suppression.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owasp-suppression.xml b/owasp-suppression.xml index 99ecfb83..fe70f749 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -34,7 +34,7 @@ - cpe:/a:slf4j:slf4j:1.8.0.beta + cpe:/a:slf4j:slf4j:1.8.0 \ No newline at end of file From dbb99078bbfd30e0e110a6fe1cd35ed1ae5953ef Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 12:41:20 -0800 Subject: [PATCH 0254/1214] Cleaned up generated readme for all archetypes --- aws-serverless-jersey-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 15 +++++++-------- aws-serverless-spark-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 17 ++++++++--------- aws-serverless-spring-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 17 ++++++++--------- aws-serverless-springboot-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 17 ++++++++--------- aws-serverless-springboot2-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 17 ++++++++--------- aws-serverless-struts2-archetype/pom.xml | 1 + .../resources/archetype-resources/README.md | 17 ++++++++--------- 12 files changed, 53 insertions(+), 53 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 268ccb2f..b8cd29e7 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md index 40cc51cd..f3c22945 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-jersey-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.jersey -Dversion=0.1 -Dinteractive=false -$ cd my-jersey-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessJerseyApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 3e69d967..2604dfa5 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md index 78b04282..8d7d10e1 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-spark-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spark-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spark -Dversion=0.1 -Dinteractive=false -$ cd my-spark-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spark-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSparkApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 1b9aa17f..038e6d56 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md index 4b646a46..172d275e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false -$ cd my-spring-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSpringApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index c2090717..bc1ee6bc 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md index 4b646a46..84bd1063 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false -$ cd my-spring-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSpringApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 1fe2e126..3ee6b45c 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md index 4b646a46..49b29f54 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false -$ cd my-spring-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSpringApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index f37ce969..c7794363 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -31,6 +31,7 @@ true archetype-resources/pom.xml + archetype-resources/README.md diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md index 4b646a46..d5f8acc5 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md @@ -15,19 +15,18 @@ #set($resourceName = "#replaceChar($resourceName, '-')") #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# ${artifactId} serverless API -The ${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible jar file simply by running the maven package command from the projct folder. - +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. ```bash -$ mvn archetype:generate -DartifactId=my-spring-api -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.sapessi.spring -Dversion=0.1 -Dinteractive=false -$ cd my-spring-api +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-struts2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} $ mvn clean package [INFO] ------------------------------------------------------------------------ @@ -100,8 +99,8 @@ $ aws cloudformation describe-stacks --stack-name ServerlessSpringApi "Outputs": [ { "Description": "URL for application", - "ExportName": "${resourceName}Api", - "OutputKey": "${resourceName}Api", + "ExportName": "\${resourceName}Api", + "OutputKey": "\${resourceName}Api", "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" } ], From a6203803a2064d8bf3da44613f35fd4da0ea2971 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 12:58:24 -0800 Subject: [PATCH 0255/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.3 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3aea8033..161bedfc 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cd365a08..3f24d415 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3-SNAPSHOT + 1.3 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 1e7e75cd..f002eb40 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3-SNAPSHOT + 1.3 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 618007ab..7337511c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3-SNAPSHOT + 1.3 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index d42a75d6..6d7856d8 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3-SNAPSHOT + 1.3 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index b8cd29e7..a102d35a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 2604dfa5..952c6aef 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 038e6d56..1df840a8 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index bc1ee6bc..7155eabd 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 3ee6b45c..4a87e44e 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c7794363..8c1907b4 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3-SNAPSHOT + 1.3 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.3-SNAPSHOT + 1.3 maven-archetype diff --git a/pom.xml b/pom.xml index 3edc9729..f292e4a8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.3-SNAPSHOT + 1.3 AWS Serverless Java container From 1d654173598d0bdf3317f8b39766025b78fe1433 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Dec 2018 12:58:25 -0800 Subject: [PATCH 0256/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 161bedfc..ca262e78 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 3f24d415..eb192bab 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3 + 1.4-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f002eb40..ce884e6e 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7337511c..346e92ab 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 6d7856d8..bb6fbcad 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3 + 1.4-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a102d35a..a0dbb8df 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 952c6aef..56407ba4 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 1df840a8..6e0bb1e5 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 7155eabd..b12d3534 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 4a87e44e..f9fc92b2 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 8c1907b4..12f39986 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.3 + 1.4-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index f292e4a8..e4b79a7c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.3 + 1.4-SNAPSHOT AWS Serverless Java container From e2e9e6fa75b6c51af2fe8453723b85f7a6861731 Mon Sep 17 00:00:00 2001 From: Sean Sullivan Date: Thu, 27 Dec 2018 08:11:27 -0800 Subject: [PATCH 0257/1214] Jackson 2.9.7 -> 2.9.8 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- aws-serverless-spring-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- aws-serverless-springboot2-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- aws-serverless-struts2-archetype/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 4 ++-- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/springboot/pet-store/build.gradle | 2 +- samples/springboot/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 31 files changed, 40 insertions(+), 40 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ca262e78..bff7e674 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.9.7 + 2.9.8 2.1 3.1.0 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index eb192bab..8fdf2de9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -60,7 +60,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.7 + 2.9.8 true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 346e92ab..22ce578b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -19,7 +19,7 @@ 5.1.1.RELEASE 1.5.17.RELEASE 5.1.1.RELEASE - 2.9.7 + 2.9.8 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index bb6fbcad..4419d352 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ 2.5.18 - 2.9.7 + 2.9.8 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a0dbb8df..d89ca75b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -76,4 +76,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 48b88094..eda69dc9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'io.symphonia:lambda-logging:1.0.1' ) @@ -34,4 +34,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 1aa27d0e..b94697c7 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.27 - 2.9.7 + 2.9.8 @@ -159,4 +159,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 56407ba4..65c870e5 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -77,4 +77,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 543573c3..ace7a6b3 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.sparkjava:spark-core:2.8.0', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'io.symphonia:lambda-logging:1.0.1' ) @@ -31,4 +31,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index ea9f3f49..eec41cd2 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.9.7 + 2.9.8 2.8.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 6e0bb1e5..35331470 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -77,4 +77,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index da124af5..ec235eba 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) @@ -28,4 +28,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index b12d3534..011cc1a9 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -76,4 +76,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle index a6d54d46..88c7d62f 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle @@ -29,4 +29,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index f9fc92b2..2ade62df 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -76,4 +76,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 80bbc21d..7bd0e7fe 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -29,4 +29,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 12f39986..c3578068 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -76,4 +76,4 @@ - \ No newline at end of file + diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index ad9c0051..41046f45 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.17', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', @@ -32,4 +32,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index e43d0f88..813a1047 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.17 - 2.9.7 + 2.9.8 4.12 2.8.2 diff --git a/pom.xml b/pom.xml index e4b79a7c..74903bc7 100644 --- a/pom.xml +++ b/pom.xml @@ -168,4 +168,4 @@ - \ No newline at end of file + diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 790a3fcb..3e9e9762 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'io.symphonia:lambda-logging:1.0.1' ) @@ -32,4 +32,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 45573ea8..daf6b67c 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -77,7 +77,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.7 + 2.9.8 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 8a7b06b6..681dd4df 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.sparkjava:spark-core:2.8.0', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'io.symphonia:lambda-logging:1.0.1' ) } @@ -29,4 +29,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index a7902811..09502efd 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.7 + 2.9.8 2.8.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 8bf70780..73e18d96 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) } @@ -26,4 +26,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/springboot/pet-store/build.gradle b/samples/springboot/pet-store/build.gradle index d86874e7..1c5e5d48 100644 --- a/samples/springboot/pet-store/build.gradle +++ b/samples/springboot/pet-store/build.gradle @@ -28,4 +28,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index bcd839ef..51f177e5 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -133,4 +133,4 @@ - \ No newline at end of file + diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 2d01e2f3..8ad81f12 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -28,4 +28,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 3357d782..b9d47fc1 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -134,4 +134,4 @@ - \ No newline at end of file + diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index e0fbffff..99e718ba 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.17', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.7', + 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', @@ -30,4 +30,4 @@ task buildZip(type: Zip) { } } -build.dependsOn buildZip \ No newline at end of file +build.dependsOn buildZip diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 0bbde876..582c2a6b 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.17 - 2.9.7 + 2.9.8 4.12 2.8.2 From c53e5de6680b34e9615b4d698bea9b86d4822ed0 Mon Sep 17 00:00:00 2001 From: Luis Alberto Medina Bravo Date: Tue, 15 Jan 2019 11:55:20 -0500 Subject: [PATCH 0258/1214] Handler typo - aws-sam-cli/issues/932 --- samples/springboot2/pet-store/sam.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot2/pet-store/sam.yaml b/samples/springboot2/pet-store/sam.yaml index 8fd903a5..c00d45c3 100644 --- a/samples/springboot2/pet-store/sam.yaml +++ b/samples/springboot2/pet-store/sam.yaml @@ -11,7 +11,7 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest + Handler: com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler::handleRequest Runtime: java8 CodeUri: target/serverless-springboot2-example-1.0-SNAPSHOT-lambda-package.zip MemorySize: 1512 From 24311a3b8bbac38683c645ea83afb15807328f0a Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 23 Jan 2019 16:21:48 +0100 Subject: [PATCH 0259/1214] Use latest available Apache Struts2 GA release --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- samples/struts/pet-store/build.gradle | 10 +++++----- samples/struts/pet-store/pom.xml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 4419d352..e0dce7e0 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.18 + 2.5.20 2.9.8 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 813a1047..7fbc5293 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.17 + 2.5.20 2.9.8 4.12 2.8.2 @@ -63,7 +63,7 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.0.0 + 1.1.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 99e718ba..829ca79b 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -8,11 +8,11 @@ repositories { dependencies { compile ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.17', - 'org.apache.struts:struts2-rest-plugin:2.5.17', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.17', - 'org.apache.struts:struts2-junit-plugin:2.5.17', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', + 'org.apache.struts:struts2-convention-plugin:2.5.20', + 'org.apache.struts:struts2-rest-plugin:2.5.20', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.20', + 'org.apache.struts:struts2-junit-plugin:2.5.20', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.1.0', 'org.hibernate:hibernate-validator:4.3.2.Final', 'com.fasterxml.jackson.core:jackson-databind:2.9.8', 'org.apache.logging.log4j:log4j-core:2.8.2', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 582c2a6b..76126659 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.17 + 2.5.20 2.9.8 4.12 2.8.2 @@ -74,7 +74,7 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.0.0 + 1.1.0 From 2f2f601849c911beb643f01f601783a2c19b05b3 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Thu, 7 Feb 2019 09:57:20 -0600 Subject: [PATCH 0260/1214] Simplify initialization of collections --- .../amazonaws/serverless/proxy/model/ContainerConfig.java | 5 ++--- .../amazonaws/serverless/proxy/model/MultiValuedTreeMap.java | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index a51cdd8a..18175dd7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -4,6 +4,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -237,9 +238,7 @@ public void setQueryStringCaseSensitive(boolean queryStringCaseSensitive) { */ public void addBinaryContentTypes(String... contentTypes) { if(contentTypes != null) { - for(String type: contentTypes) { - binaryContentTypes.add(type); - } + binaryContentTypes.addAll(Arrays.asList(contentTypes)); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java index 11686f11..a29d8e0b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java @@ -168,8 +168,7 @@ public MultiValuedTreeMap clone() { MultiValuedTreeMap clone = new MultiValuedTreeMap<>(); for (Key key : keySet()) { List value = get(key); - List newValue = new ArrayList<>(); - newValue.addAll(value); + List newValue = new ArrayList<>(value); clone.put(key, newValue); } return clone; From f94da5a1e6db7e742c9204574a8aeb70f30137fc Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Thu, 7 Feb 2019 09:59:48 -0600 Subject: [PATCH 0261/1214] `Collections.emptyList()` should be used over EMPTY_LIST to prevent unchecked warnings. --- .../proxy/internal/servlet/AwsProxyRequestPart.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java index a8c6a7c6..6a96b139 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java @@ -117,7 +117,7 @@ public String getHeader(String s) { @Override public Collection getHeaders(String s) { if (headers == null) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } return headers.get(s); } @@ -126,7 +126,7 @@ public Collection getHeaders(String s) { @Override public Collection getHeaderNames() { if (headers == null) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } return headers.keySet(); } From 691094c8c588490987c4127de1f0e557622f1e38 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Thu, 7 Feb 2019 10:35:29 -0600 Subject: [PATCH 0262/1214] Add `@Override` annotations --- .../proxy/AwsProxySecurityContextWriter.java | 1 + .../jaxrs/AwsProxySecurityContext.java | 4 ++++ .../servlet/AwsFilterChainManager.java | 1 + .../servlet/AwsProxyHttpServletRequest.java | 1 + .../proxy/model/MultiValuedTreeMap.java | 20 +++++++++++++++++++ 5 files changed, 27 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java index 4410626d..4805e119 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java @@ -35,6 +35,7 @@ public class AwsProxySecurityContextWriter implements SecurityContextWriter null; @@ -120,16 +121,19 @@ public Principal getUserPrincipal() { } + @Override public boolean isUserInRole(String role) { return (role.equals(event.getRequestContext().getIdentity().getUserArn())); } + @Override public boolean isSecure() { return getAuthenticationScheme() != null; } + @Override public String getAuthenticationScheme() { switch (event.getRequestSource()) { case API_GATEWAY: diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManager.java index 119a15a9..5247633e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManager.java @@ -40,6 +40,7 @@ public class AwsFilterChainManager extends FilterChainManager * Returns the filter holders stored in the AwsServletContext object * @return The map of filter holders */ + @Override protected Map getFilterHolders() { return servletContext.getFilterHolders(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index e13eb261..3dde175c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -567,6 +567,7 @@ public String getServerName() { .append(".amazonaws.com").toString(); } + @Override public int getServerPort() { if (request.getMultiValueHeaders() == null) { return 443; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java index a29d8e0b..b45463b9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java @@ -36,11 +36,13 @@ public MultiValuedTreeMap(Comparator comparator) { map = new TreeMap<>(comparator); } + @Override public void add(Key key, Value value) { List values = findKey(key); values.add(value); } + @Override public Value getFirst(Key key) { List values = get(key); if (values == null || values.size() == 0) { @@ -49,24 +51,29 @@ public Value getFirst(Key key) { return values.get(0); } + @Override public void putSingle(Key key, Value value) { List values = findKey(key); values.clear(); values.add(value); } + @Override public void clear() { map.clear(); } + @Override public boolean containsKey(Object key) { return map.containsKey(key); } + @Override public boolean containsValue(Object value) { return map.containsValue(value); } + @Override public Set>> entrySet() { return map.entrySet(); } @@ -75,6 +82,7 @@ public boolean equals(Object o) { return map.equals(o); } + @Override public List get(Object key) { return map.get(key); } @@ -83,46 +91,56 @@ public int hashCode() { return map.hashCode(); } + @Override public boolean isEmpty() { return map.isEmpty(); } + @Override public Set keySet() { return map.keySet(); } + @Override public List put(Key key, List value) { return map.put(key, value); } + @Override public void putAll(Map> t) { map.putAll(t); } + @Override public List remove(Object key) { return map.remove(key); } + @Override public int size() { return map.size(); } + @Override public Collection> values() { return map.values(); } + @Override public void addAll(Key key, Value... newValues) { for (Value value : newValues) { add(key, value); } } + @Override public void addAll(Key key, List valueList) { for (Value value : valueList) { add(key, value); } } + @Override public void addFirst(Key key, Value value) { List values = get(key); if (values == null) { @@ -133,6 +151,7 @@ public void addFirst(Key key, Value value) { } } + @Override public boolean equalsIgnoreValueOrder(MultivaluedMap vmap) { if (this == vmap) { return true; @@ -163,6 +182,7 @@ private List findKey(Key key) { return values; } + @Override @SuppressFBWarnings("CN_IDIOM_NO_SUPER_CALL") public MultiValuedTreeMap clone() { MultiValuedTreeMap clone = new MultiValuedTreeMap<>(); From 8f3e79a0d1eb6e0dfae301ac97bcda40d07e9220 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Thu, 7 Feb 2019 11:26:13 -0600 Subject: [PATCH 0263/1214] Remove unused imports --- .../proxy/internal/jaxrs/AwsProxySecurityContext.java | 7 ------- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 1 - .../servlet/AwsProxyHttpServletResponseWriter.java | 4 ---- .../proxy/internal/servlet/AwsProxyRequestPart.java | 1 - .../proxy/internal/testutils/AwsProxyRequestBuilder.java | 1 - .../proxy/internal/servlet/AwsHttpServletRequestTest.java | 1 - .../internal/servlet/AwsProxyHttpServletRequestTest.java | 4 ---- .../proxy/jersey/providers/CustomExceptionMapper.java | 1 - .../serverless/proxy/spark/HelloWorldSparkStreamTest.java | 3 --- .../serverless/proxy/spring/SpringBootAppTest.java | 2 -- .../proxy/spring/echoapp/EchoSpringAppConfig.java | 1 - .../spring/echoapp/profile/DefaultProfileResource.java | 1 - .../echoapp/profile/OverrideProfileConfiguration.java | 1 - .../serverless/proxy/spring/profile/SpringProfileTest.java | 5 ----- .../proxy/spring/springbootapp/LambdaHandler.java | 3 --- 15 files changed, 36 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 61c529f5..025dceac 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -12,21 +12,14 @@ */ package com.amazonaws.serverless.proxy.internal.jaxrs; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.type.TypeReference; - import javax.ws.rs.core.SecurityContext; -import java.io.IOException; import java.security.Principal; -import java.util.Base64; -import java.util.Map; -import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.*; import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.RequestSource.API_GATEWAY; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 3dde175c..b14c6cce 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -65,7 +65,6 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index e81e442f..32a86f66 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -21,13 +21,9 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.apache.http.HttpStatus; - import javax.ws.rs.core.Response; import java.util.Base64; -import java.util.HashMap; -import java.util.Map; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java index 6a96b139..a6a418c2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java @@ -18,7 +18,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.servlet.http.Part; -import javax.ws.rs.core.MultivaluedHashMap; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index fa450444..f69fafb3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -38,7 +38,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index eac04ef6..453a01af 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -15,7 +15,6 @@ import static org.junit.Assert.*; import java.util.List; -import java.util.Map; public class AwsHttpServletRequestTest { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index eb40cd2d..05a731a8 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -3,9 +3,7 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import org.apache.commons.io.input.NullInputStream; import org.junit.Test; import javax.servlet.http.HttpServletRequest; @@ -15,8 +13,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.ZonedDateTime; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java index e0c7d164..a800d114 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java @@ -3,7 +3,6 @@ import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index 2fa334fb..74cd5504 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -8,7 +8,6 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.apache.commons.io.IOUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -17,12 +16,10 @@ import spark.Spark; import javax.servlet.http.Cookie; -import javax.ws.rs.core.HttpHeaders; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.util.Arrays; import java.util.Collection; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 406fff05..5e3922f7 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -9,13 +9,11 @@ import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestController; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import java.io.IOException; -import java.util.Map; import static org.junit.Assert.*; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index b5a42d98..d9f49e7c 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -11,7 +11,6 @@ import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java index e365bd5e..5b6cdea2 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/DefaultProfileResource.java @@ -3,7 +3,6 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java index 8d12b967..2738b6a1 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/profile/OverrideProfileConfiguration.java @@ -3,7 +3,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; @Configuration diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index 82ec9db5..727a4cdc 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -1,9 +1,5 @@ package com.amazonaws.serverless.proxy.spring.profile; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; @@ -22,7 +18,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import static org.junit.Assert.assertEquals; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java index 1451b9c0..4ca9c4b2 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java @@ -5,13 +5,10 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -import org.springframework.web.context.support.XmlWebApplicationContext; - public class LambdaHandler implements RequestHandler From 6ade6280af839babb12b2c289f308e10596f19dd Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Fri, 8 Feb 2019 15:35:02 +0100 Subject: [PATCH 0264/1214] Solve dependency issue with log4j2 and commons fileupload versions https://github.com/awslabs/aws-serverless-java-container/pull/233 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index bff7e674..02a535a3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -62,7 +62,7 @@ commons-fileupload commons-fileupload - 1.3.3 + 1.4 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e0dce7e0..49942915 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -70,7 +70,7 @@ org.apache.logging.log4j log4j-to-slf4j - 2.10.0 + 2.11.1 org.slf4j diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 7fbc5293..a1ca2962 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.20 2.9.8 4.12 - 2.8.2 + 2.11.1 diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 76126659..b104bd71 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.20 2.9.8 4.12 - 2.8.2 + 2.11.1 From 1ee3be67495112c468b39090cd5be333b9e0f67f Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 12 Feb 2019 11:44:15 -0800 Subject: [PATCH 0265/1214] Added unit test to replicate and investigate #223 --- .../servlet/AwsProxyHttpServletRequest.java | 2 +- .../testutils/AwsProxyRequestBuilder.java | 39 ++++++++------- aws-serverless-java-container-jersey/pom.xml | 6 +++ .../proxy/jersey/EchoJerseyResource.java | 39 ++++++++++++++- .../proxy/jersey/JerseyAwsProxyTest.java | 2 + .../proxy/jersey/JerseyParamEncodingTest.java | 47 ++++++++++++++++++- 6 files changed, 115 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index b14c6cce..7783a95a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -429,7 +429,7 @@ public ServletInputStream getInputStream() if (request.getBody() == null) { return new AwsServletInputStream(new NullInputStream(0, false, false)); } - byte[] bodyBytes = null; + byte[] bodyBytes; if (request.isBase64Encoded()) { bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); } else { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index f69fafb3..47c3b97c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -29,6 +29,7 @@ import org.apache.http.HttpEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.ByteArrayBody; +import org.apache.http.entity.mime.content.StringBody; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -143,34 +144,40 @@ public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, by multipartBuilder = MultipartEntityBuilder.create(); } multipartBuilder.addPart(fieldName, new ByteArrayBody(content, fileName)); - HttpEntity bodyEntity = multipartBuilder.build(); - InputStream bodyStream = bodyEntity.getContent(); - byte[] buffer = new byte[bodyStream.available()]; - IOUtils.readFully(bodyStream, buffer); - request.setBody("\n\n" + new String(buffer, Charset.defaultCharset())); - if (request.getMultiValueHeaders() == null) { - request.setMultiValueHeaders(new Headers()); - } - request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue()); - if (bodyEntity.getContentEncoding() != null) { - request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_ENCODING, bodyEntity.getContentEncoding().getValue()); - } - request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + ""); + buildMultipartBody(); return this; } - public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) { + public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) + throws IOException { if (request.getMultiValueHeaders() == null) { request.setMultiValueHeaders(new Headers()); } - request.getMultiValueHeaders().add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA); if (multipartBuilder == null) { multipartBuilder = MultipartEntityBuilder.create(); } - // TODO: implement + multipartBuilder.addPart(fieldName, new StringBody(fieldValue)); + buildMultipartBody(); return this; } + private void buildMultipartBody() + throws IOException { + HttpEntity bodyEntity = multipartBuilder.build(); + InputStream bodyStream = bodyEntity.getContent(); + byte[] buffer = new byte[bodyStream.available()]; + IOUtils.readFully(bodyStream, buffer); + byte[] finalBuffer = new byte[buffer.length + 1]; + byte[] newLineBytes = "\n\n".getBytes(LambdaContainerHandler.getContainerConfig().getDefaultContentCharset()); + System.arraycopy(newLineBytes, 0, finalBuffer, 0, newLineBytes.length); + System.arraycopy(buffer, 0, finalBuffer, newLineBytes.length - 1, buffer.length); + request.setBody(Base64.getMimeEncoder().encodeToString(finalBuffer)); + request.setIsBase64Encoded(true); + this.request.setMultiValueHeaders(new Headers()); + header(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue()); + header(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + ""); + } + public AwsProxyRequestBuilder header(String key, String value) { if (this.request.getMultiValueHeaders() == null) { diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 8fdf2de9..b278936f 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -88,6 +88,12 @@ + + org.glassfish.jersey.media + jersey-media-multipart + ${jersey.version} + test + diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index db552d71..1e62291d 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -13,11 +13,17 @@ package com.amazonaws.serverless.proxy.jersey; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; +import org.apache.commons.io.IOUtils; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataMultiPart; +import org.glassfish.jersey.media.multipart.FormDataParam; + import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -29,10 +35,17 @@ import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.Enumeration; import java.util.List; import java.util.Random; +import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; + /** * Jersey application class for aws-serverless-java-container unit proxy @@ -230,9 +243,33 @@ public Response encodedPathParam(@Encoded @PathParam("resource") String resource @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response referer(@HeaderParam("Referer") String referer) { - System.out.println("Received referer: " + referer); SingleValueModel sv = new SingleValueModel(); sv.setValue(referer); return Response.ok(sv).build(); } + + @Path("/file-size") @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.APPLICATION_JSON) + public Response fileSize(@FormDataParam("file") final File uploadedFile, + @FormDataParam("file") FormDataContentDisposition fileDetail, + @Context ContainerRequestContext req) { + SingleValueModel sv = new SingleValueModel(); + + System.out.println( + "Is base64 encoded: " + + ((AwsProxyHttpServletRequest)req.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY)).getAwsProxyRequest().isBase64Encoded() + ); + + try { + InputStream fileIs = new FileInputStream(uploadedFile); + System.out.println("File: " + fileDetail.getName() + " " + fileDetail.getFileName() + " " + fileDetail.getSize()); + System.out.println("Size: " + fileIs.available()); + sv.setValue("" + fileIs.available()); + return Response.ok(sv).build(); + } catch (IOException e) { + e.printStackTrace(); + return Response.status(500).build(); + } + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 5943b7fc..49179795 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.glassfish.jersey.logging.LoggingFeature; +import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Test; import org.junit.runner.RunWith; @@ -59,6 +60,7 @@ public class JerseyAwsProxyTest { private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") .register(LoggingFeature.class) .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 07bfac53..e3eb92de 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.proxy.jersey; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; @@ -11,17 +12,24 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.glassfish.jersey.logging.LoggingFeature; +import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import javax.ws.rs.core.MediaType; + import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Arrays; import java.util.Collection; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -36,12 +44,33 @@ public class JerseyParamEncodingTest { private static final String QUERY_STRING_KEY = "identifier"; private static final String QUERY_STRING_NON_ENCODED_VALUE = "Space Test"; private static final String QUERY_STRING_ENCODED_VALUE = "Space%20Test"; + private static final byte[] FILE_CONTENTS = new byte[] { + (byte)47, (byte)85, (byte)135, (byte)12, (byte)53, (byte)7, (byte)158, (byte)212, (byte)55, (byte)193, (byte)149, (byte)3, (byte)166, (byte)181, + (byte)151, (byte)84, (byte)122, (byte)200, (byte)244, (byte)5, (byte)115, (byte)159, (byte)66, (byte)64, (byte)143, (byte)211, (byte)13, (byte)63, + (byte)235, (byte)184, (byte)51, (byte)49, (byte)143, (byte)167, (byte)231, (byte)31, (byte)78, (byte)234, (byte)145, (byte)105, (byte)190, (byte)170, + (byte)49, (byte)135, (byte)175, (byte)106, (byte)25, (byte)86, (byte)145, (byte)181, (byte)156, (byte)23, (byte)153, (byte)99, (byte)175, (byte)63, + (byte)43, (byte)208, (byte)5, (byte)16, (byte)140, (byte)103, (byte)146, (byte)254, (byte)155, (byte)97, (byte)53, (byte)100, (byte)137, (byte)6, + (byte)62, (byte)101, (byte)189, (byte)137, (byte)140, (byte)5, (byte)110, (byte)218, (byte)113, (byte)132, (byte)36, (byte)188, (byte)19, (byte)168, + (byte)93, (byte)169, (byte)124, (byte)253, (byte)201, (byte)233, (byte)21, (byte)80, (byte)4, (byte)56, (byte)0, (byte)204, (byte)205, (byte)232, + (byte)213, (byte)253, (byte)232, (byte)91, (byte)153, (byte)169, (byte)82, (byte)247, (byte)78, (byte)71, (byte)188, (byte)71, (byte)23, (byte)171, + (byte)232, (byte)26, (byte)146, (byte)189, (byte)145, (byte)82, (byte)79, (byte)148, (byte)1, (byte)201, (byte)243, (byte)73, (byte)98, (byte)65, + (byte)236, (byte)177, (byte)211, (byte)106, (byte)105, (byte)46, (byte)204, (byte)214, (byte)55, (byte)182, (byte)55, (byte)149, (byte)221, (byte)52, + (byte)186, (byte)122, (byte)255, (byte)195, (byte)60, (byte)146, (byte)21, (byte)212, (byte)139, (byte)38, (byte)146, (byte)166, (byte)14, (byte)174, + (byte)242, (byte)145, (byte)16, (byte)44, (byte)68, (byte)89, (byte)25, (byte)219, (byte)62, (byte)227, (byte)6, (byte)89, (byte)194, (byte)146, (byte)93, + (byte)167, (byte)230, (byte)90, (byte)59, (byte)35, (byte)136, (byte)37, (byte)196, (byte)118, (byte)16, (byte)28, (byte)107, (byte)105, (byte)87, + (byte)195, (byte)86, (byte)87, (byte)180, (byte)176, (byte)118, (byte)6, (byte)29, (byte)26, (byte)51, (byte)94, (byte)21, (byte)23, (byte)32, (byte)156, + (byte)150, (byte)204, (byte)53, (byte)110, (byte)134, (byte)153, (byte)138, (byte)247, (byte)98, (byte)135, (byte)249, (byte)119, (byte)121, (byte)2, + (byte)42, (byte)62, (byte)198, (byte)197, (byte)112, (byte)153, (byte)244, (byte)174, (byte)145, (byte)54, (byte)246, (byte)44, (byte)198, (byte)50, + (byte)2, (byte)37, (byte)102, (byte)50, (byte)103, (byte)207, (byte)81, (byte)62, (byte)138, (byte)164, (byte)140, (byte)64, (byte)247, (byte)115, + (byte)40, (byte)41, (byte)252, (byte)54, (byte)189, (byte)207, (byte)124, (byte)147, (byte)122, (byte)243, (byte)83, (byte)34, (byte)160, (byte)64, (byte)189, (byte)226, (byte)202, (byte)181, (byte)55, (byte)158, (byte)121, (byte)78, (byte)143, (byte)41, (byte)58, (byte)27, (byte)77, (byte)186, (byte)214, (byte)23, (byte)132, (byte)100, (byte)180, (byte)26, (byte)37, (byte)247, (byte)254, (byte)97, (byte)214, (byte)57, (byte)30, (byte)46, (byte)96, (byte)44, (byte)138, (byte)15, (byte)162, (byte)93, (byte)222, (byte)239, (byte)189, (byte)72, (byte)15, (byte)79, (byte)136, (byte)210, (byte)44, (byte)233, (byte)99, (byte)72, (byte)234, (byte)225, (byte)245, (byte)27, (byte)111, (byte)175, (byte)132, (byte)112, (byte)135, (byte)253, (byte)66, (byte)215, (byte)168, (byte)156, (byte)168, (byte)79, (byte)78, (byte)140, (byte)14, (byte)129, (byte)37, (byte)238, (byte)196, (byte)34, (byte)245, (byte)141, (byte)148, (byte)161, (byte)29, (byte)110, (byte)32, (byte)255, (byte)247, (byte)52, (byte)48, (byte)102, (byte)42, (byte)54, (byte)97, (byte)185, (byte)10, (byte)114, (byte)225, (byte)247, (byte)254, (byte)108, (byte)116, (byte)73, (byte)84, (byte)242, (byte)86, (byte)15, (byte)72, (byte)68, (byte)172, (byte)74, (byte)107, (byte)103, (byte)222, (byte)246, (byte)152, (byte)67, (byte)12, (byte)104, (byte)245, (byte)20, (byte)112, (byte)94, (byte)197, (byte)201, (byte)89, (byte)182, (byte)214, (byte)6, (byte)182, (byte)165, (byte)209, (byte)79, (byte)192, (byte)211, (byte)163, (byte)208, (byte)12, (byte)73, (byte)53, (byte)99, (byte)59, (byte)182, (byte)186, (byte)48, (byte)184, (byte)215, (byte)22, (byte)24, (byte)233, (byte)109, (byte)206, (byte)59, (byte)0, (byte)118, (byte)141, (byte)25, (byte)50, (byte)242, (byte)247, (byte)240, (byte)238, (byte)127, (byte)236, (byte)241, (byte)224, (byte)20, (byte)61, (byte)65, (byte)148, (byte)120, (byte)192, (byte)99, (byte)172, (byte)194, (byte)135, (byte)61, (byte)147, (byte)251, (byte)161, (byte)219, (byte)252, (byte)187, (byte)154, (byte)115, (byte)193, (byte)118, (byte)167, (byte)130, (byte)174, (byte)211, (byte)236, (byte)141, (byte)14, (byte)8, (byte)244, (byte)110, (byte)66, (byte)210, (byte)110, (byte)236, (byte)255, (byte)25, (byte)16, (byte)134, (byte)70, (byte)196, (byte)163, (byte)30, (byte)177, (byte)238, (byte)225, (byte)237, (byte)12, (byte)14, (byte)215, (byte)40, (byte)77, (byte)206, (byte)76, (byte)122, (byte)205, (byte)20, (byte)183, (byte)106, (byte)230, (byte)230, (byte)123, (byte)209, (byte)77, (byte)102, (byte)65, (byte)241, (byte)41, (byte)213, (byte)219, (byte)79, (byte)37, (byte)61, (byte)10, (byte)154, (byte)19, (byte)93, (byte)33, (byte)72, (byte)105, (byte)247, (byte)221, (byte)145, (byte)179, (byte)69, (byte)38, (byte)234, (byte)163, (byte)218, (byte)131, (byte)179, (byte)30, (byte)114, (byte)150, (byte)106, (byte)17, (byte)187, (byte)229, (byte)106, (byte)7, (byte)112 + }; private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") - .register(LoggingFeature.class) - .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + .register(MultiPartFeature.class) + .property("jersey.config.server.tracing.type", "ALL") + .property("jersey.config.server.tracing.threshold", "VERBOSE"); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); private static Context lambdaContext = new MockLambdaContext(); @@ -50,6 +79,7 @@ public class JerseyParamEncodingTest { public JerseyParamEncodingTest(boolean alb) { isAlb = alb; + LambdaContainerHandler.getContainerConfig().addBinaryContentTypes(MediaType.MULTIPART_FORM_DATA); } @Parameterized.Parameters @@ -195,6 +225,19 @@ public void queryParam_listOfString_expectCorrectLength() { validateSingleValueModel(resp, "3"); } + @Test + public void multipart_getFileSize_expectCorrectLength() + throws IOException { + AwsProxyRequest request = getRequestBuilder("/echo/file-size", "POST") + .formFilePart("file", "myfile.jpg", FILE_CONTENTS) + //.formFieldPart("name", QUERY_STRING_ENCODED_VALUE) + .build(); + AwsProxyResponse resp = handler.proxy(request, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, "" + FILE_CONTENTS.length); + } + private void validateSingleValueModel(AwsProxyResponse output, String value) { try { SingleValueModel response = objectMapper.readValue(output.getBody(), SingleValueModel.class); From 83c19d62e1bd41e66a868c05bd69f367b9e35036 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 12 Feb 2019 15:14:41 -0800 Subject: [PATCH 0266/1214] Removed legacy event listener from application initializer to address #225 --- .../spring/LambdaSpringApplicationInitializer.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java index 7207b9c0..af9d721d 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java @@ -142,18 +142,6 @@ public void onStartup(ServletContext servletContext) throws ServletException { DefaultDispatcherConfig dispatcherConfig = new DefaultDispatcherConfig(servletContext); applicationContext.setServletConfig(dispatcherConfig); - // Configure the listener for the request handled events. All we do here is release the latch - applicationContext.addApplicationListener((ApplicationListener) servletRequestHandledEvent -> { - try { - if (currentResponse != null) { - currentResponse.flushBuffer(); - } - } catch (IOException e) { - log.error("Could not flush response buffer", e); - throw new RuntimeException("Could not flush response buffer", e); - } - }); - // Manage the lifecycle of the root application context this.addListener(new ContextLoaderListener(applicationContext)); From 4822f3eeb7d32afd283355f34cf6d12872ffce15 Mon Sep 17 00:00:00 2001 From: sapessi Date: Tue, 12 Feb 2019 15:35:24 -0800 Subject: [PATCH 0267/1214] Basic validation on proxy request object. If the object does not contain an HTTP method and a request context we throw an . This addresses #237 by making the error more explicit. --- .../AwsProxyHttpServletRequestReader.java | 6 +++ .../AwsProxyHttpServletRequestReaderTest.java | 39 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index e8a0f21c..9e3fa41e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -26,6 +26,7 @@ * object and uses it to initialize a AwsProxyHttpServletRequest object. */ public class AwsProxyHttpServletRequestReader extends RequestReader { + static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer"; //------------------------------------------------------------- // Methods - Implementation @@ -34,6 +35,11 @@ public class AwsProxyHttpServletRequestReader extends RequestReader Date: Wed, 13 Feb 2019 09:23:39 -0800 Subject: [PATCH 0268/1214] Added null check for multivalue headers and updated unit tests to address #232 --- .../AwsProxyHttpServletRequestReader.java | 2 +- .../AwsProxyHttpServletRequestReaderTest.java | 33 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 9e3fa41e..6b687fb8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -42,7 +42,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC } request.setPath(stripBasePath(request.getPath(), config)); - if (request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE) != null) { + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE) != null) { String contentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); // put single as we always expect to have one and only one content type in a request. request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, getContentTypeWithCharset(contentType, config)); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 7d66fafd..72270b87 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -111,7 +111,7 @@ public void readRequest_contentCharset_appendsCharsetToComplextContentType() { } @Test - public void readRequest_validEventEmptyPath_expectExcepion() { + public void readRequest_validEventEmptyPath_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder(null, "GET").build(); AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); @@ -123,7 +123,7 @@ public void readRequest_validEventEmptyPath_expectExcepion() { } @Test - public void readRequest_invalidEventEmptyMethod_expectExcepion() { + public void readRequest_invalidEventEmptyMethod_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", null).build(); reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); @@ -135,7 +135,7 @@ public void readRequest_invalidEventEmptyMethod_expectExcepion() { } @Test - public void readRequest_invalidEventEmptyContext_expectExcepion() { + public void readRequest_invalidEventEmptyContext_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); req.setRequestContext(null); @@ -146,4 +146,31 @@ public void readRequest_invalidEventEmptyContext_expectExcepion() { e.printStackTrace(); } } + + @Test + public void readRequest_nullHeaders_expectSuccess() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); + req.setMultiValueHeaders(null); + try { + AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); + String headerValue = servletReq.getHeader(HttpHeaders.CONTENT_TYPE); + assertNull(headerValue); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Failed to read request with null headers"); + } + } + + @Test + public void readRequest_emptyHeaders_expectSuccess() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); + try { + AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); + String headerValue = servletReq.getHeader(HttpHeaders.CONTENT_TYPE); + assertNull(headerValue); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Failed to read request with null headers"); + } + } } From 98a6de016e3536d9ce2b2dbea19e2a5d48d7d852 Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:25:04 -0800 Subject: [PATCH 0269/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md index 8d7d10e1..82a59465 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spark-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From 90043cbae7c5f873acbbd614739781cecabd2732 Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:26:09 -0800 Subject: [PATCH 0270/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md index f3c22945..de5f4671 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From 4ad25f3905bc1cce43d38ed9492b2e0f375e6091 Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:26:57 -0800 Subject: [PATCH 0271/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md index 172d275e..1bb92991 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From 7fdc7792ee3df09dcf2341e64e788aa295b81bca Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:27:31 -0800 Subject: [PATCH 0272/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md index d5f8acc5..7be30668 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-struts2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From d71bf7b0f4506bcf00142634063f21a6d235f8c5 Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:28:20 -0800 Subject: [PATCH 0273/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md index 49b29f54..3f99b344 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From d48554f98bb5527fc041078e5148ff5f2c91a260 Mon Sep 17 00:00:00 2001 From: orozcoadrian Date: Fri, 15 Feb 2019 16:29:27 -0800 Subject: [PATCH 0274/1214] Update README.md --- .../src/main/resources/archetype-resources/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md index 84bd1063..43a3683f 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md @@ -23,7 +23,7 @@ The starter project defines a simple `/ping` resource that can accept `GET` requ The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). ## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the projct folder. +Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} @@ -125,4 +125,4 @@ $ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python { "pong": "Hello, World!" } -``` \ No newline at end of file +``` From 96d57226143f0ce30c0e23a5c1a83038475b8f9c Mon Sep 17 00:00:00 2001 From: Buliani Date: Fri, 22 Feb 2019 12:23:01 -0800 Subject: [PATCH 0275/1214] Updated version to prepare for patch release --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 02a535a3..08ea143c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b278936f..c2960840 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index ce884e6e..47a19f90 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 22ce578b..21011cc4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 49942915..edd2ed2b 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d89ca75b..4bc3bc7a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 65c870e5..ada98571 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 35331470..225918a6 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 011cc1a9..562c5f68 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 2ade62df..fb4ac835 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c3578068..47048ca5 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index 74903bc7..ec65c479 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.4-SNAPSHOT + 1.3.1-SNAPSHOT AWS Serverless Java container From 67d63060381569a4b7563b973da73f781f0d630d Mon Sep 17 00:00:00 2001 From: Buliani Date: Mon, 25 Feb 2019 10:41:18 -0800 Subject: [PATCH 0276/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.3.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 08ea143c..958118e6 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index c2960840..36b5161d 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1-SNAPSHOT + 1.3.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 47a19f90..8055025a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1-SNAPSHOT + 1.3.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 21011cc4..9b9992f8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1-SNAPSHOT + 1.3.1 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index edd2ed2b..b7b5cb4e 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1-SNAPSHOT + 1.3.1 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 4bc3bc7a..b14635f2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ada98571..5f4b9133 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 225918a6..f4269007 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 562c5f68..3d7a147c 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index fb4ac835..51ad5c0c 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 47048ca5..740851b1 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1-SNAPSHOT + 1.3.1 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.3.1-SNAPSHOT + 1.3.1 maven-archetype diff --git a/pom.xml b/pom.xml index ec65c479..27a3b1b6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.3.1-SNAPSHOT + 1.3.1 AWS Serverless Java container From e4f4d4de6016a60d3fe728181d24aa4d91e645ec Mon Sep 17 00:00:00 2001 From: Buliani Date: Mon, 25 Feb 2019 10:41:19 -0800 Subject: [PATCH 0277/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 958118e6..02a535a3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 36b5161d..b278936f 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1 + 1.4-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 8055025a..ce884e6e 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9b9992f8..22ce578b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index b7b5cb4e..49942915 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.1 + 1.4-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index b14635f2..d89ca75b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 5f4b9133..65c870e5 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index f4269007..35331470 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 3d7a147c..011cc1a9 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 51ad5c0c..2ade62df 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 740851b1..c3578068 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.1 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.3.1 + 1.4-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index 27a3b1b6..74903bc7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.3.1 + 1.4-SNAPSHOT AWS Serverless Java container From e48449c046bd4dc6c59c9539f6288a0272ba8937 Mon Sep 17 00:00:00 2001 From: Damien Metzler Date: Thu, 18 Apr 2019 11:58:36 -0700 Subject: [PATCH 0278/1214] expose the Jersey injection manager to be able to use it outside of Jersey resources --- .../jersey/JerseyLambdaContainerHandler.java | 9 +++ .../proxy/jersey/JerseyInjectionTest.java | 59 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 576d2b66..dd9166f7 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -34,6 +34,7 @@ import com.amazonaws.services.lambda.runtime.Context; import org.glassfish.jersey.internal.inject.AbstractBinder; +import org.glassfish.jersey.internal.inject.InjectionManager; import org.glassfish.jersey.process.internal.RequestScoped; import org.glassfish.jersey.server.ResourceConfig; @@ -196,4 +197,12 @@ public void initialize() { Timer.stop("JERSEY_COLD_START_INIT"); initialized = true; } + + + public InjectionManager getInjectionManager() { + if (!initialized) { + initialize(); + } + return jerseyFilter.getApplicationHandler().getInjectionManager(); + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java new file mode 100644 index 00000000..0af2785e --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.jersey; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import javax.inject.Singleton; + +import org.glassfish.jersey.internal.inject.AbstractBinder; +import org.glassfish.jersey.media.multipart.MultiPartFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.Test; + +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; + +/** + * Test that one can access the Jersey injection manager + */ +public class JerseyInjectionTest { + + // Test ressource binder + private static class ResourceBinder extends AbstractBinder { + + @Override + protected void configure() { + bind(new JerseyInjectionTest()).to(JerseyInjectionTest.class).in(Singleton.class); + } + + } + + private static ResourceConfig app = new ResourceConfig().register(MultiPartFeature.class) + .register(new ResourceBinder()); + + private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler( + app); + + @Test + public void can_get_injected_resources() throws Exception { + + JerseyInjectionTest instance1 = handler.getInjectionManager().getInstance(JerseyInjectionTest.class); + assertNotNull(instance1); + + JerseyInjectionTest instance2 = handler.getInjectionManager().getInstance(JerseyInjectionTest.class); + assertEquals(instance1, instance2); + + } +} From 2a4de7fa06d2ad0aef53444f0b6b80287c016b47 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 08:41:12 -0700 Subject: [PATCH 0279/1214] Bump jackson version to 2.9.9 to address security alerts --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 02a535a3..82d218f9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.9.8 + 2.9.9 2.1 3.1.0 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b278936f..f92c9d70 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -60,7 +60,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.8 + 2.9.9 true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 22ce578b..bbab50a5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -19,7 +19,7 @@ 5.1.1.RELEASE 1.5.17.RELEASE 5.1.1.RELEASE - 2.9.8 + 2.9.9 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 49942915..f981e087 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ 2.5.20 - 2.9.8 + 2.9.9 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index b94697c7..54951172 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.27 - 2.9.8 + 2.9.9 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index eec41cd2..ca9d4dd1 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.9.8 + 2.9.9 2.8.0 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index a1ca2962..3e224f4a 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.20 - 2.9.8 + 2.9.9 4.12 2.11.1 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index daf6b67c..d85e13b0 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -77,7 +77,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.8 + 2.9.9 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 09502efd..32181f3c 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.8 + 2.9.9 2.8.0 diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index b104bd71..5763b94a 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.20 - 2.9.8 + 2.9.9 4.12 2.11.1 From 2d1646380d9c0a09428c84f7f030952372f1754d Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 09:06:16 -0700 Subject: [PATCH 0280/1214] Added tests to validate #262 and jackson annotation to isBase64Encoded field in the request object --- .../proxy/model/AwsProxyRequest.java | 3 +- .../proxy/model/AwsProxyRequestTest.java | 92 ++++++++++++++++++- 2 files changed, 90 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index afea70f9..d361d674 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.HashMap; import java.util.Map; @@ -167,7 +168,7 @@ public void setPath(String path) { this.path = path; } - + @JsonProperty("isBase64Encoded") public boolean isBase64Encoded() { return isBase64Encoded; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java index 6763bbda..0b82c4bd 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -1,12 +1,13 @@ package com.amazonaws.serverless.proxy.model; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.*; public class AwsProxyRequestTest { private static final String CUSTOM_HEADER_KEY_LOWER_CASE = "custom-header"; @@ -67,13 +68,96 @@ public class AwsProxyRequestTest { " \"apiId\": \"apiId\"\n" + " },\n" + " \"body\": null,\n" + - " \"isBase64Encoded\": false\n" + + " \"isBase64Encoded\": true\n" + "}"; @Test public void deserialize_multiValuedHeaders_caseInsensitive() throws IOException { - AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString(REQUEST_JSON).build(); + AwsProxyRequest req = new AwsProxyRequestBuilder() + .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); assertNotNull(req.getMultiValueHeaders().get(CUSTOM_HEADER_KEY_LOWER_CASE.toUpperCase())); assertEquals(CUSTOM_HEADER_VALUE, req.getMultiValueHeaders().get(CUSTOM_HEADER_KEY_LOWER_CASE.toUpperCase()).get(0)); + assertTrue(req.isBase64Encoded()); + } + + @Test + public void deserialize_base64Encoded_readsBoolCorrectly() throws IOException { + AwsProxyRequest req = new AwsProxyRequestBuilder() + .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); + assertTrue(req.isBase64Encoded()); + req = new AwsProxyRequestBuilder() + .fromJsonString(getRequestJson(false, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); + assertFalse(req.isBase64Encoded()); + } + + @Test + public void serialize_base64Encoded_fieldContainsIsPrefix() throws IOException { + AwsProxyRequest req = new AwsProxyRequestBuilder() + .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); + ObjectMapper mapper = new ObjectMapper(); + String serializedRequest = mapper.writeValueAsString(req); + System.out.println(serializedRequest); + assertTrue(serializedRequest.contains("\"isBase64Encoded\":true")); + } + + private String getRequestJson(boolean base64Encoded, String headerKey, String headerValue) { + return "{\n" + + " \"resource\": \"/api/{proxy+}\",\n" + + " \"path\": \"/api/endpoint\",\n" + + " \"httpMethod\": \"OPTIONS\",\n" + + " \"headers\": {\n" + + " \"Accept\": \"*/*\",\n" + + " \"User-Agent\": \"PostmanRuntime/7.1.1\",\n" + + " \"" + headerKey +"\":" + "\"" + headerValue + "\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Accept\": [\n" + + " \"*/*\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"PostmanRuntime/7.1.1\"\n" + + " ],\n" + + " \"" + headerKey + "\": [\n" + + " \"" + headerValue + "\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": null,\n" + + " \"multiValueQueryStringParameters\": null,\n" + + " \"pathParameters\": {\n" + + " \"proxy\": \"endpoint\"\n" + + " },\n" + + " \"stageVariables\": null,\n" + + " \"requestContext\": {\n" + + " \"resourceId\": null,\n" + + " \"resourcePath\": \"/api/{proxy+}\",\n" + + " \"httpMethod\": \"OPTIONS\",\n" + + " \"extendedRequestId\": null,\n" + + " \"requestTime\": \"15/Dec/2018:20:37:47 +0000\",\n" + + " \"path\": \"/api/endpoint\",\n" + + " \"accountId\": null,\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"stage\": \"stage_name\",\n" + + " \"domainPrefix\": null,\n" + + " \"requestTimeEpoch\": 1544906267828,\n" + + " \"requestId\": null,\n" + + " \"identity\": {\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"accountId\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"caller\": null,\n" + + " \"sourceIp\": \"54.240.196.171\",\n" + + " \"accessKey\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"cognitoAuthenticationProvider\": null,\n" + + " \"userArn\": null,\n" + + " \"userAgent\": \"PostmanRuntime/7.1.1\",\n" + + " \"user\": null\n" + + " },\n" + + " \"domainName\": \"https://apiId.execute-api.eu-central-1.amazonaws.com/\",\n" + + " \"apiId\": \"apiId\"\n" + + " },\n" + + " \"body\": null,\n" + + " \"isBase64Encoded\": " + (base64Encoded?"true":"false") + "\n" + + "}"; } } From 0e6468c5be98e38352a84c002db258fe46f05eb9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 09:08:01 -0700 Subject: [PATCH 0281/1214] Changed log message severity in setCharacterEncoding to debug to address issue #261 --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 7783a95a..96c925b7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -366,7 +366,7 @@ public void setCharacterEncoding(String s) throws UnsupportedEncodingException { String currentContentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (currentContentType == null || "".equals(currentContentType)) { - log.error("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); + log.debug("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); return; } From 4032d14733c43a48e09634e3136c29fc2ccac642 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 10:34:03 -0700 Subject: [PATCH 0282/1214] Change parse header function to handle base64 encoded values in headers (#263) --- .../internal/servlet/AwsHttpServletRequest.java | 12 +++++++++++- .../internal/servlet/AwsHttpServletRequestTest.java | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 86ce6250..7fa9d138 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -13,12 +13,18 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.apache.http.HeaderElement; +import org.apache.http.message.BasicHeaderValueParser; +import org.apache.http.message.ParserCursor; +import org.apache.http.util.CharArrayBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,6 +83,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private ServletContext servletContext; private AwsHttpSession session; private String queryString; + private BasicHeaderValueParser headerParser; protected DispatcherType dispatcherType; @@ -95,6 +102,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { AwsHttpServletRequest(Context lambdaContext) { this.lambdaContext = lambdaContext; attributes = new HashMap<>(); + headerParser = new BasicHeaderValueParser(); } @@ -352,6 +360,7 @@ protected List parseHeaderValue(String headerValue, String valueSep // Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 // Cookie: name=value; name2=value2; name3=value3 + // X-Custom-Header: YQ== List values = new ArrayList<>(); if (headerValue == null) { @@ -365,7 +374,8 @@ protected List parseHeaderValue(String headerValue, String valueSep newValue.setRawValue(v); for (String q : curValue.split(qualifierSeparator)) { - if (q.contains(HEADER_KEY_VALUE_SEPARATOR)) { + // contains key/value pairs and it's not a base64-encoded value. + if (q.contains(HEADER_KEY_VALUE_SEPARATOR) && !q.trim().endsWith("==")) { String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR); // TODO: Should we concatenate the rest of the values? if (newValue.getValue() == null) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 453a01af..c0f20f19 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -14,6 +14,7 @@ import static org.junit.Assert.*; +import java.util.Base64; import java.util.List; @@ -75,6 +76,17 @@ public void headers_parseHeaderValue_complexAccept() { assertEquals(4, values.size()); } + @Test + public void headers_parseHeaderValue_encodedContentWithEquals() { + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null,null,null); + + String value = Base64.getUrlEncoder().encodeToString("a".getBytes()); + + List result = context.parseHeaderValue(value); + + assertEquals("YQ==", result.get(0).getValue()); + } + @Test public void queryString_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); From 9098e3e6e44b69c06f5e368b2fc9fc64554af941 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 10:43:29 -0700 Subject: [PATCH 0283/1214] Fixed bug with multipart form field name and file name being inverted and added unit test (#258) --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 4 ++-- .../servlet/AwsProxyHttpServletRequestFormTest.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 96c925b7..dd77135f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -709,8 +709,8 @@ private Map getMultipartFormParametersMap() { for (FileItem item : items) { String fileName = FilenameUtils.getName(item.getName()); AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(fileName); - newPart.setSubmittedFileName(item.getFieldName()); + newPart.setName(item.getFieldName()); + newPart.setSubmittedFileName(fileName); newPart.setContentType(item.getContentType()); newPart.setSize(item.getSize()); item.getHeaders().getHeaderNames().forEachRemaining(h -> { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index ff09b7dd..b20982b7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -6,6 +6,7 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; +import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.Test; @@ -31,6 +32,7 @@ public class AwsProxyHttpServletRequestFormTest { private static final String PART_KEY_2 = "test2"; private static final String PART_VALUE_2 = "value2"; private static final String FILE_KEY = "file_upload_1"; + private static final String FILE_NAME = "testImage.jpg"; private static final String ENCODED_VALUE = "test123a%3D1%262@3"; @@ -46,7 +48,7 @@ public class AwsProxyHttpServletRequestFormTest { private static final HttpEntity MULTIPART_BINARY_DATA = MultipartEntityBuilder.create() .addTextBody(PART_KEY_1, PART_VALUE_1) .addTextBody(PART_KEY_2, PART_VALUE_2) - .addBinaryBody(FILE_KEY, FILE_BYTES) + .addBinaryBody(FILE_KEY, FILE_BYTES, ContentType.IMAGE_JPEG, FILE_NAME) .build(); private static final String ENCODED_FORM_ENTITY = PART_KEY_1 + "=" + ENCODED_VALUE + "&" + PART_KEY_2 + "=" + PART_VALUE_2; @@ -99,6 +101,8 @@ public void multipart_getParts_binary() { assertEquals(3, request.getParts().size()); assertNotNull(request.getPart(FILE_KEY)); assertEquals(FILE_SIZE, request.getPart(FILE_KEY).getSize()); + assertEquals(FILE_KEY, request.getPart(FILE_KEY).getName()); + assertEquals(FILE_NAME, request.getPart(FILE_KEY).getSubmittedFileName()); assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream())); assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream())); } catch (IOException | ServletException e) { From c6f96b4f0b444a90c6b28ca390c7310ccd1c97af Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 11:08:59 -0700 Subject: [PATCH 0284/1214] Fix for empty header values as well as empty query string values (#247) --- .../servlet/AwsHttpServletRequest.java | 27 ++++++++++++------- .../servlet/AwsHttpServletRequestTest.java | 15 +++++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 7fa9d138..3aabc35f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -320,10 +320,12 @@ protected String generateQueryString(MultiValuedTreeMap paramete queryStringBuilder.append(key); } queryStringBuilder.append("="); - if (encode) { - queryStringBuilder.append(URLEncoder.encode(val, encodeCharset)); - } else { - queryStringBuilder.append(val); + if (val != null) { + if (encode) { + queryStringBuilder.append(URLEncoder.encode(val, encodeCharset)); + } else { + queryStringBuilder.append(val); + } } } } @@ -342,7 +344,7 @@ protected String generateQueryString(MultiValuedTreeMap paramete * @param headerValue The value to be parsed * @return A list of SimpleMapEntry objects with all of the possible values for the header. */ - protected List parseHeaderValue(String headerValue) { + protected List parseHeaderValue(String headerValue) { return parseHeaderValue(headerValue, HEADER_VALUE_SEPARATOR, HEADER_QUALIFIER_SEPARATOR); } @@ -377,16 +379,21 @@ protected List parseHeaderValue(String headerValue, String valueSep // contains key/value pairs and it's not a base64-encoded value. if (q.contains(HEADER_KEY_VALUE_SEPARATOR) && !q.trim().endsWith("==")) { String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR); + String key = kv[0].trim(); + String val = null; + if (kv.length > 1) { + val = kv[1].trim(); + } // TODO: Should we concatenate the rest of the values? if (newValue.getValue() == null) { - newValue.setKey(kv[0].trim()); - newValue.setValue(kv[1].trim()); + newValue.setKey(key); + newValue.setValue(val); } else { // special case for quality q= - if ("q".equals(kv[0].trim())) { - curPreference = Float.parseFloat(kv[1].trim()); + if ("q".equals(key)) { + curPreference = Float.parseFloat(val); } else { - newValue.addAttribute(kv[0].trim(), kv[1].trim()); + newValue.addAttribute(key, val); } } } else { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index c0f20f19..15a98c0c 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -28,6 +28,8 @@ public class AwsHttpServletRequestTest { .header(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8").build(); private static final AwsProxyRequest queryString = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("three", "four").build(); + private static final AwsProxyRequest queryStringNullValue = new AwsProxyRequestBuilder("/test", "GET") + .queryString("one", "two").queryString("three", null).build(); private static final AwsProxyRequest encodedQueryString = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").build(); private static final AwsProxyRequest multipleParams = new AwsProxyRequestBuilder("/test", "GET") @@ -104,6 +106,19 @@ public void queryString_generateQueryString_validQuery() { assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } + @Test + public void queryString_generateQueryString_nullParameterIsEmpty() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryStringNullValue, mockContext, null, config);String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } + + assertTrue(parsedString.endsWith("three=")); + } + @Test public void queryStringWithEncodedParams_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); From 6cf2398a1578449b5599a178e819c9e69d17ccf8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 20 Jun 2019 11:48:21 -0700 Subject: [PATCH 0285/1214] Additional unit tests on Jersey to validate that it honors the produces annotations (#250) --- .../proxy/jersey/EchoJerseyResource.java | 8 ++++++++ .../proxy/jersey/JerseyAwsProxyTest.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 1e62291d..da67dcf3 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -41,6 +41,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; import java.util.Random; @@ -272,4 +273,11 @@ public Response fileSize(@FormDataParam("file") final File uploadedFile, return Response.status(500).build(); } } + + @Path("/plain") @GET + @Produces(MediaType.TEXT_PLAIN) + @Consumes(MediaType.APPLICATION_JSON) + public Response plain() { + return Response.status(200).entity("Hello!").build(); + } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 49179795..c54de6c5 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -363,6 +363,20 @@ public void refererHeader_headerParam_expectCorrectInjection() { validateSingleValueModel(resp, refererValue); } + @Test + public void textPlainContent_plain_responseHonorsContentType() { + AwsProxyRequest req = getRequestBuilder("/echo/plain", "GET") + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .build(); + + AwsProxyResponse resp = handler.proxy(req, lambdaContext); + assertEquals(200, resp.getStatusCode()); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.TEXT_PLAIN, resp.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).get(0)); + } + private void validateMapResponseModel(AwsProxyResponse output) { validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); } From c01c98fc338138d264bb2dd0ff823ce22d4bf8ad Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 21 Jun 2019 11:03:03 -0700 Subject: [PATCH 0286/1214] Fixed a potential null pointer in security utils and simplified header processing to continue addressing the feedback in #263 --- .../proxy/internal/SecurityUtils.java | 3 + .../servlet/AwsHttpServletRequest.java | 59 +++++++++++-------- .../servlet/AwsHttpServletRequestTest.java | 41 ++++++++++++- 3 files changed, 76 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index 03dced87..1d39d849 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -70,6 +70,9 @@ public static boolean isValidHost(String host, String apiId, String region) { * @return A copy of the original string without CRLF characters */ public static String crlf(String s) { + if (s == null) { + return null; + } return s.replaceAll("[\r\n]", ""); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 3aabc35f..8712285a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -13,18 +13,13 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.apache.http.HeaderElement; import org.apache.http.message.BasicHeaderValueParser; -import org.apache.http.message.ParserCursor; -import org.apache.http.util.CharArrayBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -376,31 +371,44 @@ protected List parseHeaderValue(String headerValue, String valueSep newValue.setRawValue(v); for (String q : curValue.split(qualifierSeparator)) { - // contains key/value pairs and it's not a base64-encoded value. - if (q.contains(HEADER_KEY_VALUE_SEPARATOR) && !q.trim().endsWith("==")) { - String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR); - String key = kv[0].trim(); - String val = null; - if (kv.length > 1) { - val = kv[1].trim(); + + String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR, 2); + String key = null; + String val = null; + // no separator, set the value only + if (kv.length == 1) { + val = q.trim(); + } + // we have a separator + if (kv.length == 2) { + // if the length of the value is 0 we assume that we are looking at a + // base64 encoded value with padding so we just set the value. This is because + // we assume that empty values in a key/value pair will contain at least a white space + if (kv[1].length() == 0) { + val = q.trim(); } - // TODO: Should we concatenate the rest of the values? - if (newValue.getValue() == null) { - newValue.setKey(key); - newValue.setValue(val); - } else { - // special case for quality q= - if ("q".equals(key)) { - curPreference = Float.parseFloat(val); - } else { - newValue.addAttribute(key, val); - } + // this was a base64 string with an additional = for padding, set the value only + if ("=".equals(kv[1].trim())) { + val = q.trim(); + } else { // it's a proper key/value set both + key = kv[0].trim(); + val = ("".equals(kv[1].trim()) ? null : kv[1].trim()); } + } + + if (newValue.getValue() == null) { + newValue.setKey(key); + newValue.setValue(val); } else { - newValue.setValue(q.trim()); + // special case for quality q= + if ("q".equals(key)) { + curPreference = Float.parseFloat(val); + } else { + newValue.addAttribute(key, val); + } } - newValue.setPriority(curPreference); } + newValue.setPriority(curPreference); values.add(newValue); } @@ -428,7 +436,6 @@ protected String decodeRequestPath(String requestPath, ContainerConfig config) { } - /** * Class that represents a header value. */ diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 15a98c0c..3cebc02f 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import javax.servlet.ServletException; +import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; import static org.junit.Assert.*; @@ -85,10 +86,48 @@ public void headers_parseHeaderValue_encodedContentWithEquals() { String value = Base64.getUrlEncoder().encodeToString("a".getBytes()); List result = context.parseHeaderValue(value); - + assertTrue(result.size() > 0); assertEquals("YQ==", result.get(0).getValue()); } + @Test + public void headers_parseHeaderValue_base64EncodedCookieValue() { + String value = Base64.getUrlEncoder().encodeToString("a".getBytes()); + String cookieValue = "jwt=" + value + "; secondValue=second"; + AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").header(HttpHeaders.COOKIE, cookieValue).build(); + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req,null,null); + + Cookie[] cookies = context.getCookies(); + + assertEquals(2, cookies.length); + assertEquals("jwt", cookies[0].getName()); + assertEquals(value, cookies[0].getValue()); + } + + @Test + public void headers_parseHeaderValue_cookieWithSeparatorInValue() { + String cookieValue = "jwt==test; secondValue=second"; + AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").header(HttpHeaders.COOKIE, cookieValue).build(); + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req,null,null); + + Cookie[] cookies = context.getCookies(); + + assertEquals(2, cookies.length); + assertEquals("jwt", cookies[0].getName()); + assertEquals("=test", cookies[0].getValue()); + } + + @Test + public void headers_parseHeaderValue_headerWithPaddingButNotBase64Encoded() { + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null,null,null); + + List result = context.parseHeaderValue("hello="); + assertTrue(result.size() > 0); + assertEquals("hello", result.get(0).getKey()); + System.out.println("\"" + result.get(0).getValue() + "\""); + assertNull(result.get(0).getValue()); + } + @Test public void queryString_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); From f25293917725374804b08e00fa44408d6e5e22f9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Jun 2019 13:40:40 -0700 Subject: [PATCH 0287/1214] Added unit test for static files (#254) and fixed typo in unit test name --- .../proxy/spring/SpringAwsProxyTest.java | 2 +- .../proxy/spring/SpringBootAppTest.java | 16 ++++++++++++++++ .../src/test/resources/static/static.html | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 aws-serverless-java-container-spring/src/test/resources/static/static.html diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index e287aa95..3fe730da 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -382,7 +382,7 @@ public void contextPath_generateLink_returnsCorrectPath() { } @Test - public void multipart_getFileName_rerutrnsCorrectFileName() + public void multipart_getFileName_returnsCorrectFileName() throws IOException { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/attachment", "POST") .formFilePart("testFile", "myFile.txt", "hello".getBytes()) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 5e3922f7..f27d6e57 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; @@ -13,6 +14,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; +import javax.ws.rs.core.HttpHeaders; import java.io.IOException; import static org.junit.Assert.*; @@ -74,6 +76,20 @@ public void queryString_commaSeparatedList_expectUnmarshalAsList() { validateSingleValueModel(resp, "3"); } + @Test + public void staticContent_getHtmlFile_returnsHtmlContent() { + LambdaContainerHandler.getContainerConfig().addValidFilePath("/Users/bulianis/workspace/aws-serverless-java-container/aws-serverless-java-container-spring"); + AwsProxyRequest request = new AwsProxyRequestBuilder("/static.html", "GET") + .header(HttpHeaders.ACCEPT, "text/html") + .header(HttpHeaders.CONTENT_TYPE, "text/plain") + .build(); + AwsProxyResponse output = handler.handleRequest(request, context); + System.out.println("Response: " + output.getBody()); + assertEquals(200, output.getStatusCode()); + assertTrue(output.getBody().contains("

Static

")); + } + + private void validateSingleValueModel(AwsProxyResponse output, String value) { try { SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class); diff --git a/aws-serverless-java-container-spring/src/test/resources/static/static.html b/aws-serverless-java-container-spring/src/test/resources/static/static.html new file mode 100644 index 00000000..5231067b --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/resources/static/static.html @@ -0,0 +1,5 @@ + + +

Static

+ + \ No newline at end of file From 120129687af65ab4bf9f8d09d87e5b31645aa495 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 26 Jun 2019 13:55:00 -0700 Subject: [PATCH 0288/1214] Added null check before reading from the request input stream (#147) --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index dd77135f..a4d0ab81 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -892,6 +892,9 @@ public void setReadListener(ReadListener readListener) { @Override public int read() throws IOException { + if (bodyStream == null || bodyStream instanceof NullInputStream) { + return -1; + } int readByte = bodyStream.read(); if (bodyStream.available() == 0 && listener != null) { listener.onAllDataRead(); From 6ff3b669e8ccf6ebef04f40c11cee02abde5e941 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 09:41:39 -0700 Subject: [PATCH 0289/1214] changed the behavior of the getMimeType method to always try to load the mime type from the file name, without probing the file system. Updated unit tests to match (#254) --- .../internal/servlet/AwsServletContext.java | 17 +++++++++------ .../servlet/AwsServletContextTest.java | 21 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 5a6dc85d..09cc00d3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -20,6 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.activation.MimetypesFileTypeMap; import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; @@ -72,6 +73,7 @@ public class AwsServletContext private Map initParameters; private AwsLambdaServletContainerHandler containerHandler; private Logger log = LoggerFactory.getLogger(AwsServletContext.class); + private MimetypesFileTypeMap mimeTypes; // lazily loaded in the getMimeType method //------------------------------------------------------------- @@ -142,13 +144,16 @@ public int getEffectiveMinorVersion() { @Override @SuppressFBWarnings("PATH_TRAVERSAL_IN") // suppressing because we are using the getValidFilePath public String getMimeType(String s) { - try { - String validatedPath = SecurityUtils.getValidFilePath(s); - return Files.probeContentType(Paths.get(validatedPath)); - } catch (IOException e) { - log.warn("Could not find content type for file: " + SecurityUtils.encode(s), e); + if (!s.contains(".")) { return null; } + if (mimeTypes == null) { + mimeTypes = new MimetypesFileTypeMap(); + } + // TODO: The getContentType method of the MimetypesFileTypeMap returns application/octet-stream + // instead of null when the type cannot be found. We should replace with an implementation that + // loads the System mime types ($JAVA_HOME/lib/mime.types + return mimeTypes.getContentType(s); } @@ -232,7 +237,7 @@ public String getRealPath(String s) { try { absPath = new File(fileUrl.toURI()).getAbsolutePath(); } catch (URISyntaxException e) { - log.error("Error while looking for real path: {}", SecurityUtils.encode(s), SecurityUtils.encode(e.getMessage())); + log.error("Error while looking for real path {}: {}", SecurityUtils.encode(s), SecurityUtils.encode(e.getMessage())); } } return absPath; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index faf29855..0023be65 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -4,6 +4,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.filters.UrlPathValidator; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import javax.servlet.Filter; @@ -43,7 +44,7 @@ public static void setUp() { LambdaContainerHandler.getContainerConfig().addValidFilePath("C:\\MyTestFolder"); } - @Test + @Test @Ignore public void getMimeType_disabledPath_expectException() { AwsServletContext ctx = new AwsServletContext(null); try { @@ -64,7 +65,7 @@ public void getMimeType_nonExistentFileInTaskPath_expectNull() { @Test public void getMimeType_mimeTypeOfCorrectFile_expectMime() { - String tmpFilePath = TMP_DIR + "/test_text.txt"; + String tmpFilePath = TMP_DIR + "test_text.txt"; try { System.out.println("Writing to tmp file " + tmpFilePath); PrintWriter tmpWriter = new PrintWriter(tmpFilePath, "UTF-8"); @@ -73,23 +74,27 @@ public void getMimeType_mimeTypeOfCorrectFile_expectMime() { AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType(tmpFilePath); - String deducedMimeType = Files.probeContentType(Paths.get(tmpFilePath)); - assertEquals(deducedMimeType, mimeType); + assertEquals("text/plain", mimeType); mimeType = ctx.getMimeType("file://" + tmpFilePath); - assertEquals(deducedMimeType, mimeType); + assertEquals("text/plain", mimeType); } catch (FileNotFoundException e) { fail("tmp file not found"); e.printStackTrace(); } catch (UnsupportedEncodingException e) { fail("Unsupported encoding"); e.printStackTrace(); - } catch (IOException e) { - fail("Failed to prove tmp file content type"); - e.printStackTrace(); } } + @Test + public void getMimeType_unknownExtension_expectAppOctetStream() { + AwsServletContext ctx = new AwsServletContext(null); + String mimeType = ctx.getMimeType("myfile.unkext"); + assertEquals("application/octet-stream", mimeType); + } + + @Test public void addFilter_nonExistentFilterClass_expectException() { AwsServletContext ctx = new AwsServletContext(null); From 915bee3743ef777a32ad9aeaba6099d673db84cb Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 09:43:30 -0700 Subject: [PATCH 0290/1214] whoops, null check. You'd think I would have learned by now (#254) --- .../serverless/proxy/internal/servlet/AwsServletContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 09cc00d3..cb72e953 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -144,7 +144,7 @@ public int getEffectiveMinorVersion() { @Override @SuppressFBWarnings("PATH_TRAVERSAL_IN") // suppressing because we are using the getValidFilePath public String getMimeType(String s) { - if (!s.contains(".")) { + if (s == null || !s.contains(".")) { return null; } if (mimeTypes == null) { From 445abc6bd3ca3783b8ef91b356ef8f5e33942ee3 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 10:45:15 -0700 Subject: [PATCH 0291/1214] Changed unit test not to write to actual file since the getMimeType method does not require the file to exist anymore. --- .../servlet/AwsServletContextTest.java | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 0023be65..64c91b8d 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -66,25 +66,12 @@ public void getMimeType_nonExistentFileInTaskPath_expectNull() { @Test public void getMimeType_mimeTypeOfCorrectFile_expectMime() { String tmpFilePath = TMP_DIR + "test_text.txt"; - try { - System.out.println("Writing to tmp file " + tmpFilePath); - PrintWriter tmpWriter = new PrintWriter(tmpFilePath, "UTF-8"); - tmpWriter.write("Test case for aws-serverless-java-container"); - tmpWriter.close(); - - AwsServletContext ctx = new AwsServletContext(null); - String mimeType = ctx.getMimeType(tmpFilePath); - assertEquals("text/plain", mimeType); - - mimeType = ctx.getMimeType("file://" + tmpFilePath); - assertEquals("text/plain", mimeType); - } catch (FileNotFoundException e) { - fail("tmp file not found"); - e.printStackTrace(); - } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); - e.printStackTrace(); - } + AwsServletContext ctx = new AwsServletContext(null); + String mimeType = ctx.getMimeType(tmpFilePath); + assertEquals("text/plain", mimeType); + + mimeType = ctx.getMimeType("file://" + tmpFilePath); + assertEquals("text/plain", mimeType); } @Test From 9f20bd98076ae305201861f7e319ef98332f7af5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 13:14:52 -0700 Subject: [PATCH 0292/1214] Bump dependency check plugin version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74903bc7..c4585ec5 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 0.5 - 4.0.1 + 5.0.0 From d37629ffad99eb36939867b9635df13d92340762 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 13:51:55 -0700 Subject: [PATCH 0293/1214] Added temporary jackson-databind:2.9.9 suppression since there's no new version available --- owasp-suppression.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/owasp-suppression.xml b/owasp-suppression.xml index fe70f749..be75cff2 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -36,5 +36,10 @@ cpe:/a:slf4j:slf4j:1.8.0
+ + + + cpe:/a:fasterxml:jackson-databind:2.9.9 + \ No newline at end of file From ccce1163b13b48e8433ee6ac7e79d96ed16beaf8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 13:52:22 -0700 Subject: [PATCH 0294/1214] Bump Sparkjava version to address volnerabilities in older dependencies --- aws-serverless-java-container-spark/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index ce884e6e..8dce826b 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -16,7 +16,7 @@ - 2.8.0 + 2.9.1 From 89f49468dd0ff83c038cd5c076b59bb72af26e15 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 13:52:57 -0700 Subject: [PATCH 0295/1214] Bump spring-core, spring-security-config, and spring-boot to the latest version to address security vulnerabilities reported by the latest dependency check --- aws-serverless-java-container-spring/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index bbab50a5..e1a3e9c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,9 +16,9 @@ - 5.1.1.RELEASE - 1.5.17.RELEASE - 5.1.1.RELEASE + 5.1.8.RELEASE + 1.5.21.RELEASE + 5.1.5.RELEASE 2.9.9 From 586c62f914ac18f1020247c6eed74ac88b249615 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 14:37:41 -0700 Subject: [PATCH 0296/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.3.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 82d218f9..8b9dd264 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f92c9d70..6774a804 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 8dce826b..2a64bab3 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index e1a3e9c2..470a6745 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.2 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index f981e087..8d3b272f 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.3.2 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d89ca75b..36772722 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 65c870e5..c39a1f9b 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 35331470..c3e6f32b 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 011cc1a9..4eb5acc5 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 2ade62df..aa33c2a6 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c3578068..552769c7 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.3.2 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.4-SNAPSHOT + 1.3.2 maven-archetype diff --git a/pom.xml b/pom.xml index c4585ec5..3ce224eb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.4-SNAPSHOT + 1.3.2 AWS Serverless Java container From 1a38751976c8188cd09dba9d8c9776991478d188 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 14:37:48 -0700 Subject: [PATCH 0297/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 12 files changed, 27 insertions(+), 27 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 8b9dd264..82d218f9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 6774a804..f92c9d70 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.2 + 1.4-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 2a64bab3..8dce826b 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.2 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 470a6745..e1a3e9c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT .. @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.2 + 1.4-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 8d3b272f..f981e087 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.3.2 + 1.4-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 36772722..d89ca75b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index c39a1f9b..65c870e5 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index c3e6f32b..35331470 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 4eb5acc5..011cc1a9 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index aa33c2a6..2ade62df 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 552769c7..c3578068 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.3.2 + 1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.3.2 + 1.4-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index 3ce224eb..c4585ec5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.3.2 + 1.4-SNAPSHOT AWS Serverless Java container From 949807a24af0114e8e9ceeada0b6a28f7e964ae0 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 27 Jun 2019 15:03:57 -0700 Subject: [PATCH 0298/1214] Attempt to repair build. Travis is complaining that the build log is too long so added -q to both maven and gradle builds --- travis.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/travis.sh b/travis.sh index 13996f10..d61e696c 100755 --- a/travis.sh +++ b/travis.sh @@ -4,7 +4,7 @@ IFS=$'\n' echo "STARTING TRAVIS BUILD in $(pwd)" cd $TRAVIS_BUILD_DIR -mvn install +mvn -q install if [[ "$?" -ne 0 ]]; then exit 1 fi @@ -15,11 +15,11 @@ for SAMPLE in $(find samples -type d -maxdepth 2 -mindepth 2); do echo "BUILDING SAMPLE '$SAMPLE'" cd $SAMPLE - mvn clean package + mvn -q clean package if [[ "$?" -ne 0 ]]; then exit 1 fi - $GRADLE wrapper + $GRADLE -q wrapper if [[ "$?" -ne 0 ]]; then exit 1 fi @@ -27,7 +27,7 @@ do if [[ "$?" -ne 0 ]]; then exit 1 fi - ./gradlew clean build + ./gradlew -q clean build if [[ "$?" -ne 0 ]]; then exit 1 fi @@ -67,16 +67,16 @@ do exit 1 fi cd ${TEST_PROJ} - mvn clean package -Pshaded-jar + mvn -q clean package -Pshaded-jar if [[ "$?" -ne 0 ]]; then exit 1 fi - mvn clean package + mvn -q clean package if [[ "$?" -ne 0 ]]; then exit 1 fi if [[ -f "$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/build.gradle" ]]; then - $GRADLE wrapper + $GRADLE -q wrapper if [[ "$?" -ne 0 ]]; then exit 1 fi @@ -84,7 +84,7 @@ do if [[ "$?" -ne 0 ]]; then exit 1 fi - ./gradlew clean build + ./gradlew -q clean build if [[ "$?" -ne 0 ]]; then exit 1 fi From 3368df11e275a7cd23a49e8958518d5be12d41f4 Mon Sep 17 00:00:00 2001 From: Jack Gough Date: Sat, 13 Jul 2019 14:47:37 +0100 Subject: [PATCH 0299/1214] Bug Fix: Log request time from ALB requests - Previously logged as 01/01/1970:00:00:00Z as RequestTimeEpoch == 0 --- .../ApacheCombinedServletLogFormatter.java | 22 ++--- ...ApacheCombinedServletLogFormatterTest.java | 86 +++++++++++++++++++ 2 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index def4ecdf..2105ffae 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -11,15 +11,11 @@ import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.SecurityContext; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; -import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static java.time.temporal.ChronoField.DAY_OF_MONTH; import static java.time.temporal.ChronoField.HOUR_OF_DAY; @@ -37,10 +33,16 @@ */ public class ApacheCombinedServletLogFormatter implements LogFormatter { - DateTimeFormatter dateFormat; + private final DateTimeFormatter dateFormat; + private final Clock clock; public ApacheCombinedServletLogFormatter() { - dateFormat = new DateTimeFormatterBuilder() + this(Clock.systemDefaultZone()); + } + + ApacheCombinedServletLogFormatter(Clock clock) { + this.clock = clock; + this.dateFormat = new DateTimeFormatterBuilder() .parseCaseInsensitive() .appendLiteral("[") .appendValue(DAY_OF_MONTH, 2) @@ -93,17 +95,17 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType // %t - if (gatewayContext != null) { + if (gatewayContext != null && gatewayContext.getRequestTimeEpoch() > 0) { logLineBuilder.append( dateFormat.format( ZonedDateTime.of( LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC), - ZoneId.systemDefault() + clock.getZone() ) ) ); } else { - logLineBuilder.append(dateFormat.format(ZonedDateTime.now())); + logLineBuilder.append(dateFormat.format(ZonedDateTime.now(clock))); } logLineBuilder.append(" "); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java new file mode 100644 index 00000000..1c9527a3 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java @@ -0,0 +1,86 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; +import org.junit.Before; +import org.junit.Test; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; + +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ApacheCombinedServletLogFormatterTest { + + private ApacheCombinedServletLogFormatter sut; + + private HttpServletRequest mockServletRequest; + private HttpServletResponse mockServletResponse; + private AwsProxyRequest proxyRequest; + private AwsProxyRequestContext context; + + @Before + public void setup() { + proxyRequest = new AwsProxyRequest(); + Clock fixedClock = Clock.fixed(Instant.ofEpochSecond(665888523L), ZoneId.of("UTC")); + mockServletRequest = mock(HttpServletRequest.class); + when(mockServletRequest.getAttribute(eq(API_GATEWAY_EVENT_PROPERTY))) + .thenReturn(proxyRequest); + when(mockServletRequest.getMethod()) + .thenReturn("GET"); + mockServletResponse = mock(HttpServletResponse.class); + context = new AwsProxyRequestContext(); + context.setIdentity(new ApiGatewayRequestIdentity()); + proxyRequest.setRequestContext(context); + + sut = new ApacheCombinedServletLogFormatter(fixedClock); + } + + @Test + public void logsCurrentTimeWhenContextNull() { + // given + proxyRequest.setRequestContext(null); + + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); + + // then + assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); + } + + @Test + public void logsCurrentTimeWhenRequestTimeZero() { + // given + context.setRequestTimeEpoch(0); + + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); + + // then + assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); + } + + @Test + public void logsRequestTimeWhenRequestTimeEpochGreaterThanZero() { + // given + context.setRequestTimeEpoch(1563023494000L); + + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); + + // then + assertThat(actual, containsString("[13/07/2019:13:11:34Z]")); + } + +} From d8c1c4e1c4f026685a0b8d16e0fc034f573f03cc Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 19 Jul 2019 11:02:46 -0700 Subject: [PATCH 0300/1214] Addressed bug reported in #269. Explictly setting the character encoding in the response overwrites whatever is passed in with the content type header --- .../servlet/AwsHttpServletResponse.java | 39 ++++++++++++------- .../servlet/AwsHttpServletResponseTest.java | 22 +++++------ .../proxy/spring/SpringBootAppTest.java | 16 +++++++- .../spring/springbootapp/TestApplication.java | 2 + .../spring/springbootapp/TestController.java | 11 ++++++ .../resources/boot-application.properties | 3 ++ 6 files changed, 68 insertions(+), 25 deletions(-) create mode 100644 aws-serverless-java-container-spring/src/test/resources/boot-application.properties diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index e603a8c3..3a61c07d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.Headers; @@ -60,6 +61,7 @@ public class AwsHttpServletResponse private int statusCode; private String statusMessage; private String responseBody; + private String characterEncoding; private PrintWriter writer; private ByteArrayOutputStream bodyOutputStream = new ByteArrayOutputStream(); private CountDownLatch writersCountDownLatch; @@ -80,6 +82,7 @@ public class AwsHttpServletResponse */ public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { writersCountDownLatch = latch; + characterEncoding = null; request = req; statusCode = 0; } @@ -207,7 +210,7 @@ public void setHeader(String s, String s1) { public void addHeader(String s, String s1) { // TODO: We should probably have a list of headers that we are not allowed to have multiple values for if (s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))) { - setHeader(s, s1, true); + setContentType(s1); } else { setHeader(s, s1, false); } @@ -273,12 +276,7 @@ public Collection getHeaderNames() { @Override public String getCharacterEncoding() { - final String contentType = Optional.ofNullable(getContentType()).orElse(""); - if (contentType.contains(";")) { - return contentType.split(";")[1].split("=")[1].trim().toLowerCase(Locale.getDefault()); - } else { - return ""; - } + return characterEncoding; } @@ -345,10 +343,11 @@ public PrintWriter getWriter() throws IOException { @Override public void setCharacterEncoding(String s) { - final String characterEncoding = Optional.ofNullable(s).orElse("").toLowerCase(Locale.getDefault()); - final String oldValue = Optional.ofNullable(getHeader(HttpHeaders.CONTENT_TYPE)).orElse(""); - String contentType = oldValue.contains(";") ? oldValue.split(";")[0].trim(): oldValue; - setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", contentType, characterEncoding), true); + characterEncoding = s.toUpperCase(Locale.getDefault()); + // The char encoding is being forced, if we already have a content-type header we recreate it + if (headers.getFirst(HttpHeaders.CONTENT_TYPE) != null) { + setContentType(headers.getFirst(HttpHeaders.CONTENT_TYPE)); + } } @@ -366,7 +365,21 @@ public void setContentLengthLong(long l) { @Override public void setContentType(String s) { - setHeader(HttpHeaders.CONTENT_TYPE, s, true); + if (s == null) { + return; + } + + // we have no forced character encoding + if (characterEncoding == null) { + setHeader(HttpHeaders.CONTENT_TYPE, s, true); + return; + } + + if (s.contains(";")) { // we have a forced charset + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", s.split(";")[0], characterEncoding), true); + } else { + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", s, characterEncoding), true); + } } @@ -387,7 +400,7 @@ public void flushBuffer() throws IOException { if (null != writer) { writer.flush(); } - responseBody = new String(bodyOutputStream.toByteArray(), StandardCharsets.UTF_8); + responseBody = new String(bodyOutputStream.toByteArray(), LambdaContainerHandler.getContainerConfig().getDefaultContentCharset()); log.debug("Response buffer flushed with {} bytes, latch={}", responseBody.length(), writersCountDownLatch.getCount()); isCommitted = true; writersCountDownLatch.countDown(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index d9a4e742..1feeb5e9 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -272,8 +272,8 @@ public void characterEncoding_setCharacterEncoding() { resp.setContentType("application/json"); resp.setCharacterEncoding("UTF-8"); assertNotEquals("UTF-8", resp.getHeader("Content-Encoding")); - assertEquals("application/json; charset=utf-8", resp.getContentType()); - assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); + assertEquals("application/json; charset=UTF-8", resp.getContentType()); + assertEquals("application/json; charset=UTF-8", resp.getHeader("Content-Type")); } @Test @@ -282,9 +282,9 @@ public void characterEncoding_setContentType() { resp.setContentType("application/json; charset=utf-8"); resp.setCharacterEncoding("UTF-8"); - assertEquals("application/json; charset=utf-8", resp.getContentType()); - assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); - assertEquals("utf-8", resp.getCharacterEncoding()); + assertEquals("application/json; charset=UTF-8", resp.getContentType()); + assertEquals("application/json; charset=UTF-8", resp.getHeader("Content-Type")); + assertEquals("UTF-8", resp.getCharacterEncoding()); } @Test @@ -293,9 +293,9 @@ public void characterEncoding_setContentTypeAndsetCharacterEncoding() { resp.setContentType("application/json"); resp.setCharacterEncoding("UTF-8"); - assertEquals("application/json; charset=utf-8", resp.getContentType()); - assertEquals("application/json; charset=utf-8", resp.getHeader("Content-Type")); - assertEquals("utf-8", resp.getCharacterEncoding()); + assertEquals("application/json; charset=UTF-8", resp.getContentType()); + assertEquals("application/json; charset=UTF-8", resp.getHeader("Content-Type")); + assertEquals("UTF-8", resp.getCharacterEncoding()); } @Test @@ -304,9 +304,9 @@ public void characterEncoding_setCharacterEncodingAndsetContentType() { resp.setCharacterEncoding("UTF-8"); resp.setContentType("application/json"); - assertEquals("application/json", resp.getContentType()); - assertEquals("application/json", resp.getHeader("Content-Type")); - assertEquals("", resp.getCharacterEncoding()); + assertEquals("application/json; charset=UTF-8", resp.getContentType()); + assertEquals("application/json; charset=UTF-8", resp.getHeader("Content-Type")); + assertEquals("UTF-8", resp.getCharacterEncoding()); } private int getMaxAge(String header) { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index f27d6e57..0a17814d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -42,7 +42,7 @@ public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { assertEquals(404, resp.getStatusCode()); assertNotNull(resp.getMultiValueHeaders()); assertTrue(resp.getMultiValueHeaders().containsKey("Content-Type")); - assertEquals("application/json;charset=UTF-8", resp.getMultiValueHeaders().getFirst("Content-Type")); + assertEquals("application/json; charset=UTF-8", resp.getMultiValueHeaders().getFirst("Content-Type")); try { JsonNode errorData = mapper.readTree(resp.getBody()); assertNotNull(errorData.findValue("status")); @@ -89,6 +89,20 @@ public void staticContent_getHtmlFile_returnsHtmlContent() { assertTrue(output.getBody().contains("

Static

")); } + @Test + public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharset() { + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); + AwsProxyRequest request = new AwsProxyRequestBuilder("/test/utf8", "GET") + .build(); + AwsProxyResponse output = handler.handleRequest(request, context); + System.out.println("Response: " + output.getBody()); + System.out.println("Content-Type:" + output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); + validateSingleValueModel(output, TestController.UTF8_TEST_STRING); + assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains(";")); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains("charset=UTF-8")); + } + private void validateSingleValueModel(AwsProxyResponse output, String value) { try { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java index d203a56e..fda1f801 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java @@ -4,9 +4,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.PropertySource; @SpringBootApplication @ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp") +@PropertySource("classpath:boot-application.properties") public class TestApplication extends SpringBootServletInitializer { } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index e03ff434..51094bd1 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -16,13 +16,17 @@ import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; import java.util.List; +import java.util.Map; @RestController @EnableWebSecurity public class TestController extends WebSecurityConfigurerAdapter { public static final String TEST_VALUE = "test"; + public static final String UTF8_TEST_STRING = "health心跳测试完成。可正常使用"; // workaround to address the most annoying issue in the world: https://blog.georgovassilis.com/2015/10/29/spring-mvc-rest-controller-says-406-when-emails-are-part-url-path/ @Configuration @@ -61,6 +65,13 @@ public SingleValueModel testQueryStringList(@RequestParam("list") List q return value; } + @RequestMapping(value="/test/utf8",method=RequestMethod.GET) + public Object testUtf8(String name, HttpServletResponse response){ + SingleValueModel model = new SingleValueModel(); + model.setValue(UTF8_TEST_STRING); + return model; + } + @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement().disable(); diff --git a/aws-serverless-java-container-spring/src/test/resources/boot-application.properties b/aws-serverless-java-container-spring/src/test/resources/boot-application.properties new file mode 100644 index 00000000..c57cb12a --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/resources/boot-application.properties @@ -0,0 +1,3 @@ +spring.http.encoding.charset=UTF-8 +spring.http.encoding.enabled=true +spring.http.encoding.force=true \ No newline at end of file From 130eedaf8f67d3b1d0dbbff3bb8bc39b22b991cc Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 19 Jul 2019 11:03:48 -0700 Subject: [PATCH 0301/1214] Bump owasp plugin version to address NPE on build and bump Spring versions to address vulnerability from wasp database --- aws-serverless-java-container-spring/pom.xml | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index bbab50a5..e1a3e9c2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,9 +16,9 @@ - 5.1.1.RELEASE - 1.5.17.RELEASE - 5.1.1.RELEASE + 5.1.8.RELEASE + 1.5.21.RELEASE + 5.1.5.RELEASE 2.9.9 diff --git a/pom.xml b/pom.xml index 74903bc7..72fc1071 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 0.5 - 4.0.1 + 5.1.0 From 5da368ef082a78edd21702b096c9926f3be335b3 Mon Sep 17 00:00:00 2001 From: Mikael Quist Date: Tue, 30 Jul 2019 16:22:37 -0700 Subject: [PATCH 0302/1214] Added handling of all exceptions in LambdaContainerHandler.proxyStream() to return an error rather than a 200. --- .../serverless/proxy/internal/LambdaContainerHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 0e61495a..9af153f5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -215,6 +215,9 @@ public void proxyStream(InputStream input, OutputStream output, Context context) } catch (JsonMappingException e) { log.error("Error while mapping object to RequestType class", e); getObjectMapper().writeValue(output, exceptionHandler.handle(e)); + } catch (Exception e) { + log.error("Error while proxying request.", e); + getObjectMapper().writeValue(output, exceptionHandler.handle(e)); } finally { output.flush(); output.close(); From 089637083e74e626a777399356bdf27543a5378c Mon Sep 17 00:00:00 2001 From: Mikael Quist Date: Wed, 31 Jul 2019 12:16:59 -0700 Subject: [PATCH 0303/1214] Adding InternalServerError to exception handler, modified the JerseyServletResponseWriter.failure() to throw if an error occured rather than return ultimately returning a 200 --- .../proxy/AwsProxyExceptionHandler.java | 6 ++- .../internal/LambdaContainerHandler.java | 3 -- .../proxy/AwsProxyExceptionHandlerTest.java | 43 ++++++++++++++++- .../jersey/JerseyServletResponseWriter.java | 10 +--- .../proxy/jersey/EchoJerseyResource.java | 4 ++ .../proxy/jersey/JerseyAwsProxyTest.java | 47 ++++++++++++++----- .../proxy/jersey/JerseyDependency.java | 6 +++ .../proxy/jersey/JerseyInjectionTest.java | 2 +- .../proxy/jersey/JerseyParamEncodingTest.java | 6 +-- .../proxy/jersey/ResourceBinder.java | 12 +++++ 10 files changed, 108 insertions(+), 31 deletions(-) create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyDependency.java create mode 100644 aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index d2b96d8e..cf2aae3e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -31,7 +32,8 @@ /** * Default implementation of the ExceptionHandler object that returns AwsProxyResponse objects. * - * Returns application/json messages with a status code of 500 when the RequestReader failed to read the incoming event. + * Returns application/json messages with a status code of 500 when the RequestReader failed to read the incoming event + * or if InternalServerErrorException is thrown. * For all other exceptions returns a 502. Responses are populated with a JSON object containing a message property. * * @see ExceptionHandler @@ -76,7 +78,7 @@ public AwsProxyResponse handle(Throwable ex) { // adding a print stack trace in case we have no appender or we are running inside SAM local, where need the // output to go to the stderr. ex.printStackTrace(); - if (ex instanceof InvalidRequestEventException) { + if (ex instanceof InvalidRequestEventException || ex instanceof InternalServerErrorException) { return new AwsProxyResponse(500, headers, getErrorJson(INTERNAL_SERVER_ERROR)); } else { return new AwsProxyResponse(502, headers, getErrorJson(GATEWAY_TIMEOUT_ERROR)); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 9af153f5..0e61495a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -215,9 +215,6 @@ public void proxyStream(InputStream input, OutputStream output, Context context) } catch (JsonMappingException e) { log.error("Error while mapping object to RequestType class", e); getObjectMapper().writeValue(output, exceptionHandler.handle(e)); - } catch (Exception e) { - log.error("Error while proxying request.", e); - getObjectMapper().writeValue(output, exceptionHandler.handle(e)); } finally { output.flush(); output.close(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index b5ed6f77..cf86c57a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -3,7 +3,6 @@ import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; import com.fasterxml.jackson.core.JsonProcessingException; @@ -16,18 +15,22 @@ import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; +import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import java.io.*; public class AwsProxyExceptionHandlerTest { + private static final String INTERNAL_SERVER_ERROR_MESSAGE = "Internal server error"; private static final String INVALID_REQUEST_MESSAGE = "Invalid request error"; private static final String INVALID_RESPONSE_MESSAGE = "Invalid response error"; private AwsProxyExceptionHandler exceptionHandler; private ObjectMapper objectMapper; + @Before public void setUp() { exceptionHandler = new AwsProxyExceptionHandler(); @@ -88,6 +91,44 @@ public void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } + @Test + public void typedHandle_InternalServerErrorException_500State() { + // Needed to mock InternalServerErrorException because it leverages RuntimeDelegate to set an internal + // response object. + InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); + Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); + + AwsProxyResponse resp = exceptionHandler.handle(mockInternalServerErrorException); + + assertNotNull(resp); + assertEquals(500, resp.getStatusCode()); + } + + @Test + public void typedHandle_InternalServerErrorException_responseString() + throws JsonProcessingException { + InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); + Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); + + AwsProxyResponse resp = exceptionHandler.handle(mockInternalServerErrorException); + + assertNotNull(resp); + String body = objectMapper.writeValueAsString(new ErrorModel(AwsProxyExceptionHandler.INTERNAL_SERVER_ERROR)); + assertEquals(body, resp.getBody()); + } + + @Test + public void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { + InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); + Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); + + AwsProxyResponse resp = exceptionHandler.handle(mockInternalServerErrorException); + + assertNotNull(resp); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertEquals(MediaType.APPLICATION_JSON, resp.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); + } + @Test public void typedHandle_NullPointerException_responseObject() throws JsonProcessingException { diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java index c2cba731..938c6f9f 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java @@ -122,14 +122,8 @@ public void commit() { public void failure(Throwable throwable) { - try { - log.error("failure", throwable); - jerseyLatch.countDown(); - servletResponse.flushBuffer(); - } catch (IOException e) { - log.error("Could not fail response", e); - throw new InternalServerErrorException(e); - } + log.error("failure", throwable); + throw new InternalServerErrorException("Jersey failed to process request", throwable); } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index da67dcf3..ec0f4b2a 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -24,6 +24,7 @@ import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.FormDataParam; +import javax.inject.Inject; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -59,6 +60,9 @@ public class EchoJerseyResource { @Context SecurityContext securityCtx; + @Inject + JerseyDependency jerseyDependency; + @Path("/decoded-param") @GET @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoDecodedParam(@QueryParam("param") String param) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index c54de6c5..e791ae81 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -14,16 +14,15 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; -import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; -import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; +import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; +import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; - import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; @@ -37,13 +36,15 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; - import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.UUID; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** * Unit test class for the Jersey AWS_PROXY default implementation @@ -57,13 +58,26 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); + private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") + .register(LoggingFeature.class) + .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + + private static ResourceConfig appWithoutRegisteredDependencies = new ResourceConfig() + .packages("com.amazonaws.serverless.proxy.jersey") .register(LoggingFeature.class) .register(ServletRequestFilter.class) .register(MultiPartFeature.class) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + private static JerseyLambdaContainerHandler handlerWithoutRegisteredDependencies + = JerseyLambdaContainerHandler.getAwsProxyHandler(appWithoutRegisteredDependencies); + private static Context lambdaContext = new MockLambdaContext(); private boolean isAlb; @@ -76,15 +90,14 @@ public JerseyAwsProxyTest(boolean alb) { public static Collection data() { return Arrays.asList(new Object[] { false, true }); } - + private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(path, method); if (isAlb) builder.alb(); - + return builder; } - @Test public void alb_basicRequest_expectSuccess() { AwsProxyRequest request = getRequestBuilder("/echo/headers", "GET") @@ -130,6 +143,18 @@ public void headers_servletRequest_echo() { validateMapResponseModel(output); } + @Test + public void headers_servletRequest_failedDependencyInjection_expectInternalServerError() { + AwsProxyRequest request = getRequestBuilder("/echo/servlet-headers", "GET") + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .build(); + + AwsProxyResponse output = handlerWithoutRegisteredDependencies.proxy(request, lambdaContext); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), output.getStatusCode()); + } + @Test public void context_servletResponse_setCustomHeader() { AwsProxyRequest request = getRequestBuilder("/echo/servlet-response", "GET") diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyDependency.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyDependency.java new file mode 100644 index 00000000..0633b96b --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyDependency.java @@ -0,0 +1,6 @@ +package com.amazonaws.serverless.proxy.jersey; + +// This class is used to test HK2 dependency injection. +public class JerseyDependency { + +} diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java index 0af2785e..e8e86270 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java @@ -30,7 +30,7 @@ */ public class JerseyInjectionTest { - // Test ressource binder + // Test resource binder private static class ResourceBinder extends AbstractBinder { @Override diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index e3eb92de..06edbdaa 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -11,7 +11,6 @@ import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; -import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.Ignore; @@ -26,10 +25,6 @@ import java.net.URLEncoder; import java.util.Arrays; import java.util.Collection; -import java.util.logging.ConsoleHandler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -69,6 +64,7 @@ public class JerseyParamEncodingTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") .register(MultiPartFeature.class) + .register(new ResourceBinder()) .property("jersey.config.server.tracing.type", "ALL") .property("jersey.config.server.tracing.threshold", "VERBOSE"); private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java new file mode 100644 index 00000000..e98ea805 --- /dev/null +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java @@ -0,0 +1,12 @@ +package com.amazonaws.serverless.proxy.jersey; + +import org.glassfish.jersey.internal.inject.AbstractBinder; + +import javax.inject.Singleton; + +public class ResourceBinder extends AbstractBinder { + @Override + protected void configure() { + bind(new JerseyDependency()).to(JerseyDependency.class).in(Singleton.class); + } +} From b1574ab2d1d4e97e40bd4e4655cf1cafac55b374 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Aug 2019 10:24:02 -0700 Subject: [PATCH 0304/1214] More complete implementation of include and forward methods for the request dispatcher to address #275 --- aws-serverless-java-container-core/pom.xml | 6 + .../servlet/AwsHttpServletRequest.java | 11 +- .../servlet/AwsHttpServletResponse.java | 24 ++ .../AwsLambdaServletContainerHandler.java | 60 +---- .../servlet/AwsProxyRequestDispatcher.java | 90 +++++-- .../internal/servlet/AwsServletContext.java | 2 +- .../AwsProxyRequestDispatcherTest.java | 221 ++++++++++++++++++ .../jersey/JerseyLambdaContainerHandler.java | 5 + .../spark/SparkLambdaContainerHandler.java | 5 + .../SpringBootLambdaContainerHandler.java | 4 + .../spring/SpringLambdaContainerHandler.java | 5 + .../proxy/spring/SpringBootSecurityTest.java | 63 +++++ .../spring/sbsecurityapp/LambdaHandler.java | 33 +++ .../spring/sbsecurityapp/TestApplication.java | 13 ++ .../spring/sbsecurityapp/TestController.java | 48 ++++ .../sbsecurityapp/TestSecurityConfig.java | 45 ++++ .../Struts2LambdaContainerHandler.java | 5 + 17 files changed, 557 insertions(+), 83 deletions(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 82d218f9..fe0e6625 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -86,6 +86,12 @@ 4.4.10 compile + + org.springframework.security + spring-security-web + 5.1.5.RELEASE + test + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 8712285a..d6a11a96 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -60,6 +60,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final String FORM_DATA_SEPARATOR = "&"; static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; static final String ENCODING_VALUE_KEY = "charset"; + static final String DISPATCHER_TYPE_ATTRIBUTE = "com.amazonaws.serverless.javacontainer.dispatchertype"; // We need this to pickup the protocol from the CloudFront header since Lambda doesn't receive this // information from anywhere else @@ -80,8 +81,6 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private String queryString; private BasicHeaderValueParser headerParser; - protected DispatcherType dispatcherType; - private Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class); @@ -98,6 +97,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { this.lambdaContext = lambdaContext; attributes = new HashMap<>(); headerParser = new BasicHeaderValueParser(); + setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.REQUEST); } @@ -250,6 +250,9 @@ public AsyncContext getAsyncContext() { @Override public DispatcherType getDispatcherType() { + if (getAttribute(DISPATCHER_TYPE_ATTRIBUTE) != null) { + return (DispatcherType) getAttribute(DISPATCHER_TYPE_ATTRIBUTE); + } return DispatcherType.REQUEST; } @@ -258,10 +261,6 @@ public DispatcherType getDispatcherType() { // Methods - Getter/Setter //------------------------------------------------------------- - public void setDispatcherType(DispatcherType type) { - dispatcherType = type; - } - public void setServletContext(ServletContext context) { servletContext = context; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 3a61c07d..d477587f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -21,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.DispatcherType; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.Cookie; @@ -96,6 +97,9 @@ public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { @SuppressFBWarnings("COOKIE_USAGE") @Override public void addCookie(Cookie cookie) { + if (request != null && request.getDispatcherType() == DispatcherType.INCLUDE && isCommitted()) { + throw new IllegalStateException("Cannot add Cookies for include request when response is committed"); + } String cookieData = cookie.getName() + "=" + cookie.getValue(); if (cookie.getPath() != null) { cookieData += "; Path=" + cookie.getPath(); @@ -162,6 +166,7 @@ public String encodeRedirectUrl(String s) { @Override public void sendError(int i, String s) throws IOException { + request.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ERROR); setStatus(i, s); flushBuffer(); } @@ -169,6 +174,7 @@ public void sendError(int i, String s) throws IOException { @Override public void sendError(int i) throws IOException { + request.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ERROR); setStatus(i); flushBuffer(); } @@ -184,6 +190,7 @@ public void sendRedirect(String s) throws IOException { @Override public void setDateHeader(String s, long l) { + if (!canSetHeader()) return; SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_PATTERN); Date responseDate = new Date(); responseDate.setTime(l); @@ -193,6 +200,7 @@ public void setDateHeader(String s, long l) { @Override public void addDateHeader(String s, long l) { + if (!canSetHeader()) return; SimpleDateFormat sdf = new SimpleDateFormat(HEADER_DATE_PATTERN); Date responseDate = new Date(); responseDate.setTime(l); @@ -202,12 +210,14 @@ public void addDateHeader(String s, long l) { @Override public void setHeader(String s, String s1) { + if (!canSetHeader()) return; setHeader(s, s1, true); } @Override public void addHeader(String s, String s1) { + if (!canSetHeader()) return; // TODO: We should probably have a list of headers that we are not allowed to have multiple values for if (s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))) { setContentType(s1); @@ -219,18 +229,21 @@ public void addHeader(String s, String s1) { @Override public void setIntHeader(String s, int i) { + if (!canSetHeader()) return; setHeader(s, "" + i, true); } @Override public void addIntHeader(String s, int i) { + if (!canSetHeader()) return; setHeader(s, "" + i, false); } @Override public void setStatus(int i) { + if (!canSetHeader()) return; statusCode = i; } @@ -238,6 +251,7 @@ public void setStatus(int i) { @Override @Deprecated public void setStatus(int i, String s) { + if (!canSetHeader()) return; statusCode = i; statusMessage = s; } @@ -343,6 +357,7 @@ public PrintWriter getWriter() throws IOException { @Override public void setCharacterEncoding(String s) { + if (!canSetHeader()) return; characterEncoding = s.toUpperCase(Locale.getDefault()); // The char encoding is being forced, if we already have a content-type header we recreate it if (headers.getFirst(HttpHeaders.CONTENT_TYPE) != null) { @@ -353,18 +368,21 @@ public void setCharacterEncoding(String s) { @Override public void setContentLength(int i) { + if (!canSetHeader()) return; setHeader(HttpHeaders.CONTENT_LENGTH, "" + i, true); } @Override public void setContentLengthLong(long l) { + if (!canSetHeader()) return; setHeader(HttpHeaders.CONTENT_LENGTH, "" + l, true); } @Override public void setContentType(String s) { + if (!canSetHeader()) return; if (s == null) { return; } @@ -430,6 +448,7 @@ public void reset() { @Override public void setLocale(Locale locale) { + if (!canSetHeader()) return; setHeader(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(), true); } @@ -470,6 +489,7 @@ AwsProxyRequest getAwsProxyRequest() { //------------------------------------------------------------- private void setHeader(String key, String value, boolean overwrite) { + if (!canSetHeader()) return; String encodedKey = SecurityUtils.crlf(key); String encodedValue = SecurityUtils.crlf(value); List values = headers.get(encodedKey); @@ -482,4 +502,8 @@ private void setHeader(String key, String value, boolean overwrite) { headers.put(encodedKey, values); } + + private boolean canSetHeader() { + return request == null || request.getDispatcherType() != DispatcherType.INCLUDE; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 991213ea..77310a42 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,57 +86,6 @@ protected AwsLambdaServletContainerHandler(Class requestTypeClass, // Methods - Public //------------------------------------------------------------- - /** - * Forwards a request to the existing framework container. This is called by the AwsProxyRequestDispatcher object - * @param servletRequest The modified request object with the new request path - * @param servletResponse The original servlet response - * @throws ServletException - * @throws IOException - */ - public void forward(ContainerRequestType servletRequest, ContainerResponseType servletResponse) - throws ServletException, IOException { - try { - handleRequest(servletRequest, (ContainerResponseType)getServletResponse(servletResponse), lambdaContext); - } catch (Exception e) { - log.error("Could not forward request", e); - throw new ServletException(e); - } - } - - - /** - * Includes a request to the existing framework container. This is called by the AwsProxyRequestDispatcher object - * @param servletRequest The modified request object with the new request path - * @param servletResponse The original servlet response - * @throws ServletException - * @throws IOException - */ - public void include(ContainerRequestType servletRequest, ContainerResponseType servletResponse) - throws ServletException, IOException { - try { - handleRequest(servletRequest, (ContainerResponseType)getServletResponse(servletResponse), lambdaContext); - } catch (Exception e) { - log.error("Could not include request", e); - throw new ServletException(e); - } - } - - private HttpServletResponse getServletResponse(ContainerResponseType resp) { - if (HttpServletResponseWrapper.class.isAssignableFrom(resp.getClass())) { - ServletResponse servletResp = ((HttpServletResponseWrapper)resp).getResponse(); - assert servletResp instanceof HttpServletResponse : servletResp.getClass(); - return (HttpServletResponse)servletResp; - } - - if (HttpServletResponse.class.isAssignableFrom(resp.getClass())) { - return resp; - } - - - throw new UnsupportedOperationException("Response type of " + resp.getClass().getName() + " is not supported"); - } - - /** * You can use the onStartup to intercept the ServletContext as the Spring application is * initialized and inject custom values. The StartupHandler is called after the onStartup method @@ -184,7 +134,7 @@ protected void setServletContext(final ServletContext context) { filterChainManager = new AwsFilterChainManager((AwsServletContext)servletContext); } - protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet) { + protected FilterChain getFilterChain(HttpServletRequest req, Servlet servlet) { return filterChainManager.getFilterChain(req, servlet); } @@ -201,16 +151,18 @@ protected FilterChain getFilterChain(ContainerRequestType req, Servlet servlet) * @throws IOException * @throws ServletException */ - protected void doFilter(ContainerRequestType request, ContainerResponseType response, Servlet servlet) throws IOException, ServletException { + protected void doFilter(HttpServletRequest request, HttpServletResponse response, Servlet servlet) throws IOException, ServletException { FilterChain chain = getFilterChain(request, servlet); chain.doFilter(request, response); // if for some reason the response wasn't flushed yet, we force it here. - if (request.getDispatcherType() != DispatcherType.FORWARD && request.getDispatcherType() != DispatcherType.INCLUDE && !response.isCommitted()) { + if (!response.isCommitted()) { response.flushBuffer(); } } + public abstract Servlet getServlet(); + //------------------------------------------------------------- // Inner Class - //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 2155323b..bb61b7b2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -1,6 +1,12 @@ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; @@ -11,6 +17,9 @@ import java.io.IOException; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE; + /** * Default RequestDispatcher implementation for the AwsProxyHttpServletRequest type. A new @@ -23,8 +32,9 @@ public class AwsProxyRequestDispatcher implements RequestDispatcher { //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- - - private String dispatchPath; + private static final Logger log = LoggerFactory.getLogger(AwsHttpSession.class); + private String dispatchTo; + private boolean isNamedDispatcher; private AwsLambdaServletContainerHandler lambdaContainerHandler; //------------------------------------------------------------- @@ -32,12 +42,13 @@ public class AwsProxyRequestDispatcher implements RequestDispatcher { //------------------------------------------------------------- - public AwsProxyRequestDispatcher(final String path, final AwsLambdaServletContainerHandler handler) { - if (!path.startsWith("/")) { + public AwsProxyRequestDispatcher(final String target, final boolean namedDispatcher, final AwsLambdaServletContainerHandler handler) { + if (!namedDispatcher && !target.startsWith("/")) { throw new UnsupportedOperationException("Only dispatchers with absolute paths are supported"); } - dispatchPath = path; + isNamedDispatcher = namedDispatcher; + dispatchTo = target; lambdaContainerHandler = handler; } @@ -50,38 +61,73 @@ public AwsProxyRequestDispatcher(final String path, final AwsLambdaServletContai @SuppressWarnings("unchecked") public void forward(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - if (!(servletRequest instanceof AwsProxyHttpServletRequest)) { - throw new IOException("Invalid request type: " + servletRequest.getClass().getSimpleName() + ". Only AwsProxyHttpServletRequest is supported"); + if (lambdaContainerHandler == null) { + throw new IllegalStateException("Null container handler in dispatcher"); + } + if (servletResponse.isCommitted()) { + throw new IllegalStateException("Cannot forward request with committed response"); } - if (lambdaContainerHandler == null) { - throw new IOException("Null container handler in dispatcher"); + try { + // Reset any output that has been buffered, but keep headers/cookies + servletResponse.resetBuffer(); + } catch (IllegalStateException e) { + throw e; } - ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.FORWARD); - ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath); + if (isNamedDispatcher) { + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); + return; + } - assert servletResponse instanceof HttpServletResponse : servletResponse.getClass(); - lambdaContainerHandler.forward((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse); + servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.FORWARD); + setRequestPath(servletRequest, dispatchTo); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); } @Override @SuppressWarnings("unchecked") + @SuppressFBWarnings("SERVLET_QUERY_STRING") public void include(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - if (!(servletRequest instanceof AwsProxyHttpServletRequest)) { - throw new IOException("Invalid request type: " + servletRequest.getClass().getSimpleName() + ". Only AwsProxyHttpServletRequest is supported"); - } - if (lambdaContainerHandler == null) { - throw new IOException("Null container handler in dispatcher"); + throw new IllegalStateException("Null container handler in dispatcher"); + } + if (servletResponse.isCommitted()) { + throw new IllegalStateException("Cannot forward request with committed response"); + } + servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.INCLUDE); + if (!isNamedDispatcher) { + servletRequest.setAttribute("javax.servlet.include.request_uri", ((HttpServletRequest)servletRequest).getRequestURI()); + servletRequest.setAttribute("javax.servlet.include.context_path", ((HttpServletRequest) servletRequest).getContextPath()); + servletRequest.setAttribute("javax.servlet.include.servlet_path", ((HttpServletRequest) servletRequest).getServletPath()); + servletRequest.setAttribute("javax.servlet.include.path_info", ((HttpServletRequest) servletRequest).getPathInfo()); + servletRequest.setAttribute("javax.servlet.include.query_string", + SecurityUtils.encode(SecurityUtils.crlf(((HttpServletRequest) servletRequest).getQueryString()))); + setRequestPath(servletRequest, dispatchTo); } + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); + } - ((AwsProxyHttpServletRequest) servletRequest).setDispatcherType(DispatcherType.INCLUDE); - ((AwsProxyHttpServletRequest) servletRequest).getAwsProxyRequest().setPath(dispatchPath); + /** + * Sets the destination path in the given request. Uses the AwsProxyRequest.setPath method which + * is in turn read by the HttpServletRequest implementation. + * @param req The request object to be modified + * @param destinationPath The new path for the request + * @throws IllegalStateException If the given request object does not include the API_GATEWAY_EVENT_PROPERTY + * attribute or the value for the attribute is not of the correct type: AwsProxyRequest. + */ + void setRequestPath(ServletRequest req, final String destinationPath) { + if (req instanceof AwsProxyHttpServletRequest) { + ((AwsProxyHttpServletRequest) req).getAwsProxyRequest().setPath(dispatchTo); + return; + } - assert servletResponse instanceof HttpServletResponse : servletResponse.getClass(); - lambdaContainerHandler.include((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse); + log.debug("Request is not an AwsProxyHttpServletRequest, attempting to extract the proxy event type"); + if (req.getAttribute(API_GATEWAY_EVENT_PROPERTY) == null || !(req.getAttribute(API_GATEWAY_EVENT_PROPERTY) instanceof AwsProxyRequest)) { + throw new IllegalStateException("ServletRequest object does not contain API Gateway event"); + } + ((AwsProxyRequest)req.getAttribute(API_GATEWAY_EVENT_PROPERTY)).setPath(dispatchTo); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index cb72e953..b3f2f1fd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -179,7 +179,7 @@ public InputStream getResourceAsStream(String s) { @Override public RequestDispatcher getRequestDispatcher(String s) { - return new AwsProxyRequestDispatcher(s, containerHandler); + return new AwsProxyRequestDispatcher(s, false, containerHandler); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java new file mode 100644 index 00000000..05aa6ae6 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java @@ -0,0 +1,221 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.Test; +import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper; + +import javax.servlet.Servlet; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.concurrent.CountDownLatch; + +import static junit.framework.TestCase.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class AwsProxyRequestDispatcherTest { + public static final String FORWARD_PATH = "/newpath"; + static AwsProxyHttpServletRequestReader requestReader = new AwsProxyHttpServletRequestReader(); + + + @Test + public void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); + dispatcher.setRequestPath(servletRequest, FORWARD_PATH); + assertEquals(FORWARD_PATH, servletRequest.getRequestURI()); + } + + @Test + public void setPathForWrappedRequest_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + SecurityContextHolderAwareRequestWrapper springSecurityRequest = new SecurityContextHolderAwareRequestWrapper(servletRequest, "ADMIN"); + + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); + dispatcher.setRequestPath(springSecurityRequest, FORWARD_PATH); + assertEquals(FORWARD_PATH, springSecurityRequest.getRequestURI()); + } + + @Test + public void setPathForWrappedRequestWithoutGatewayEvent_forwardByPath_throwsException() { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyRequest, new MockLambdaContext(), null); + SecurityContextHolderAwareRequestWrapper springSecurityRequest = new SecurityContextHolderAwareRequestWrapper(servletRequest, "ADMIN"); + + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); + try { + dispatcher.setRequestPath(springSecurityRequest, FORWARD_PATH); + } catch (Exception e) { + assertTrue(e instanceof IllegalStateException); + return; + } + fail(); + } + + @Test + public void forwardRequest_nullHandler_throwsIllegalStateException() throws InvalidRequestEventException { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); + try { + dispatcher.forward(servletRequest, new AwsHttpServletResponse(servletRequest, new CountDownLatch(1))); + } catch (ServletException e) { + fail("Unexpected ServletException"); + } catch (IOException e) { + fail("Unexpected IOException"); + } catch (Exception e) { + assertTrue(e instanceof IllegalStateException); + return; + } + fail(); + } + + @Test + public void forwardRequest_committedResponse_throwsIllegalStateException() throws InvalidRequestEventException { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); + AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); + + try { + resp.flushBuffer(); + dispatcher.forward(servletRequest, resp); + } catch (ServletException e) { + fail("Unexpected ServletException"); + } catch (IOException e) { + fail("Unexpected IOException"); + } catch (Exception e) { + assertTrue(e instanceof IllegalStateException); + return; + } + fail(); + } + + @Test + public void forwardRequest_partiallyWrittenResponse_resetsBuffer() throws InvalidRequestEventException { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); + AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); + + try { + resp.getOutputStream().write("this is a test write".getBytes()); + assertEquals("this is a test write", new String(resp.getAwsResponseBodyBytes(), Charset.defaultCharset())); + dispatcher.forward(servletRequest, resp); + assertEquals(0, resp.getAwsResponseBodyBytes().length); + + } catch (ServletException e) { + fail("Unexpected ServletException"); + } catch (IOException e) { + fail("Unexpected IOException"); + } + } + + @Test + public void include_addsToResponse_appendsCorrectly() throws InvalidRequestEventException, IOException { + final String firstPart = "first"; + final String secondPart = "second"; + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + + AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res)-> { + if (req.getAttribute("cnt") == null) { + res.getOutputStream().write(firstPart.getBytes()); + req.setAttribute("cnt", 1); + req.getRequestDispatcher("/includer").include(req, res); + res.setStatus(200); + res.flushBuffer(); + } else { + res.getOutputStream().write(secondPart.getBytes()); + } + }).proxy(proxyRequest, new MockLambdaContext()); + assertEquals(firstPart + secondPart, resp.getBody()); + } + + @Test + public void include_appendsNewHeader_cannotAppendNewHeaders() throws InvalidRequestEventException, IOException { + final String firstPart = "first"; + final String secondPart = "second"; + final String headerKey = "X-Custom-Header"; + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); + + AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res)-> { + if (req.getAttribute("cnt") == null) { + res.getOutputStream().write(firstPart.getBytes()); + req.setAttribute("cnt", 1); + req.getRequestDispatcher("/includer").include(req, res); + res.setStatus(200); + res.flushBuffer(); + } else { + res.getOutputStream().write(secondPart.getBytes()); + res.addHeader(headerKey, "value"); + } + }).proxy(proxyRequest, new MockLambdaContext()); + assertEquals(firstPart + secondPart, resp.getBody()); + assertFalse(resp.getMultiValueHeaders().containsKey(headerKey)); + } + + private interface RequestHandler { + void handleRequest(AwsProxyHttpServletRequest req, AwsHttpServletResponse resp) throws ServletException, IOException; + } + + + private AwsLambdaServletContainerHandler mockLambdaHandler(RequestHandler h) { + return new AwsLambdaServletContainerHandler( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler() + ) { + @Override + public Servlet getServlet() { + return null; + } + + @Override + protected void doFilter(HttpServletRequest request, HttpServletResponse response, Servlet servlet) throws IOException, ServletException { + if (h != null) { + h.handleRequest((AwsProxyHttpServletRequest)request, (AwsHttpServletResponse)response); + } + } + + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + if (h != null) { + + setServletContext(new AwsServletContext(this)); + containerRequest.setServletContext(getServletContext()); + + h.handleRequest(containerRequest, containerResponse); + } + containerResponse.flushBuffer(); + } + + @Override + public void initialize() throws ContainerInitializationException { + + } + }; + } +} diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index dd9166f7..cd99133a 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -40,6 +40,7 @@ import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; +import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -205,4 +206,8 @@ public InjectionManager getInjectionManager() { } return jerseyFilter.getApplicationHandler().getInjectionManager(); } + + public Servlet getServlet() { + return null; + } } diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 24714041..dfea2901 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -37,6 +37,7 @@ import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; +import javax.servlet.Servlet; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -217,4 +218,8 @@ public void initialize() sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); Timer.stop("SPARK_COLD_START"); } + + public Servlet getServlet() { + return null; + } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 6de1fcaf..68cab4f7 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -186,6 +186,10 @@ public void initialize() Timer.stop("SPRINGBOOT_COLD_START"); } + public Servlet getServlet() { + return dispatcherServlet; + } + private class SpringBootAwsServletContext extends AwsServletContext { public SpringBootAwsServletContext() { diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 28bff8af..7fd87803 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -27,6 +27,7 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import javax.servlet.Servlet; import javax.servlet.ServletException; import java.util.concurrent.CountDownLatch; @@ -197,4 +198,8 @@ public void initialize() initialized = true; Timer.stop("SPRING_COLD_START"); } + + public Servlet getServlet() { + return initializer.getDispatcherServlet(); + } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java new file mode 100644 index 00000000..dc46ed33 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.proxy.spring; + + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; +import com.amazonaws.serverless.proxy.spring.sbsecurityapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.sbsecurityapp.TestController; +import com.amazonaws.serverless.proxy.spring.sbsecurityapp.TestSecurityConfig; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import org.junit.Test; + +import javax.ws.rs.core.HttpHeaders; +import java.io.IOException; +import java.util.Base64; + +import static org.junit.Assert.*; + + +public class SpringBootSecurityTest { + private LambdaHandler handler = new LambdaHandler(); + private MockLambdaContext context = new MockLambdaContext(); + private ObjectMapper mapper = new ObjectMapper(); + + @Test + public void correctUser_springSecurityBasicAuth_requestSucceeds() throws JsonProcessingException { + String authValue = Base64.getMimeEncoder().encodeToString((TestSecurityConfig.USERNAME + ":" + TestSecurityConfig.PASSWORD).getBytes()); + AwsProxyRequest req = new AwsProxyRequestBuilder("/user", "GET") + .header(HttpHeaders.AUTHORIZATION, "Basic " + authValue).build(); + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, TestSecurityConfig.USERNAME); + } + + @Test + public void wrongUser_springSecurityBasicAuth_requestRedirectsSuccessfully() throws JsonProcessingException { + String authValue = Base64.getMimeEncoder().encodeToString((TestSecurityConfig.NO_ADMIN_USERNAME + ":" + TestSecurityConfig.PASSWORD).getBytes()); + AwsProxyRequest req = new AwsProxyRequestBuilder("/user", "GET") + .header(HttpHeaders.AUTHORIZATION, "Basic " + authValue).build(); + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + mapper.enable(SerializationFeature.INDENT_OUTPUT); + System.out.println(mapper.writeValueAsString(resp.getMultiValueHeaders())); + assertEquals(403, resp.getStatusCode()); + validateSingleValueModel(resp, TestController.ACCESS_DENIED); + } + + private void validateSingleValueModel(AwsProxyResponse output, String value) { + try { + SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class); + assertNotNull(response.getValue()); + assertEquals(value, response.getValue()); + } catch (IOException e) { + fail("Exception while parsing response body: " + e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java new file mode 100644 index 00000000..b5a7ea96 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java @@ -0,0 +1,33 @@ +package com.amazonaws.serverless.proxy.spring.sbsecurityapp; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + + +public class LambdaHandler + implements RequestHandler +{ + SpringBootLambdaContainerHandler handler; + boolean isinitialized = false; + + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) + { + if (!isinitialized) { + isinitialized = true; + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + return null; + } + } + AwsProxyResponse res = handler.proxy(awsProxyRequest, context); + return res; + } +} + diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java new file mode 100644 index 00000000..34be320f --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java @@ -0,0 +1,13 @@ +package com.amazonaws.serverless.proxy.spring.sbsecurityapp; + + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.PropertySource; + + +@SpringBootApplication +@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.sbsecurityapp") +public class TestApplication extends SpringBootServletInitializer { +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java new file mode 100644 index 00000000..351ddce1 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java @@ -0,0 +1,48 @@ +package com.amazonaws.serverless.proxy.spring.sbsecurityapp; + + +import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import javax.servlet.http.HttpServletResponse; +import java.security.Principal; +import java.util.List; + + +@RestController +public class TestController { + public static final String ACCESS_DENIED = "AccessDenied"; + + @RequestMapping(path = "/user", method = { RequestMethod.GET }) + public SingleValueModel testGet() { + Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + SingleValueModel value = new SingleValueModel(); + + if (principal instanceof UserDetails) { + String username = ((UserDetails)principal).getUsername(); + value.setValue(username); + } else { + value.setValue(null); + } + System.out.println("Principal: " + value.getValue()); + return value; + } + + @RequestMapping(path = "/access-denied", method = { RequestMethod.GET }) + public SingleValueModel accessDenied() { + SingleValueModel model = new SingleValueModel(); + model.setValue(ACCESS_DENIED); + return model; + } + + +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java new file mode 100644 index 00000000..13b1ed87 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.proxy.spring.sbsecurityapp; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableWebSecurity +public class TestSecurityConfig extends WebSecurityConfigurerAdapter { + public static final String USERNAME = "test"; + public static final String NO_ADMIN_USERNAME = "test2"; + public static final String PASSWORD = "123"; + public static BCryptPasswordEncoder pEncoder = new BCryptPasswordEncoder(); + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication().withUser(USERNAME).password(pEncoder.encode(PASSWORD)).roles("ADMIN") + .and().withUser(NO_ADMIN_USERNAME).password(pEncoder.encode(PASSWORD)).roles("USER") + .and().passwordEncoder(pEncoder); + System.out.println("Configure authentication manager"); + } + + @Override + public void configure(WebSecurity web) throws Exception { + System.out.println("Configure Web security"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable(); + http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + http.httpBasic(); + http + .authorizeRequests() + .antMatchers("/user").hasRole("ADMIN") + .and().exceptionHandling().accessDeniedPage("/access-denied"); + } +} diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java index 003390ec..b9f4f587 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java @@ -22,6 +22,7 @@ import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; +import javax.servlet.Servlet; import java.util.EnumSet; import java.util.concurrent.CountDownLatch; @@ -109,4 +110,8 @@ public void initialize() throws ContainerInitializationException { Timer.stop(TIMER_STRUTS_2_COLD_START_INIT); log.info("... initialize of Struts2 Lambda Application completed!"); } + + public Servlet getServlet() { + return null; + } } From d22d84bc38dd88540d64f0fa96ee353cdd85b677 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Aug 2019 11:10:35 -0700 Subject: [PATCH 0305/1214] Updated filter chain to skip filters that should not be applied based on their registration's DispatcherTypes. Changed the default registration to include REQUEST and ASYNC types. This completes the changes for #275 --- .../proxy/internal/servlet/FilterChainHolder.java | 6 ++++++ .../serverless/proxy/internal/servlet/FilterHolder.java | 1 + .../proxy/jersey/JerseyLambdaContainerHandler.java | 5 ++++- .../serverless/proxy/spark/SparkLambdaContainerHandler.java | 4 +++- .../proxy/struts2/Struts2LambdaContainerHandler.java | 4 +++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index 44c8fa95..bec7a8f4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -75,6 +75,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (currentFilter <= filters.size() - 1) { FilterHolder holder = filters.get(currentFilter); + // confirm that this filter needs to be executed + if (!holder.getRegistration().getDispatcherTypes().contains(servletRequest.getDispatcherType())) { + // skip to the next filter - we have already incremented the currentFilter + doFilter(servletRequest, servletResponse); + } + // lazily initialize filters when they are needed if (!holder.isFilterInitialized()) { holder.init(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index 2610622d..893075d2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -289,6 +289,7 @@ public Collection getServletNameMappings() { public void addMappingForUrlPatterns(EnumSet types, boolean isLast, String... patterns) { if (types == null) { dispatcherTypes.add(DispatcherType.REQUEST); + dispatcherTypes.add(DispatcherType.ASYNC); } else { dispatcherTypes.addAll(types); } diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index cd99133a..83c01a33 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -193,7 +193,10 @@ public void initialize() { // manually add the spark filter to the chain. This should the last one and match all uris FilterRegistration.Dynamic jerseyFilterReg = getServletContext().addFilter("JerseyFilter", jerseyFilter); - jerseyFilterReg.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + jerseyFilterReg.addMappingForUrlPatterns( + EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), + true, "/*" + ); Timer.stop("JERSEY_COLD_START_INIT"); initialized = true; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index dfea2901..368a5e81 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -215,7 +215,9 @@ public void initialize() // manually add the spark filter to the chain. This should the last one and match all uris FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); - sparkRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + sparkRegistration.addMappingForUrlPatterns( + EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), + true, "/*"); Timer.stop("SPARK_COLD_START"); } diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java index b9f4f587..25a2f7f9 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java @@ -101,7 +101,9 @@ public void initialize() throws ContainerInitializationException { StrutsPrepareAndExecuteFilter filter = new StrutsPrepareAndExecuteFilter(); FilterRegistration.Dynamic filterRegistration = this.getServletContext() .addFilter(STRUTS_FILTER_NAME, filter); - filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + filterRegistration.addMappingForUrlPatterns( + EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), + true, "/*"); } catch (Exception e) { throw new ContainerInitializationException("Could not initialize Struts2", e); } From ce6710efa750d17a2d09425db60061cfbdcaaa8b Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Aug 2019 11:59:35 -0700 Subject: [PATCH 0306/1214] Bump jackson version to address vulnerability reported by github --- aws-serverless-java-container-core/pom.xml | 10 ++++++++-- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 9 files changed, 16 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fe0e6625..52d05b29 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.9.9 + 2.9.9.3 2.1 3.1.0 @@ -54,7 +54,13 @@ com.fasterxml.jackson.module jackson-module-afterburner - ${jackson.version} + 2.9.9 + + + com.fasterxml.jackson.core + jackson-databind + + diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f92c9d70..80a21388 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -60,7 +60,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9 + 2.9.9.3 true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index e1a3e9c2..15e62930 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -19,7 +19,7 @@ 5.1.8.RELEASE 1.5.21.RELEASE 5.1.5.RELEASE - 2.9.9 + 2.9.9.3 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index f981e087..e414eab5 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ 2.5.20 - 2.9.9 + 2.9.9.3 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 54951172..fd34a171 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.27 - 2.9.9 + 2.9.9.3 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index ca9d4dd1..6d8db992 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.9.9 + 2.9.9.3 2.8.0 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index d85e13b0..ddf808ce 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -77,7 +77,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9 + 2.9.9.3 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 32181f3c..e71a773b 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.9 + 2.9.9.3 2.8.0 diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 5763b94a..5d278dd0 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.20 - 2.9.9 + 2.9.9.3 4.12 2.11.1 From 0e72367669eee8132bddf6a3f1f476b56b2614cd Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Aug 2019 13:53:39 -0700 Subject: [PATCH 0307/1214] Fixed Jackson versions to only bump databind --- samples/struts/pet-store/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 5d278dd0..2cff49e5 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,8 @@ 1.8 1.8 2.5.20 - 2.9.9.3 + 2.9.9 + 2.9.9.3 4.12 2.11.1 @@ -97,7 +98,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson-databind.version} From cf60ea63b9ddc0bfc5aa29378107b8900559b026 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 14 Aug 2019 17:59:50 -0700 Subject: [PATCH 0308/1214] Unit tests for SecurityUtils and new jacoco coverage check to block the build at 70%. Finally closing #160 --- aws-serverless-java-container-core/pom.xml | 3 + .../proxy/internal/SecurityUtilsTest.java | 81 +++++++++++++++++++ pom.xml | 2 +- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 52d05b29..f5fafe2e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -109,6 +109,9 @@ ${basedir}/target/coverage-reports/jacoco-unit.exec ${basedir}/target/coverage-reports/jacoco-unit.exec + + com/amazonaws/serverless/proxy/internal/testutils/** + diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java new file mode 100644 index 00000000..2e8fb5c2 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java @@ -0,0 +1,81 @@ +package com.amazonaws.serverless.proxy.internal; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static junit.framework.TestCase.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class SecurityUtilsTest { + + private static final HashMap NAUGHTY_UNICODE_STRINGS = new HashMap<>(); + static { + NAUGHTY_UNICODE_STRINGS.put("Ω≈ç√∫˜µ≤≥÷", "\\u03A9\\u2248\\u00E7\\u221A\\u222B\\u02DC\\u00B5\\u2264\\u2265\\u00F7"); + NAUGHTY_UNICODE_STRINGS.put("åß∂ƒ©˙∆˚¬…æ", "\\u00E5\\u00DF\\u2202\\u0192\\u00A9\\u02D9\\u2206\\u02DA\\u00AC\\u2026\\u00E6"); + NAUGHTY_UNICODE_STRINGS.put("œ∑´®†¥¨ˆøπ“‘", "\\u0153\\u2211\\u00B4\\u00AE\\u2020\\u00A5\\u00A8\\u02C6\\u00F8\\u03C0\\u201C\\u2018"); + NAUGHTY_UNICODE_STRINGS.put("¡™£¢∞§¶•ªº–≠", "\\u00A1\\u2122\\u00A3\\u00A2\\u221E\\u00A7\\u00B6\\u2022\\u00AA\\u00BA\\u2013\\u2260"); + NAUGHTY_UNICODE_STRINGS.put("¸˛Ç◊ı˜Â¯˘¿", "\\u00B8\\u02DB\\u00C7\\u25CA\\u0131\\u02DC\\u00C2\\u00AF\\u02D8\\u00BF"); + NAUGHTY_UNICODE_STRINGS.put("ÅÍÎÏ˝ÓÔÒÚÆ☃", "\\u00C5\\u00CD\\u00CE\\u00CF\\u02DD\\u00D3\\u00D4\\uF8FF\\u00D2\\u00DA\\u00C6\\u2603"); + NAUGHTY_UNICODE_STRINGS.put("Œ„´‰ˇÁ¨ˆØ∏”’", "\\u0152\\u201E\\u00B4\\u2030\\u02C7\\u00C1\\u00A8\\u02C6\\u00D8\\u220F\\u201D\\u2019"); + NAUGHTY_UNICODE_STRINGS.put("⅛⅜⅝⅞", "\\u215B\\u215C\\u215D\\u215E"); + NAUGHTY_UNICODE_STRINGS.put("ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя", "\\u0401\\u0402\\u0403\\u0404\\u0405\\u0406\\u0407\\u0408\\u0409\\u040A\\u040B\\u040C\\u040D\\u040E\\u040F\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\\u044F"); + NAUGHTY_UNICODE_STRINGS.put("\bhello\nhello\thello\fhello\r", "\\bhello\\nhello\\thello\\fhello\\r"); + NAUGHTY_UNICODE_STRINGS.put("\'", "\'"); + NAUGHTY_UNICODE_STRINGS.put("\"", "\\\""); + NAUGHTY_UNICODE_STRINGS.put("\\", "\\\\"); + NAUGHTY_UNICODE_STRINGS.put("ò", "\\u00F2"); + } + + + @Test + public void encode_nullString_returnsNullIfStringIsNull() { + assertNull(SecurityUtils.encode(null)); + } + + @Test + public void encode_naughtyStrings_encodedCorrectly() { + for (Map.Entry e : NAUGHTY_UNICODE_STRINGS.entrySet()) { + assertEquals(e.getValue(), SecurityUtils.encode(e.getKey())); + } + } + + @Test + public void getValidFilePath_nullOrEmpty_returnsNull() { + assertNull(SecurityUtils.getValidFilePath("")); + assertNull(SecurityUtils.getValidFilePath(null)); + } + + @Test + public void getValidFilePath_writeToTaskPath_throwsIllegalArgumentException() { + boolean thrown = false; + try { + SecurityUtils.getValidFilePath("/var/task/test.txt", true); + } catch (IllegalArgumentException e) { + thrown = true; + } + if (!thrown) { + fail("Did not throw exception"); + } + + try { + SecurityUtils.getValidFilePath("file:///var/task/test.txt", true); + } catch (IllegalArgumentException e) { + return; + } + + fail(); + } + + @Test + public void getValidFilePath_writeToBlockedPath_throwsIllegalArgumentException() { + try { + SecurityUtils.getValidFilePath("/usr/lib/test.txt"); + } catch (IllegalArgumentException e) { + return; + } + fail("Did not throw exception"); + } +} diff --git a/pom.xml b/pom.xml index 72fc1071..807aecd9 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ - 0.5 + 0.7 5.1.0 From fa6b5961a5bf25eb9b5f4bc9957c17e73e306d94 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 15 Aug 2019 09:17:05 -0700 Subject: [PATCH 0309/1214] New unit tests for path validation filter and response writer --- .../servlet/filters/UrlPathValidator.java | 12 ++ .../serverless/proxy/ResponseWriterTest.java | 76 +++++++++++ .../servlet/filters/UrlPathValidatorTest.java | 120 ++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index a8df2217..23214a3e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -54,6 +54,10 @@ public class UrlPathValidator implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { + if (filterConfig == null) { + invalidStatusCode = DEFAULT_ERROR_CODE; + return; + } if (filterConfig.getInitParameter(PARAM_INVALID_STATUS_CODE) != null) { String statusCode = filterConfig.getInitParameter(PARAM_INVALID_STATUS_CODE); try { @@ -104,6 +108,14 @@ public void destroy() { } + /** + * Returns the status code used in the errors generated by this filter. + * @return The default status code the filter will use + */ + public int getInvalidStatusCode() { + return invalidStatusCode; + } + //------------------------------------------------------------- // Methods - Private diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java new file mode 100644 index 00000000..863ea583 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java @@ -0,0 +1,76 @@ +package com.amazonaws.serverless.proxy; + +import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.Test; + +import javax.servlet.http.HttpServletRequest; + +import java.nio.ByteBuffer; + +import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertFalse; + +public class ResponseWriterTest { + private static int[][] NAUGHTY_STRINGS = { + new int[] { 0b11111110 }, new int[] { 0xff }, new int[] {0xfe, 0xfe, 0xff, 0xff } + }; + + private static String[] VALID_STRINGS = { + "ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ\nᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ\nᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬", + "Τη γλώσσα μου έδωσαν ελληνική\nτο σπίτι φτωχικό στις αμμουδιές του Ομήρου.\nΜονάχη έγνοια η γλώσσα μου στις αμμουδιές του Ομήρου.", + "ვეპხის ტყაოსანი შოთა რუსთაველი\nღმერთსი შემვედრე, ნუთუ კვლა დამხსნას სოფლისა შრომასა, ცეცხლს, წყალსა და მიწასა, ჰაერთა თანა მრომასა; მომცნეს ფრთენი და აღვფრინდე, მივჰხვდე მას ჩემსა ნდომასა, დღისით და ღამით ვჰხედვიდე მზისა ელვათა კრთომაასა.", + "ಬಾ ಇಲ್ಲಿ ಸಂಭವಿಸು ಇಂದೆನ್ನ ಹೃದಯದಲಿ \nನಿತ್ಯವೂ ಅವತರಿಪ ಸತ್ಯಾವತಾರ\nಮಣ್ಣಾಗಿ ಮರವಾಗಿ ಮಿಗವಾಗಿ ಕಗವಾಗೀ... \nಮಣ್ಣಾಗಿ ಮರವಾಗಿ ಮಿಗವಾಗಿ ಕಗವಾಗಿ \nಭವ ಭವದಿ ಭತಿಸಿಹೇ ಭವತಿ ದೂರ \nನಿತ್ಯವೂ ಅವತರಿಪ ಸತ್ಯಾವತಾರ || ಬಾ ಇಲ್ಲಿ ||" + }; + + @Test + public void isValidUtf8_testNaughtyStrings_allShouldFail() { + MockResponseWriter rw = new MockResponseWriter(); + for (int[] s : NAUGHTY_STRINGS) { + byte[] buf = new byte[s.length * 4]; + int pos = 0; + for (int v : s) { + for (byte b : convert2Bytes(v)) { + buf[pos] = b; + pos++; + } + } + assertFalse(rw.isValidUtf8(buf)); + } + } + + @Test + public void isValidUtf8_testUtf8Strings_allShouldSucceed() { + MockResponseWriter rw = new MockResponseWriter(); + for (String s : VALID_STRINGS) { + assertTrue(rw.isValidUtf8(s.getBytes())); + } + } + + //little endian + public static byte[] convert2Bytes(int src) { + //an int is equivalent to 32 bits, 4 bytes + byte tgt[] = new byte[4]; + int mask = 0377; /* 0377 in octal*/ + + tgt[3] = (byte)(src >>> 24); + tgt[2] = (byte)((src >> 16) & 0xff); + tgt[1] = (byte)((src >> 8) & 0xff); + tgt[0] = (byte)(src & 0xff); + + return tgt; + } + + public class MockResponseWriter extends ResponseWriter { + + @Override + public HttpServletRequest writeResponse(AwsProxyHttpServletRequest containerResponse, Context lambdaContext) throws InvalidResponseObjectException { + return null; + } + + public boolean testValidUtf8(final byte[] input) { + return isValidUtf8(input); + } + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java new file mode 100644 index 00000000..beb273d5 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java @@ -0,0 +1,120 @@ +package com.amazonaws.serverless.proxy.internal.servlet.filters; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.FilterHolder; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import org.junit.Test; + +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import java.io.IOException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.fail; + +public class UrlPathValidatorTest { + @Test + public void init_noConfig_setsDefaultStatusCode() { + UrlPathValidator pathValidator = new UrlPathValidator(); + try { + pathValidator.init(null); + assertEquals(UrlPathValidator.DEFAULT_ERROR_CODE, pathValidator.getInvalidStatusCode()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Unexpected ServletException"); + } + } + + @Test + public void init_withConfig_setsCorrectStatusCode() { + UrlPathValidator pathValidator = new UrlPathValidator(); + Map params = new HashMap<>(); + params.put(UrlPathValidator.PARAM_INVALID_STATUS_CODE, "401"); + FilterConfig cnf = mockFilterConfig(params); + try { + pathValidator.init(cnf); + assertEquals(401, pathValidator.getInvalidStatusCode()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Unexpected ServletException"); + } + } + + @Test + public void init_withWrongConfig_setsDefaultStatusCode() { + UrlPathValidator pathValidator = new UrlPathValidator(); + Map params = new HashMap<>(); + params.put(UrlPathValidator.PARAM_INVALID_STATUS_CODE, "hello"); + FilterConfig cnf = mockFilterConfig(params); + try { + pathValidator.init(cnf); + assertEquals(UrlPathValidator.DEFAULT_ERROR_CODE, pathValidator.getInvalidStatusCode()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Unexpected ServletException"); + } + } + + @Test + public void doFilter_invalidRelativePathUri_setsDefaultStatusCode() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("../..", "GET").build(), null, null); + AwsHttpServletResponse resp = new AwsHttpServletResponse(req, null); + UrlPathValidator pathValidator = new UrlPathValidator(); + try { + pathValidator.init(null); + pathValidator.doFilter(req, resp, null); + assertEquals(UrlPathValidator.DEFAULT_ERROR_CODE, resp.getStatus()); + } catch (Exception e) { + e.printStackTrace(); + fail("Unexpected exception"); + } + } + + @Test + public void doFilter_invalidUri_setsDefaultStatusCode() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("wonkyprotocol://˝Ó#\u0009", "GET").build(), null, null); + AwsHttpServletResponse resp = new AwsHttpServletResponse(req, null); + UrlPathValidator pathValidator = new UrlPathValidator(); + try { + pathValidator.init(null); + pathValidator.doFilter(req, resp, null); + assertEquals(UrlPathValidator.DEFAULT_ERROR_CODE, resp.getStatus()); + } catch (Exception e) { + e.printStackTrace(); + fail("Unexpected exception"); + } + } + + + private FilterConfig mockFilterConfig(Map initParams) { + return new FilterConfig() { + @Override + public String getFilterName() { + return null; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public String getInitParameter(String s) { + return initParams.get(s); + } + + @Override + public Enumeration getInitParameterNames() { + return Collections.enumeration(initParams.keySet()); + } + }; + } +} From 8128f7809611642f35a66bdbfa77d85067074ca9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 12:37:13 -0700 Subject: [PATCH 0310/1214] First basic implementation of the AsyncContext. This allows us to support WebFlux and reactive embedded servers for Spring to address #239 --- .../internal/servlet/AwsAsyncContext.java | 205 +++++++++ .../servlet/AwsHttpServletRequest.java | 17 +- .../servlet/AwsHttpServletRequestWrapper.java | 393 ++++++++++++++++++ .../servlet/AwsHttpServletResponse.java | 5 +- .../internal/servlet/AwsHttpSession.java | 2 +- .../AwsLambdaServletContainerHandler.java | 12 +- .../servlet/AwsProxyHttpServletRequest.java | 48 ++- .../servlet/AwsProxyRequestDispatcher.java | 16 +- .../internal/servlet/AwsServletContext.java | 114 +++-- .../servlet/AwsServletRegistration.java | 157 +++++++ .../internal/servlet/AwsAsyncContextTest.java | 140 +++++++ .../servlet/AwsFilterChainManagerTest.java | 5 +- .../servlet/AwsHttpServletRequestTest.java | 7 - .../servlet/AwsHttpServletResponseTest.java | 9 - .../internal/servlet/AwsHttpSessionTest.java | 109 +++++ .../AwsProxyHttpServletRequestTest.java | 109 +++-- .../AwsProxyRequestDispatcherTest.java | 4 - .../servlet/AwsServletContextTest.java | 150 ++++--- .../servlet/AwsServletRegistrationTest.java | 109 +++++ .../proxy/model/AwsProxyRequestTest.java | 2 +- .../LambdaSpringApplicationInitializer.java | 222 ---------- 21 files changed, 1415 insertions(+), 420 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java delete mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java new file mode 100644 index 00000000..ae6d1869 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -0,0 +1,205 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + + +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Async context for Serverless Java Container. This is used to support reactive embedded servers for our support for + * Spring Boot 2. Behind the scenes, the Async context still uses the CountDownLatch to synchronize response + * generation. + */ +public class AwsAsyncContext implements AsyncContext { + private HttpServletRequest req; + private HttpServletResponse res; + private AwsLambdaServletContainerHandler handler; + private List listeners; + private long timeout; + + private Logger log = LoggerFactory.getLogger(AwsAsyncContext.class); + + public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response, AwsLambdaServletContainerHandler servletHandler) { + log.debug("Initializing async context for request: " + SecurityUtils.crlf(request.getPathInfo()) + " - " + SecurityUtils.crlf(request.getMethod())); + req = request; + res = response; + handler = servletHandler; + listeners = new ArrayList<>(); + timeout = 3000; + } + + @Override + public ServletRequest getRequest() { + return req; + } + + @Override + public ServletResponse getResponse() { + return res; + } + + @Override + public boolean hasOriginalRequestAndResponse() { + return true; + } + + @Override + public void dispatch() { + try { + log.debug("Dispatching request"); + notifyListeners(NotificationType.START_ASYNC, null); + Servlet servlet = ((AwsServletContext)handler.getServletContext()).getServletForPath(req.getPathInfo()); + handler.doFilter(req, res, servlet); + } catch (ServletException | IOException e) { + notifyListeners(NotificationType.ERROR, e); + } + } + + @Override + public void dispatch(String s) { + // amend the request path + req = new AwsHttpServletRequestWrapper(req, s); + + dispatch(); + } + + @Override + public void dispatch(ServletContext servletContext, String s) { + req = new AwsHttpServletRequestWrapper(req, s); + ((AwsHttpServletRequestWrapper)req).setServletContext(servletContext); + dispatch(s); + } + + @Override + public void complete() { + try { + log.debug("Completing request"); + notifyListeners(NotificationType.COMPLETE, null); + res.flushBuffer(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void start(Runnable runnable) { + throw new UnsupportedOperationException("Cannot start background tasks"); + } + + @Override + public void addListener(AsyncListener asyncListener) { + listeners.add(new AsyncListenerHolder(asyncListener, this)); + } + + @Override + public void addListener(AsyncListener asyncListener, ServletRequest servletRequest, ServletResponse servletResponse) { + AsyncListenerHolder holder = new AsyncListenerHolder(asyncListener, this); + holder.setSuppliedRequest(servletRequest); + holder.setSuppliedResponse(servletResponse); + listeners.add(holder); + } + + @Override + public T createListener(Class aClass) throws ServletException { + return null; + } + + @Override + public void setTimeout(long l) { + timeout = l; + } + + @Override + public long getTimeout() { + return timeout; + } + + private void notifyListeners(NotificationType type, Throwable t) { + listeners.forEach((h) -> { + try { + switch (type) { + case COMPLETE: + case START_ASYNC: + case TIMEOUT: + h.getListener().onComplete(h.getAsyncEvent()); + break; + case ERROR: + h.getListener().onError(h.getAsyncEvent(t)); + break; + } + } catch (IOException e) { + if (type != NotificationType.ERROR) { + notifyListeners(NotificationType.ERROR, e); + } + } + }); + } + + private enum NotificationType { + COMPLETE, + ERROR, + START_ASYNC, + TIMEOUT + } + + /** + * The listener holder wraps and AsyncListener with information about its context such as the request, + * response, and async servlet context. + */ + private static final class AsyncListenerHolder { + private AsyncListener listener; + private ServletRequest suppliedRequest; + private ServletResponse suppliedResponse; + private AsyncContext context; + + public AsyncListenerHolder(AsyncListener l, AsyncContext ctx) { + listener = l; + context = ctx; + } + + public AsyncListener getListener() { + return listener; + } + + public void setListener(AsyncListener listener) { + this.listener = listener; + } + + public ServletRequest getSuppliedRequest() { + return suppliedRequest; + } + + public void setSuppliedRequest(ServletRequest suppliedRequest) { + this.suppliedRequest = suppliedRequest; + } + + public ServletResponse getSuppliedResponse() { + return suppliedResponse; + } + + public void setSuppliedResponse(ServletResponse suppliedResponse) { + this.suppliedResponse = suppliedResponse; + } + + public AsyncEvent getAsyncEvent(Throwable t) { + if (suppliedRequest != null && suppliedResponse != null) { + if (t != null) { + return new AsyncEvent(context, suppliedRequest, suppliedResponse, t); + } + return new AsyncEvent(context, suppliedRequest, suppliedResponse); + } + return new AsyncEvent(context); + } + + public AsyncEvent getAsyncEvent() { + return getAsyncEvent(null); + } + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index d6a11a96..35773cee 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -23,12 +23,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.AsyncContext; -import javax.servlet.DispatcherType; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; +import javax.servlet.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.UnsupportedEncodingException; @@ -81,7 +79,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private String queryString; private BasicHeaderValueParser headerParser; - private Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class); + private static Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class); //------------------------------------------------------------- @@ -241,13 +239,6 @@ public boolean isAsyncSupported() { return false; } - - @Override - public AsyncContext getAsyncContext() { - return null; - } - - @Override public DispatcherType getDispatcherType() { if (getAttribute(DISPATCHER_TYPE_ATTRIBUTE) != null) { @@ -424,7 +415,7 @@ protected List parseHeaderValue(String headerValue, String valueSep return values; } - protected String decodeRequestPath(String requestPath, ContainerConfig config) { + static String decodeRequestPath(String requestPath, ContainerConfig config) { try { return URLDecoder.decode(requestPath, config.getUriEncoding()); } catch (UnsupportedEncodingException ex) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java new file mode 100644 index 00000000..a8ee1840 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -0,0 +1,393 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + +import javax.servlet.*; +import javax.servlet.http.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Map; + +import static com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest.cleanUri; + +public class AwsHttpServletRequestWrapper implements HttpServletRequest { + private HttpServletRequest originalRequest; + private String newPath; + private ServletContext ctx; + + public AwsHttpServletRequestWrapper(HttpServletRequest req, String path) { + originalRequest = req; + newPath = path; + ctx = originalRequest.getServletContext(); + } + + public void setServletContext(ServletContext newContext) { + ctx = newContext; + } + + @Override + public String getAuthType() { + return originalRequest.getAuthType(); + } + + @Override + public Cookie[] getCookies() { + return originalRequest.getCookies(); + } + + @Override + public long getDateHeader(String s) { + return originalRequest.getDateHeader(s); + } + + @Override + @SuppressFBWarnings("SERVLET_HEADER") + public String getHeader(String s) { + return originalRequest.getHeader(s); + } + + @Override + public Enumeration getHeaders(String s) { + return originalRequest.getHeaders(s); + } + + @Override + public Enumeration getHeaderNames() { + return originalRequest.getHeaderNames(); + } + + @Override + public int getIntHeader(String s) { + return originalRequest.getIntHeader(s); + } + + @Override + public String getMethod() { + return originalRequest.getMethod(); + } + + @Override + public String getPathInfo() { + String pathInfo = cleanUri(newPath); + return AwsHttpServletRequest.decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); + } + + @Override + public String getPathTranslated() { + return originalRequest.getPathTranslated(); + } + + @Override + public String getContextPath() { + return originalRequest.getContextPath(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_QUERY_STRING", justification = "Already Validated on AwsProxyHttpServletRequest") + public String getQueryString() { + return originalRequest.getQueryString(); + } + + @Override + public String getRemoteUser() { + return originalRequest.getRemoteUser(); + } + + @Override + public boolean isUserInRole(String s) { + return originalRequest.isUserInRole(s); + } + + @Override + public Principal getUserPrincipal() { + return originalRequest.getUserPrincipal(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_SESSION_ID", justification = "Already Validated on AwsProxyHttpServletRequest") + public String getRequestedSessionId() { + return originalRequest.getRequestedSessionId(); + } + + @Override + public String getRequestURI() { + return cleanUri(getContextPath()) + cleanUri(newPath); + } + + @Override + public StringBuffer getRequestURL() { + String url = ""; + url += getServerName(); + url += cleanUri(getContextPath()); + url += cleanUri(newPath); + + return new StringBuffer(getScheme() + "://" + url); + } + + @Override + public String getServletPath() { + return originalRequest.getServletPath(); + } + + @Override + public HttpSession getSession(boolean b) { + return originalRequest.getSession(b); + } + + @Override + public HttpSession getSession() { + return originalRequest.getSession(); + } + + @Override + public String changeSessionId() { + return originalRequest.changeSessionId(); + } + + @Override + public boolean isRequestedSessionIdValid() { + return originalRequest.isRequestedSessionIdValid(); + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return originalRequest.isRequestedSessionIdFromCookie(); + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return originalRequest.isRequestedSessionIdFromURL(); + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return originalRequest.isRequestedSessionIdFromUrl(); + } + + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { + return originalRequest.authenticate(httpServletResponse); + } + + @Override + public void login(String s, String s1) throws ServletException { + originalRequest.login(s, s1); + } + + @Override + public void logout() throws ServletException { + originalRequest.logout(); + } + + @Override + public Collection getParts() throws IOException, ServletException { + return originalRequest.getParts(); + } + + @Override + public Part getPart(String s) throws IOException, ServletException { + return originalRequest.getPart(s); + } + + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + return originalRequest.upgrade(aClass); + } + + @Override + public Object getAttribute(String s) { + return originalRequest.getAttribute(s); + } + + @Override + public Enumeration getAttributeNames() { + return originalRequest.getAttributeNames(); + } + + @Override + public String getCharacterEncoding() { + return originalRequest.getCharacterEncoding(); + } + + @Override + public void setCharacterEncoding(String s) throws UnsupportedEncodingException { + originalRequest.setCharacterEncoding(s); + } + + @Override + public int getContentLength() { + return originalRequest.getContentLength(); + } + + @Override + public long getContentLengthLong() { + return originalRequest.getContentLengthLong(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_CONTENT_TYPE", justification = "Already Validated on AwsProxyHttpServletRequest") + public String getContentType() { + return originalRequest.getContentType(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return originalRequest.getInputStream(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_PARAMETER", justification = "Already Validated on AwsProxyHttpServletRequest") + public String getParameter(String s) { + return originalRequest.getParameter(s); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_PARAMETER", justification = "Already Validated on AwsProxyHttpServletRequest") + public Enumeration getParameterNames() { + return originalRequest.getParameterNames(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_PARAMETER", justification = "Already Validated on AwsProxyHttpServletRequest") + public String[] getParameterValues(String s) { + return originalRequest.getParameterValues(s); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_PARAMETER", justification = "Already Validated on AwsProxyHttpServletRequest") + public Map getParameterMap() { + return originalRequest.getParameterMap(); + } + + @Override + public String getProtocol() { + return originalRequest.getProtocol(); + } + + @Override + public String getScheme() { + return originalRequest.getScheme(); + } + + @Override + @SuppressFBWarnings(value = "SERVLET_SERVER_NAME", justification = "Already Validated on AwsProxyHttpServletRequest") + public String getServerName() { + return originalRequest.getServerName(); + } + + @Override + public int getServerPort() { + return originalRequest.getServerPort(); + } + + @Override + public BufferedReader getReader() throws IOException { + return originalRequest.getReader(); + } + + @Override + public String getRemoteAddr() { + return originalRequest.getRemoteAddr(); + } + + @Override + public String getRemoteHost() { + return originalRequest.getRemoteAddr(); + } + + @Override + public void setAttribute(String s, Object o) { + originalRequest.setAttribute(s, o); + } + + @Override + public void removeAttribute(String s) { + originalRequest.removeAttribute(s); + } + + @Override + public Locale getLocale() { + return originalRequest.getLocale(); + } + + @Override + public Enumeration getLocales() { + return originalRequest.getLocales(); + } + + @Override + public boolean isSecure() { + return originalRequest.isSecure(); + } + + @Override + public RequestDispatcher getRequestDispatcher(String s) { + return originalRequest.getRequestDispatcher(s); + } + + @Override + public String getRealPath(String s) { + return originalRequest.getRealPath(s); + } + + @Override + public int getRemotePort() { + return originalRequest.getRemotePort(); + } + + @Override + public String getLocalName() { + return originalRequest.getLocalName(); + } + + @Override + public String getLocalAddr() { + return originalRequest.getLocalAddr(); + } + + @Override + public int getLocalPort() { + return originalRequest.getLocalPort(); + } + + @Override + public ServletContext getServletContext() { + return ctx; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return originalRequest.startAsync(); + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return originalRequest.startAsync(servletRequest, servletResponse); + } + + @Override + public boolean isAsyncStarted() { + return originalRequest.isAsyncStarted(); + } + + @Override + public boolean isAsyncSupported() { + return originalRequest.isAsyncSupported(); + } + + @Override + public AsyncContext getAsyncContext() { + return originalRequest.getAsyncContext(); + } + + @Override + public DispatcherType getDispatcherType() { + return originalRequest.getDispatcherType(); + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index d477587f..da695c50 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -25,6 +25,7 @@ import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.HttpHeaders; import java.io.ByteArrayOutputStream; @@ -66,7 +67,7 @@ public class AwsHttpServletResponse private PrintWriter writer; private ByteArrayOutputStream bodyOutputStream = new ByteArrayOutputStream(); private CountDownLatch writersCountDownLatch; - private AwsHttpServletRequest request; + private HttpServletRequest request; private boolean isCommitted = false; private Logger log = LoggerFactory.getLogger(AwsHttpServletResponse.class); @@ -81,7 +82,7 @@ public class AwsHttpServletResponse * function while the response is asynchronously written by the underlying container/application * @param latch A latch used to inform the ContainerHandler that we are done receiving the response data */ - public AwsHttpServletResponse(AwsHttpServletRequest req, CountDownLatch latch) { + public AwsHttpServletResponse(HttpServletRequest req, CountDownLatch latch) { writersCountDownLatch = latch; characterEncoding = null; request = req; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 1372b8f3..1ac0908f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -58,7 +58,7 @@ public String getId() { @Override public long getLastAccessedTime() { - return 0; + return lastAccessedTime; } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 77310a42..95af74e6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -22,17 +22,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.DispatcherType; -import javax.servlet.FilterChain; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; +import java.util.Map; /** @@ -56,7 +52,6 @@ public abstract class AwsLambdaServletContainerHandler filterChainManager; - private boolean startupExecuted; //------------------------------------------------------------- // Variables - Protected @@ -79,7 +74,6 @@ protected AwsLambdaServletContainerHandler(Class requestTypeClass, // set the default log formatter for servlet implementations setLogFormatter(new ApacheCombinedServletLogFormatter<>()); setServletContext(new AwsServletContext(this)); - startupExecuted = false; } //------------------------------------------------------------- @@ -161,8 +155,6 @@ protected void doFilter(HttpServletRequest request, HttpServletResponse response } } - public abstract Servlet getServlet(); - //------------------------------------------------------------- // Inner Class - //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index a4d0ab81..cf9729b5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -38,10 +38,7 @@ import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpUpgradeHandler; -import javax.servlet.http.Part; +import javax.servlet.http.*; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.SecurityContext; @@ -84,10 +81,13 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private AwsProxyRequest request; private SecurityContext securityContext; + private AsyncContext asyncContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; + private AwsHttpServletResponse response; + private AwsLambdaServletContainerHandler containerHandler; //------------------------------------------------------------- // Constructors @@ -111,6 +111,22 @@ public AwsProxyRequest getAwsProxyRequest() { return this.request; } + public AwsHttpServletResponse getResponse() { + return response; + } + + public void setResponse(AwsHttpServletResponse response) { + this.response = response; + } + + public AwsLambdaServletContainerHandler getContainerHandler() { + return containerHandler; + } + + public void setContainerHandler(AwsLambdaServletContainerHandler containerHandler) { + this.containerHandler = containerHandler; + } + //------------------------------------------------------------- // Implementation - HttpServletRequest //------------------------------------------------------------- @@ -660,19 +676,37 @@ public int getRemotePort() { } + @Override + public boolean isAsyncSupported() { + return true; + } + + @Override public AsyncContext startAsync() throws IllegalStateException { - return null; + asyncContext = new AwsAsyncContext(this, response, containerHandler); + log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); + return asyncContext; } @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { - return null; + asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); + return asyncContext; } + @Override + public AsyncContext getAsyncContext() { + if (asyncContext == null) { + throw new IllegalStateException("Request " + SecurityUtils.crlf(request.getRequestContext().getRequestId()) + + " is not in asynchronous mode. Call startAsync before atttempting to get the async context."); + } + return asyncContext; + } //------------------------------------------------------------- // Methods - Private @@ -728,7 +762,7 @@ private Map getMultipartFormParametersMap() { } - private String cleanUri(String uri) { + static String cleanUri(String uri) { String finalUri = (uri == null ? "/" : uri); if (finalUri.equals("/")) { return finalUri; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index bb61b7b2..da1c6d38 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -7,11 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.DispatcherType; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -76,13 +72,13 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon } if (isNamedDispatcher) { - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); return; } servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.FORWARD); setRequestPath(servletRequest, dispatchTo); - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); } @@ -107,7 +103,7 @@ public void include(ServletRequest servletRequest, ServletResponse servletRespon SecurityUtils.encode(SecurityUtils.crlf(((HttpServletRequest) servletRequest).getQueryString()))); setRequestPath(servletRequest, dispatchTo); } - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, lambdaContainerHandler.getServlet()); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); } /** @@ -130,4 +126,8 @@ void setRequestPath(ServletRequest req, final String destinationPath) { } ((AwsProxyRequest)req.getAttribute(API_GATEWAY_EVENT_PROPERTY)).setPath(dispatchTo); } + + private Servlet getServlet(HttpServletRequest req) { + return ((AwsServletContext)lambdaContainerHandler.getServletContext()).getServletForPath(req.getPathInfo()); + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index b3f2f1fd..97e866e7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -21,32 +21,16 @@ import org.slf4j.LoggerFactory; import javax.activation.MimetypesFileTypeMap; -import javax.servlet.Filter; -import javax.servlet.FilterRegistration; -import javax.servlet.RequestDispatcher; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; -import javax.servlet.SessionCookieConfig; -import javax.servlet.SessionTrackingMode; +import javax.servlet.*; import javax.servlet.descriptor.JspConfigDescriptor; import java.io.File; -import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Collections; -import java.util.Enumeration; -import java.util.EventListener; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; /** @@ -69,6 +53,7 @@ public class AwsServletContext // Variables - Private //------------------------------------------------------------- private Map filters; + private Map servletRegistrations; private Map attributes; private Map initParameters; private AwsLambdaServletContainerHandler containerHandler; @@ -91,6 +76,7 @@ public AwsServletContext(AwsLambdaServletContainerHandler containerHandler) { this.attributes = new HashMap<>(); this.initParameters = new HashMap<>(); this.filters = new LinkedHashMap<>(); + this.servletRegistrations = new HashMap<>(); } @@ -192,21 +178,59 @@ public RequestDispatcher getNamedDispatcher(String s) { @Override @Deprecated public Servlet getServlet(String s) throws ServletException { - throw new UnsupportedOperationException(); + return servletRegistrations.get(s).getServlet(); + } + + public Servlet getServletForPath(String path) { + String[] pathParts = path.split("/"); + for (AwsServletRegistration reg : servletRegistrations.values()) { + for (String p : reg.getMappings()) { + try { + if ("".equals(p) || "/".equals(p) || "/*".equals(p)) { + return reg.getServlet(); + } + // if I have no path and I haven't matched something now I'll just move on to the next + if ("".equals(path) || "/".equals(path)) { + continue; + } + String[] regParts = p.split("/"); + for (int i = 0; i < regParts.length; i++) { + if (!regParts[i].equals(pathParts[i]) && !"*".equals(regParts[i])) { + break; + } + if (i == regParts.length - 1 && (regParts[i].equals(pathParts[i]) || "*".equals(regParts[i]))) { + return reg.getServlet(); + } + } + } catch (ServletException e) { + return null; + } + } + } + return null; } @Override @Deprecated public Enumeration getServlets() { - throw new UnsupportedOperationException(); + return Collections.enumeration(servletRegistrations.entrySet().stream() + .map((e) -> { + try { + return e.getValue().getServlet(); + } catch (ServletException ex) { + ex.printStackTrace(); + return null; + } + } ) + .collect(Collectors.toList())); } @Override @Deprecated public Enumeration getServletNames() { - throw new UnsupportedOperationException(); + return Collections.enumeration(servletRegistrations.keySet()); } @@ -302,47 +326,61 @@ public String getServletContextName() { @Override public ServletRegistration.Dynamic addServlet(String s, String s1) { - log("Called addServlet: " + s1); - log("Implemented frameworks are responsible for registering servlets"); - throw new UnsupportedOperationException(); + try { + Class servletClass = (Class) this.getClassLoader().loadClass(s1); + Servlet servlet = createServlet(servletClass); + servletRegistrations.put(s, new AwsServletRegistration(s, servlet, this)); + return servletRegistrations.get(s); + } catch (ServletException | ClassNotFoundException e) { + throw new RuntimeException(e); + } } @Override public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) { - log("Called addServlet: " + servlet.getClass().getName()); - log("Implemented frameworks are responsible for registering servlets"); - throw new UnsupportedOperationException(); + servletRegistrations.put(s, new AwsServletRegistration(s, servlet, this)); + return servletRegistrations.get(s); } @Override public ServletRegistration.Dynamic addServlet(String s, Class aClass) { - log("Called addServlet: " + aClass.getName()); - log("Implemented frameworks are responsible for registering servlets"); - throw new UnsupportedOperationException(); + try { + Servlet servlet = createServlet(aClass); + servletRegistrations.put(s, new AwsServletRegistration(s, servlet, this)); + return servletRegistrations.get(s); + } catch (ServletException e) { + throw new RuntimeException(e); + } } @Override public T createServlet(Class aClass) throws ServletException { - log("Called createServlet: " + aClass.getName()); - log("Implemented frameworks are responsible for creating servlets"); - throw new UnsupportedOperationException(); + /*log("Called createServlet: " + aClass.getName()); + log("Implemented frameworks are responsible for creating servlets");*/ + // TODO: This method introspects the given clazz for the following annotations: ServletSecurity, MultipartConfig, + // javax.annotation.security.RunAs, and javax.annotation.security.DeclareRoles. In addition, this method supports + // resource injection if the given clazz represents a Managed Bean. See the Java EE platform and JSR 299 specifications + // for additional details about Managed Beans and resource injection. + try { + return aClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new ServletException(e); + } } @Override public ServletRegistration getServletRegistration(String s) { - // TODO: This could come from the reader interface - return null; + return servletRegistrations.get(s); } @Override public Map getServletRegistrations() { - // TODO: This could come from the reader interface - return null; + return servletRegistrations; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java new file mode 100644 index 00000000..e3ce620b --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java @@ -0,0 +1,157 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import javax.servlet.*; +import java.util.*; + +/** + * Stores information about a servlet registered with Serverless Java Container's ServletContext. + */ +public class AwsServletRegistration implements ServletRegistration, ServletRegistration.Dynamic { + private String servletName; + private Servlet servlet; + private AwsServletContext ctx; + private Map initParameters; + private int loadOnStartup; + private String runAsRole; + private boolean asyncSupported; + private Map servletPathMappings; + + + public AwsServletRegistration(String name, Servlet s, AwsServletContext context) { + servletName = name; + servlet = s; + ctx = context; + initParameters = new HashMap<>(); + servletPathMappings = new HashMap<>(); + loadOnStartup = -1; + asyncSupported = true; + } + + @Override + public Set addMapping(String... strings) { + Set failedMappings = new HashSet<>(); + for (String s : strings) { + if (servletPathMappings.containsKey(s)) { + failedMappings.add(s); + continue; + } + servletPathMappings.put(s, this); + } + return failedMappings; + } + + @Override + public Collection getMappings() { + return servletPathMappings.keySet(); + } + + @Override + public String getRunAsRole() { + return runAsRole; + } + + @Override + public String getName() { + return servletName; + } + + @Override + public String getClassName() { + return servlet.getClass().getName(); + } + + @Override + public boolean setInitParameter(String s, String s1) { + if (initParameters.containsKey(s)) { + return false; + } + initParameters.put(s, s1); + return true; + } + + @Override + public String getInitParameter(String s) { + return initParameters.get(s); + } + + @Override + public Set setInitParameters(Map map) { + Set failedParameters = new HashSet<>(); + for (Map.Entry param : map.entrySet()) { + if (initParameters.containsKey(param.getKey())) { + failedParameters.add(param.getKey()); + } + initParameters.put(param.getKey(), param.getValue()); + } + return failedParameters; + } + + @Override + public Map getInitParameters() { + return initParameters; + } + + public Servlet getServlet() throws ServletException { + if (servlet.getServletConfig() == null) { + servlet.init(getServletConfig()); + } + return servlet; + } + + @Override + public void setLoadOnStartup(int i) { + loadOnStartup = i; + } + + public int getLoadOnStartup() { + return loadOnStartup; + } + + @Override + public Set setServletSecurity(ServletSecurityElement servletSecurityElement) { + return null; + } + + @Override + public void setMultipartConfig(MultipartConfigElement multipartConfigElement) { + + } + + @Override + public void setRunAsRole(String s) { + runAsRole = s; + } + + @Override + public void setAsyncSupported(boolean b) { + asyncSupported = b; + } + + public boolean isAsyncSupported() { + return asyncSupported; + } + + public ServletConfig getServletConfig() { + return new ServletConfig() { + @Override + public String getServletName() { + return servletName; + } + + @Override + public ServletContext getServletContext() { + return ctx; + } + + @Override + public String getInitParameter(String s) { + return initParameters.get(s); + } + + @Override + public Enumeration getInitParameterNames() { + return Collections.enumeration(initParameters.keySet()); + } + }; + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java new file mode 100644 index 00000000..d5c86f1c --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -0,0 +1,140 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.Test; + +import javax.servlet.AsyncContext; +import javax.servlet.Servlet; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.concurrent.CountDownLatch; + +import static junit.framework.TestCase.assertNotNull; +import static org.junit.Assert.assertEquals; + +public class AwsAsyncContextTest { + private MockLambdaContext lambdaCtx = new MockLambdaContext(); + private MockContainerHandler handler = new MockContainerHandler(); + private AwsServletContextTest.TestServlet srv1 = new AwsServletContextTest.TestServlet("srv1"); + private AwsServletContextTest.TestServlet srv2 = new AwsServletContextTest.TestServlet("srv2"); + private AwsServletContext ctx = getCtx(); + + @Test + public void dispatch_sendsToCorrectServlet() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); + req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); + req.setServletContext(ctx); + req.setContainerHandler(handler); + + AsyncContext asyncCtx = req.startAsync(); + handler.setDesiredStatus(201); + asyncCtx.dispatch(); + assertNotNull(handler.getSelectedServlet()); + assertEquals(srv1, handler.getSelectedServlet()); + assertEquals(201, handler.getResponse().getStatus()); + + req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv5/hello", "GET").build(), lambdaCtx, null); + req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); + req.setServletContext(ctx); + req.setContainerHandler(handler); + asyncCtx = req.startAsync(); + handler.setDesiredStatus(202); + asyncCtx.dispatch(); + assertNotNull(handler.getSelectedServlet()); + assertEquals(srv2, handler.getSelectedServlet()); + assertEquals(202, handler.getResponse().getStatus()); + } + + @Test + public void dispatchNewPath_sendsToCorrectServlet() { + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); + req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); + req.setServletContext(ctx); + req.setContainerHandler(handler); + + AsyncContext asyncCtx = req.startAsync(); + handler.setDesiredStatus(301); + asyncCtx.dispatch("/srv4/hello"); + assertNotNull(handler.getSelectedServlet()); + assertEquals(srv2, handler.getSelectedServlet()); + assertNotNull(handler.getResponse()); + assertEquals(301, handler.getResponse().getStatus()); + } + + private AwsServletContext getCtx() { + AwsServletContext ctx = new AwsServletContext(handler); + handler.setServletContext(ctx); + + ServletRegistration.Dynamic reg1 = ctx.addServlet("srv1", srv1); + reg1.addMapping("/srv1"); + + ServletRegistration.Dynamic reg2 = ctx.addServlet("srv2", srv2); + reg2.addMapping("/"); + return ctx; + } + + public static class MockContainerHandler extends AwsLambdaServletContainerHandler { + private int desiredStatus; + private HttpServletResponse response; + private Servlet selectedServlet; + + public MockContainerHandler() { + super(AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler()); + desiredStatus = 200; + } + + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void doFilter(HttpServletRequest request, HttpServletResponse response, Servlet servlet) throws IOException, ServletException { + selectedServlet = servlet; + try { + this.response = response; + //handleRequest((AwsProxyHttpServletRequest)request, , new MockLambdaContext()); + if (AwsProxyHttpServletRequest.class.isAssignableFrom(request.getClass())) { + ((AwsProxyHttpServletRequest)request).setResponse((AwsHttpServletResponse)this.response); + } + this.response.setStatus(desiredStatus); + this.response.flushBuffer(); + } catch (Exception e) { + e.printStackTrace(); + throw new ServletException(e); + } + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + + } + + @Override + public void initialize() throws ContainerInitializationException { + + } + + public void setDesiredStatus(int status) { + desiredStatus = status; + } + + public AwsHttpServletResponse getResponse() { + return (AwsHttpServletResponse)response; + } + + public Servlet getSelectedServlet() { + return selectedServlet; + } + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index c5ed8f24..dd344d3b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -230,19 +230,18 @@ private static class MockFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { - System.out.println("Init"); + } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - System.out.println("DoFilter"); servletRequest.setAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME, REQUEST_CUSTOM_ATTRIBUTE_VALUE); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { - System.out.println("Destroy"); + } } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 3cebc02f..5372dfa9 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -71,11 +71,6 @@ public void headers_parseHeaderValue_complexAccept() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null, config); List values = request.parseHeaderValue(request.getHeader(HttpHeaders.ACCEPT), ",", ";"); - try { - System.out.println(new ObjectMapper().writeValueAsString(values)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } assertEquals(4, values.size()); } @@ -124,7 +119,6 @@ public void headers_parseHeaderValue_headerWithPaddingButNotBase64Encoded() { List result = context.parseHeaderValue("hello="); assertTrue(result.size() > 0); assertEquals("hello", result.get(0).getKey()); - System.out.println("\"" + result.get(0).getValue() + "\""); assertNull(result.get(0).getValue()); } @@ -139,7 +133,6 @@ public void queryString_generateQueryString_validQuery() { e.printStackTrace(); fail("Could not generate query string"); } - System.out.println(parsedString); assertTrue(parsedString.contains("one=two")); assertTrue(parsedString.contains("three=four")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 1feeb5e9..65fc9177 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -44,7 +44,6 @@ public void cookie_addCookie_verifyPath() { resp.addCookie(pathCookie); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertTrue(cookieHeader.contains("Path=" + COOKIE_PATH)); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -58,7 +57,6 @@ public void cookie_addCookie_verifySecure() { resp.addCookie(secureCookie); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertTrue(cookieHeader.contains("; Secure")); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -72,7 +70,6 @@ public void cookie_addCookie_verifyDomain() { resp.addCookie(domainCookie); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertTrue(cookieHeader.contains("; Domain=" + COOKIE_DOMAIN)); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -86,7 +83,6 @@ public void cookie_addCookie_defaultMaxAgeIsNegative() { resp.addCookie(maxAgeCookie); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertFalse(cookieHeader.contains("Max-Age=")); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -100,7 +96,6 @@ public void cookie_addCookie_positiveMaxAgeIsPresent() { resp.addCookie(maxAgeCookie); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertTrue(cookieHeader.contains("; Max-Age=")); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -121,7 +116,6 @@ public void cookie_addCookie_positiveMaxAgeExpiresDate() { testExpiration.setTimeZone(TimeZone.getTimeZone(AwsHttpServletResponse.COOKIE_DEFAULT_TIME_ZONE)); String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); - System.out.println("Cookie string: " + cookieHeader); assertNotNull(cookieHeader); assertTrue(cookieHeader.contains("; Max-Age=")); assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); @@ -129,8 +123,6 @@ public void cookie_addCookie_positiveMaxAgeExpiresDate() { SimpleDateFormat dateFormat = new SimpleDateFormat(AwsHttpServletResponse.HEADER_DATE_PATTERN); Calendar expiration = getExpires(cookieHeader); - System.out.println("Cookie date: " + dateFormat.format(expiration.getTime())); - System.out.println("Test date: " + dateFormat.format(testExpiration.getTime())); long dateDiff = testExpiration.getTimeInMillis() - expiration.getTimeInMillis(); assertTrue(Math.abs(dateDiff) < COOKIE_GRACE_COMPARE_MILLIS); @@ -314,7 +306,6 @@ private int getMaxAge(String header) { assertTrue(ageMatcher.find()); assertTrue(ageMatcher.groupCount() >= 1); String ageString = ageMatcher.group(1); - System.out.println("Age string: " + ageString); return Integer.parseInt(ageString); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java new file mode 100644 index 00000000..bb9e0d47 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java @@ -0,0 +1,109 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import org.junit.Test; + +import java.time.Instant; +import java.util.Enumeration; + +import static junit.framework.TestCase.assertTrue; +import static junit.framework.TestCase.fail; +import static org.junit.Assert.*; + +public class AwsHttpSessionTest { + + @Test + public void new_withNullId_throwsException() { + try { + AwsHttpSession session = new AwsHttpSession(null); + } catch (RuntimeException e) { + assertTrue(e.getMessage().contains("cannot be null")); + return; + } + fail("Did not throw exception with null ID"); + } + + @Test + public void new_withValidId_setsIdCorrectly() { + AwsHttpSession session = new AwsHttpSession("id"); + assertEquals("id", session.getId()); + } + + @Test + public void new_creationTimePopulatedCorrectly() { + AwsHttpSession session = new AwsHttpSession("id"); + assertTrue(session.getCreationTime() > Instant.now().getEpochSecond() - 1); + assertEquals(AwsHttpSession.SESSION_DURATION_SEC, session.getMaxInactiveInterval()); + assertEquals(session.getLastAccessedTime(), session.getCreationTime()); + } + + @Test + public void values_throwsUnsupportedOperationException() { + int exCount = 0; + AwsHttpSession sess = new AwsHttpSession("id"); + + try { + sess.putValue("test", "test"); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + sess.removeValue("test"); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + sess.getValue("test"); + } catch (UnsupportedOperationException e) { + exCount++; + } + try { + sess.getValueNames(); + } catch (UnsupportedOperationException e) { + exCount++; + } + assertEquals(4, exCount); + } + + @Test + public void attributes_dataStoredCorrectly() throws InterruptedException { + AwsHttpSession sess = new AwsHttpSession("id"); + sess.setAttribute("test", "test"); + sess.setAttribute("test2", "test2"); + Enumeration attrs = sess.getAttributeNames(); + int attrsCnt = 0; + while (attrs.hasMoreElements()) { + attrs.nextElement(); + attrsCnt++; + } + assertEquals(2, attrsCnt); + assertEquals(sess.getAttribute("test"), "test"); + sess.removeAttribute("test2"); + attrs = sess.getAttributeNames(); + attrsCnt = 0; + while (attrs.hasMoreElements()) { + attrs.nextElement(); + attrsCnt++; + } + assertEquals(1, attrsCnt); + + + // changing attribute should touch the session + Thread.sleep(1000); + sess.setAttribute("test3", "test3"); + assertTrue(sess.getLastAccessedTime() > sess.getCreationTime()); + } + + @Test + public void validSession_expectCorrectValidationOrInvalidation() throws InterruptedException { + AwsHttpSession sess = new AwsHttpSession("id"); + assertTrue(sess.isValid()); + assertTrue(sess.isNew()); + + Thread.sleep(1000); + sess.setAttribute("test", "test"); + assertFalse(sess.isNew()); + sess.invalidate(); + assertFalse(sess.isValid()); + assertNull(sess.getAttribute("test")); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 05a731a8..62c78545 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -4,11 +4,15 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.services.lambda.runtime.Context; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.SecurityContext; import java.io.IOException; import java.io.InputStream; @@ -16,16 +20,14 @@ import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import static org.junit.Assert.*; +@RunWith(Parameterized.class) public class AwsProxyHttpServletRequestTest { + private boolean isWrapped; + private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "Custom-Header-Value"; private static final String FORM_PARAM_NAME = "name"; @@ -74,9 +76,27 @@ public class AwsProxyHttpServletRequestTest { .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE).build(); + public AwsProxyHttpServletRequestTest(boolean wrap) { + isWrapped = wrap; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { false, true }); + } + + private HttpServletRequest getRequest(AwsProxyRequest req, Context lambdaCtx, SecurityContext securityCtx) { + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, lambdaCtx, securityCtx); + if (isWrapped) { + servletRequest = new AwsHttpServletRequestWrapper(servletRequest, req.getPath()); + } + return servletRequest; + } + + @Test public void headers_getHeader_validRequest() { - HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(CUSTOM_HEADER_VALUE, request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); @@ -84,7 +104,7 @@ public void headers_getHeader_validRequest() { @Test public void headers_getRefererAndUserAgent_returnsContextValues() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_USER_AGENT_REFERER, null, null); + HttpServletRequest request = getRequest(REQUEST_USER_AGENT_REFERER, null, null); assertNotNull(request.getHeader("Referer")); assertEquals(REFERER, request.getHeader("Referer")); assertEquals(REFERER, request.getHeader("referer")); @@ -96,7 +116,7 @@ public void headers_getRefererAndUserAgent_returnsContextValues() { @Test public void formParams_getParameter_validForm() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED, null, null); + HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED, null, null); assertNotNull(request); assertNotNull(request.getParameter(FORM_PARAM_NAME)); assertEquals(FORM_PARAM_NAME_VALUE, request.getParameter(FORM_PARAM_NAME)); @@ -104,21 +124,21 @@ public void formParams_getParameter_validForm() { @Test public void formParams_getParameter_null() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_INVALID_FORM_URLENCODED, null, null); + HttpServletRequest request = getRequest(REQUEST_INVALID_FORM_URLENCODED, null, null); assertNotNull(request); assertNull(request.getParameter(FORM_PARAM_NAME)); } @Test public void formParams_getParameter_multipleParams() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(2, request.getParameterValues(FORM_PARAM_NAME).length); } @Test public void formParams_getParameter_queryStringPrecendence() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(2, request.getParameterValues(FORM_PARAM_NAME).length); assertEquals(QUERY_STRING_NAME_VALUE, request.getParameter(FORM_PARAM_NAME)); @@ -126,14 +146,14 @@ public void formParams_getParameter_queryStringPrecendence() { @Test public void dateHeader_noDate_returnNegativeOne() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(-1L, request.getDateHeader(HttpHeaders.DATE)); } @Test public void dateHeader_correctDate_parseToCorrectLong() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_DATE, null, null); + HttpServletRequest request = getRequest(REQUEST_WITH_DATE, null, null); assertNotNull(request); String instantString = AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE); @@ -143,7 +163,7 @@ public void dateHeader_correctDate_parseToCorrectLong() { @Test public void scheme_getScheme_https() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED, null, null); + HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED, null, null); assertNotNull(request); assertNotNull(request.getScheme()); assertEquals("https", request.getScheme()); @@ -151,7 +171,7 @@ public void scheme_getScheme_https() { @Test public void scheme_getScheme_http() { - HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getScheme()); assertEquals(REQUEST_SCHEME_HTTP, request.getScheme()); @@ -159,7 +179,7 @@ public void scheme_getScheme_http() { @Test public void cookie_getCookies_noCookies() { - HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(0, request.getCookies().length); @@ -167,7 +187,7 @@ public void cookie_getCookies_noCookies() { @Test public void cookie_getCookies_singleCookie() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_SINGLE_COOKIE, null, null); + HttpServletRequest request = getRequest(REQUEST_SINGLE_COOKIE, null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(1, request.getCookies().length); @@ -177,7 +197,7 @@ public void cookie_getCookies_singleCookie() { @Test public void cookie_getCookies_multipleCookies() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_MULTIPLE_COOKIES, null, null); + HttpServletRequest request = getRequest(REQUEST_MULTIPLE_COOKIES, null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(2, request.getCookies().length); @@ -189,7 +209,7 @@ public void cookie_getCookies_multipleCookies() { @Test public void cookie_getCookies_emptyCookies() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_MALFORMED_COOKIE, null, null); + HttpServletRequest request = getRequest(REQUEST_MALFORMED_COOKIE, null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(0, request.getCookies().length); @@ -197,14 +217,14 @@ public void cookie_getCookies_emptyCookies() { @Test public void queryParameters_getParameterMap_null() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_NULL_QUERY_STRING, null, null); + HttpServletRequest request = getRequest(REQUEST_NULL_QUERY_STRING, null, null); assertNotNull(request); assertEquals(0, request.getParameterMap().size()); } @Test public void queryParameters_getParameterMap_nonNull() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_QUERY, null, null); assertNotNull(request); assertEquals(1, request.getParameterMap().size()); assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(FORM_PARAM_NAME)[0]); @@ -212,7 +232,7 @@ public void queryParameters_getParameterMap_nonNull() { @Test public void queryParameters_getParameterNames_null() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_NULL_QUERY_STRING, null, null); + HttpServletRequest request = getRequest(REQUEST_NULL_QUERY_STRING, null, null); List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); assertEquals(0, parameterNames.size()); @@ -220,7 +240,7 @@ public void queryParameters_getParameterNames_null() { @Test public void queryParameters_getParameterNames_notNull() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_QUERY, null, null); List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); assertEquals(1, parameterNames.size()); @@ -229,7 +249,7 @@ public void queryParameters_getParameterNames_notNull() { @Test public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_MULTIPLE_FORM_AND_QUERY, null, null); + HttpServletRequest request = getRequest(REQUEST_MULTIPLE_FORM_AND_QUERY, null, null); Map params = request.getParameterMap(); assertNotNull(params); @@ -250,7 +270,7 @@ public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { @Test public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_SINGLE_COOKIE, null, null); + HttpServletRequest request = getRequest(REQUEST_SINGLE_COOKIE, null, null); try { request.setCharacterEncoding(StandardCharsets.UTF_8.name()); // we have not specified a content type so the encoding will not be set @@ -264,7 +284,7 @@ public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { @Test public void charEncoding_getEncoding_expectContentTypeOnly() { - HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); // we have not specified a content type so the encoding will not be set assertEquals(null, request.getCharacterEncoding()); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); @@ -282,7 +302,7 @@ public void charEncoding_getEncoding_expectContentTypeOnly() { @Test public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() { - HttpServletRequest request = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); // we have not specified a content type so the encoding will not be set assertEquals(null, request.getCharacterEncoding()); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); @@ -308,7 +328,7 @@ public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() @Test public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { - HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_WITH_LOWERCASE_HEADER, null, null); + HttpServletRequest request = getRequest(REQUEST_WITH_LOWERCASE_HEADER, null, null); try { request.setCharacterEncoding(StandardCharsets.UTF_8.name()); String newHeaderValue = MediaType.APPLICATION_JSON + "; charset=" + StandardCharsets.UTF_8.name(); @@ -325,7 +345,7 @@ public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { @Test public void contentType_duplicateCase_expectSingleContentTypeHeader() { AwsProxyRequest proxyRequest = getRequestWithHeaders(); - HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + HttpServletRequest request = getRequest(proxyRequest, null, null); try { request.setCharacterEncoding(StandardCharsets.ISO_8859_1.name()); @@ -342,7 +362,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { AwsProxyRequest req = getRequestWithHeaders(); req.getRequestContext().setApiId("test-id"); LambdaContainerHandler.getContainerConfig().enableLocalhost(); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); assertTrue(requestUrl.contains("http://")); assertTrue(requestUrl.contains("test-id.execute-api.")); @@ -350,7 +370,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { // set localhost req.getMultiValueHeaders().putSingle("Host", "localhost"); - servletRequest = new AwsProxyHttpServletRequest(req, null, null); + servletRequest = getRequest(req, null, null); requestUrl = servletRequest.getRequestURL().toString(); assertTrue(requestUrl.contains("http://localhost")); assertTrue(requestUrl.endsWith("localhost/hello")); @@ -361,7 +381,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { AwsProxyRequest req = getRequestWithHeaders(); LambdaContainerHandler.getContainerConfig().setServiceBasePath("test"); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); assertTrue(requestUrl.contains("/test/hello")); LambdaContainerHandler.getContainerConfig().setServiceBasePath(null); @@ -372,9 +392,8 @@ public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { AwsProxyRequest req = getRequestWithHeaders(); req.getRequestContext().setStage("test-stage"); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); - System.out.println("Url: " + requestUrl); assertTrue(requestUrl.contains("/test-stage/")); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } @@ -382,7 +401,7 @@ public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { @Test public void getLocales_emptyAcceptHeader_expectDefaultLocale() { AwsProxyRequest req = getRequestWithHeaders(); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); int localesNo = 0; while (locales.hasMoreElements()) { @@ -397,7 +416,7 @@ public void getLocales_emptyAcceptHeader_expectDefaultLocale() { public void getLocales_validAcceptHeader_expectSingleLocale() { AwsProxyRequest req = getRequestWithHeaders(); req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); int localesNo = 0; while (locales.hasMoreElements()) { @@ -412,7 +431,7 @@ public void getLocales_validAcceptHeader_expectSingleLocale() { public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { AwsProxyRequest req = getRequestWithHeaders(); req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); while (locales.hasMoreElements()) { @@ -433,7 +452,7 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered() { AwsProxyRequest req = getRequestWithHeaders(); req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); while (locales.hasMoreElements()) { @@ -450,7 +469,7 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrde @Test public void nullQueryString_expectNoExceptions() { AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletReq = new AwsProxyHttpServletRequest(req, null, null); + HttpServletRequest servletReq = getRequest(req, null, null); assertNull(servletReq.getQueryString()); assertEquals(0, servletReq.getParameterMap().size()); assertFalse(servletReq.getParameterNames().hasMoreElements()); @@ -462,7 +481,7 @@ public void nullQueryString_expectNoExceptions() { public void inputStream_emptyBody_expectNullInputStream() { AwsProxyRequest proxyReq = getRequestWithHeaders(); assertNull(proxyReq.getBody()); - HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + HttpServletRequest req = getRequest(proxyReq, null, null); try { InputStream is = req.getInputStream(); @@ -476,13 +495,13 @@ public void inputStream_emptyBody_expectNullInputStream() { @Test public void getHeaders_emptyHeaders_expectEmptyEnumeration() { AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + HttpServletRequest req = getRequest(proxyReq, null, null); assertFalse(req.getHeaders("param").hasMoreElements()); } @Test public void getServerPort_defaultPort_expect443() { - HttpServletRequest req = new AwsProxyHttpServletRequest(getRequestWithHeaders(), null, null); + HttpServletRequest req = getRequest(getRequestWithHeaders(), null, null); assertEquals(443, req.getServerPort()); } @@ -490,7 +509,7 @@ public void getServerPort_defaultPort_expect443() { public void getServerPort_customPortFromHeader_expectCustomPort() { AwsProxyRequest proxyReq = getRequestWithHeaders(); proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); - HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(80, req.getServerPort()); } @@ -498,7 +517,7 @@ public void getServerPort_customPortFromHeader_expectCustomPort() { public void getServerPort_invalidCustomPortFromHeader_expectDefaultPort() { AwsProxyRequest proxyReq = getRequestWithHeaders(); proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); - HttpServletRequest req = new AwsProxyHttpServletRequest(proxyReq, null, null); + HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(443, req.getServerPort()); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java index 05aa6ae6..898f251b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java @@ -183,10 +183,6 @@ private AwsLambdaServletContainerHandler invalidMappings = reg.addMapping("/"); + assertEquals(1, invalidMappings.size()); + assertEquals("/", invalidMappings.toArray(new String[]{})[0]); + reg.addMapping("/hello", "/world"); + assertEquals(3, reg.getMappings().size()); + } + + @Test + public void metadata_savedAndReturnedCorrectly() { + ServletRegistration.Dynamic reg = new AwsServletRegistration("test", null, new AwsServletContext(null)); + assertEquals("test", reg.getName()); + reg.setLoadOnStartup(2); + assertEquals(2, ((AwsServletRegistration)reg).getLoadOnStartup()); + assertNull(reg.getRunAsRole()); + reg.setRunAsRole("role"); + assertEquals("role", reg.getRunAsRole()); + reg.setAsyncSupported(true); + assertTrue(((AwsServletRegistration)reg).isAsyncSupported()); + } + + @Test + public void setInitParameter_savedCorrectly() { + ServletRegistration.Dynamic reg = new AwsServletRegistration("test", null, new AwsServletContext(null)); + assertTrue(reg.setInitParameter("param", "value")); + assertFalse(reg.setInitParameter("param", "value")); + Map params = new HashMap<>(); + params.put("param2", "value2"); + params.put("param", "value"); + Set invalidParams = reg.setInitParameters(params); + assertEquals(1, invalidParams.size()); + assertEquals("param", invalidParams.toArray(new String[]{})[0]); + assertEquals(2, reg.getInitParameters().size()); + assertEquals("value2", reg.getInitParameter("param2")); + } + + @Test + public void servletConfig_populatesConfig() throws ServletException { + AwsServletContext servletCtx = new AwsServletContext(null); + TestServlet servlet = new TestServlet(); + ServletRegistration.Dynamic reg = new AwsServletRegistration("test", servlet, servletCtx); + assertEquals(servlet, ((AwsServletRegistration)reg).getServlet()); + Map params = new HashMap<>(); + params.put("param2", "value2"); + params.put("param", "value"); + Set invalidParams = reg.setInitParameters(params); + assertEquals(0, invalidParams.size()); + ServletConfig config = ((AwsServletRegistration)reg).getServletConfig(); + assertNotNull(config); + assertEquals("test", config.getServletName()); + assertEquals(servletCtx, config.getServletContext()); + int paramCnt = 0; + Enumeration paramNames = config.getInitParameterNames(); + while (paramNames.hasMoreElements()) { + paramNames.nextElement(); + paramCnt++; + } + assertEquals(2, paramCnt); + + } + + private class TestServlet implements Servlet { + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + + } + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java index 0b82c4bd..50f5cf05 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -96,7 +96,7 @@ public void serialize_base64Encoded_fieldContainsIsPrefix() throws IOException { .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); ObjectMapper mapper = new ObjectMapper(); String serializedRequest = mapper.writeValueAsString(req); - System.out.println(serializedRequest); + assertTrue(serializedRequest.contains("\"isBase64Encoded\":true")); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java deleted file mode 100644 index af9d721d..00000000 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/LambdaSpringApplicationInitializer.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.ServletRequestHandledEvent; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.*; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.*; - -/** - * Custom implementation of Spring's `WebApplicationInitializer`. Uses internal variables to keep application state - * and creates a DispatcherServlet to handle incoming events. When the first event arrives it extracts the ServletContext - * and starts the Spring application. This class assumes that the implementation of `HttpServletRequest` that is passed - * in correctly implements the `getServletContext` method. - * - * State is kept using the `initialized` boolean variable. Each time a new event is received, the app sets the - * `currentResponse` private property to the value of the new `HttpServletResponse` object. This is used to intercept - * Spring notifications for the `ServletRequestHandledEvent` and call the flush method to release the latch. - */ -@SuppressFBWarnings("MTIA_SUSPECT_SERVLET_INSTANCE_FIELD") // we assume we are running in a "single threaded" environment - AWS Lambda -public class LambdaSpringApplicationInitializer extends HttpServlet implements WebApplicationInitializer { - public static final String ERROR_NO_CONTEXT = "No application context or configuration classes provided"; - - private static final String DEFAULT_SERVLET_NAME = "aws-servless-java-container"; - - private static final long serialVersionUID = 42L; - - // all of these variables are declared as volatile for correctness, technically this class is an implementation of - // HttpServlet and could live in a multi-threaded environment. Because the library runs inside AWS Lambda, we can - // assume we will be in a single-threaded environment. - - // Configuration variables that can be passed in - @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") - private transient volatile ConfigurableWebApplicationContext applicationContext; - private volatile boolean refreshContext = true; - @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") - private transient volatile List contextListeners; - private volatile List springProfiles; - - // Dynamically instantiated properties - private volatile DispatcherServlet dispatcherServlet; - - // The current response is used to release the latch when Spring emits the request handled event - private transient volatile HttpServletResponse currentResponse; - - @SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED") - private transient Logger log = LoggerFactory.getLogger(LambdaSpringApplicationInitializer.class); - - /** - * Creates a new instance of the WebApplicationInitializer - * @param applicationContext A custom ConfigurableWebApplicationContext to be used - */ - public LambdaSpringApplicationInitializer(ConfigurableWebApplicationContext applicationContext) { - this.contextListeners = new ArrayList<>(); - this.applicationContext = applicationContext; - } - - /** - * Adds a new listener for the servlet context events. At the moment the library only emits events when the application - * is initialized. Because we don't have container lifecycle notifications from Lambda the `contextDestroyed` - * method is never called - * @param listener An implementation of `ServletContextListener` - */ - public void addListener(ServletContextListener listener) { - contextListeners.add(listener); - } - - public void setRefreshContext(boolean refreshContext) { - this.refreshContext = refreshContext; - } - - /** - * Given a request and response objects, triggers the filters set in the servlet context and - * @param request The incoming request - * @param response The response object Spring should write to. - * @throws ServletException When an error occurs during processing or of the request - * @throws IOException When an error occurs while writing the response - */ - public void dispatch(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - currentResponse = response; - dispatcherServlet.service(request, response); - } - - /** - * Gets the initialized Spring dispatcher servlet instance. - * @return The Spring dispatcher servlet - */ - public DispatcherServlet getDispatcherServlet() { - return dispatcherServlet; - } - - public void setSpringProfiles(ServletContext ctx, String... springProfiles) - throws ContainerInitializationException { - this.springProfiles = Arrays.asList(springProfiles); - - applicationContext.registerShutdownHook(); - applicationContext.close(); - contextListeners.clear(); - try { - onStartup(ctx); - } catch (ServletException e) { - throw new ContainerInitializationException("Could not reload Spring context", e); - } - - } - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - Timer.start("SPRING_INITIALIZER_ONSTARTUP"); - if (springProfiles != null) { - applicationContext.getEnvironment().setActiveProfiles(springProfiles.toArray(new String[0])); - } - applicationContext.setServletContext(servletContext); - - DefaultDispatcherConfig dispatcherConfig = new DefaultDispatcherConfig(servletContext); - applicationContext.setServletConfig(dispatcherConfig); - - // Manage the lifecycle of the root application context - this.addListener(new ContextLoaderListener(applicationContext)); - - // Register and map the dispatcher servlet - dispatcherServlet = new DispatcherServlet(applicationContext); - - if (refreshContext) { - dispatcherServlet.refresh(); - } - - dispatcherServlet.onApplicationEvent(new ContextRefreshedEvent(applicationContext)); - dispatcherServlet.init(dispatcherConfig); - - notifyStartListeners(servletContext); - Timer.stop("SPRING_INITIALIZER_ONSTARTUP"); - } - - private void notifyStartListeners(ServletContext context) { - for (ServletContextListener listener : contextListeners) { - listener.contextInitialized(new ServletContextEvent(context)); - } - } - - - /////////////////////////////////////////////////////////////// - // HttpServlet implementation // - // This is used to pass the initializer to the filter chain // - // to handle requests // - /////////////////////////////////////////////////////////////// - - @Override - public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { - Timer.start("SPRING_INITIALIZER_SERVICE"); - Timer.start("SPRING_INITIALIZER_SERVICE_CAST"); - if (!(req instanceof HttpServletRequest)) { - throw new ServletException("Cannot service request that is not instance of HttpServletRequest"); - } - - if (!(res instanceof HttpServletResponse)) { - throw new ServletException("Cannot work with response that is not instance of HttpServletResponse"); - } - Timer.stop("SPRING_INITIALIZER_SERVICE_CAST"); - dispatch((HttpServletRequest)req, (HttpServletResponse)res); - Timer.stop("SPRING_INITIALIZER_SERVICE"); - } - - /** - * Default configuration class for the DispatcherServlet. This just mocks the behaviour of a default - * ServletConfig object with no init parameters - */ - private static class DefaultDispatcherConfig implements ServletConfig { - private ServletContext servletContext; - - DefaultDispatcherConfig(ServletContext context) { - servletContext = context; - } - - @Override - public String getServletName() { - return DEFAULT_SERVLET_NAME; - } - - @Override - public ServletContext getServletContext() { - return servletContext; - } - - @Override - public String getInitParameter(String s) { - return null; - } - - @Override - public Enumeration getInitParameterNames() { - return Collections.emptyEnumeration(); - } - } -} From ab0217e435afa7f4e7c86541acac9140ff4d2bc5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 12:38:41 -0700 Subject: [PATCH 0311/1214] Updated tests to work well with new context implementation and removed debug System.out calls (#239 contd) --- .../serverless/proxy/jersey/EchoJerseyResource.java | 7 ------- .../serverless/proxy/jersey/JerseyAwsProxyTest.java | 4 ---- .../serverless/proxy/jersey/JerseyParamEncodingTest.java | 1 - .../proxy/jersey/providers/CustomExceptionMapper.java | 3 +-- .../serverless/proxy/spark/InitExceptionHandlerTest.java | 1 - .../proxy/spark/SparkLambdaContainerHandlerTest.java | 2 -- .../serverless/proxy/spark/filter/CustomHeaderFilter.java | 5 ++--- .../proxy/spark/filter/UnauthenticatedFilter.java | 3 --- 8 files changed, 3 insertions(+), 23 deletions(-) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index ec0f4b2a..5da93ca0 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -86,7 +86,6 @@ public SingleValueModel returnFilterAttribute(@Context HttpServletRequest req) { @Path("/list-query-string") @GET @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoQueryStringLength(@QueryParam("list") List param) { - System.out.println("param: " + param + " = " + param.size()); SingleValueModel model = new SingleValueModel(); model.setValue(param.size() + ""); return model; @@ -157,7 +156,6 @@ public MapResponseModel echoQueryString(@Context UriInfo context) { @Produces(MediaType.APPLICATION_JSON) public SingleValueModel echoRequestScheme(@Context UriInfo context) { SingleValueModel model = new SingleValueModel(); - System.out.println("RequestUri: " + context.getRequestUri().toString()); model.setValue(context.getRequestUri().getScheme()); return model; } @@ -261,11 +259,6 @@ public Response fileSize(@FormDataParam("file") final File uploadedFile, @Context ContainerRequestContext req) { SingleValueModel sv = new SingleValueModel(); - System.out.println( - "Is base64 encoded: " + - ((AwsProxyHttpServletRequest)req.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY)).getAwsProxyRequest().isBase64Encoded() - ); - try { InputStream fileIs = new FileInputStream(uploadedFile); System.out.println("File: " + fileDetail.getName() + " " + fileDetail.getFileName() + " " + fileDetail.getSize()); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index e791ae81..baecb13a 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -110,7 +110,6 @@ public void alb_basicRequest_expectSuccess() { assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); assertNotNull(output.getStatusDescription()); - System.out.println(output.getStatusDescription()); validateMapResponseModel(output); } @@ -170,9 +169,6 @@ public void context_servletResponse_setCustomHeader() { public void context_serverInfo_correctContext() { AwsProxyRequest request = getRequestBuilder("/echo/servlet-context", "GET").build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - for (String header : output.getMultiValueHeaders().keySet()) { - System.out.println(header + ": " + output.getMultiValueHeaders().getFirst(header)); - } assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 06edbdaa..0484e62d 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -187,7 +187,6 @@ public void queryParam_encoding_expectFullyEncodedUrl() { assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); validateSingleValueModel(resp, "%2F%2B%3D"); - System.out.println("body:" + resp.getBody()); } @Test diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java index a800d114..e435aff9 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java @@ -12,7 +12,7 @@ public class CustomExceptionMapper implements ExceptionMapper { public CustomExceptionMapper() { - System.out.println("Starting custom exception mapper"); + } @Inject @@ -23,7 +23,6 @@ public Response toResponse(UnsupportedOperationException throwable) { if (request == null) { return Response.status(Response.Status.NOT_FOUND).build(); } else { - System.out.println("Request uri: " + request.get().getRequestURI()); return Response.ok(throwable.getMessage()).status(Response.Status.NOT_IMPLEMENTED).build(); } } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java index fb39d9b6..6042899e 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -67,7 +67,6 @@ public static void stopSpark() { private static void configureRoutes() { initExceptionHandler((e) -> { - System.out.println("Exception Handler called: " + e.getLocalizedMessage()); assertEquals(TEST_EXCEPTION_MESSAGE, e.getLocalizedMessage()); }); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 400373a4..c778bd57 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -38,7 +38,6 @@ public void filters_onStartupMethod_executeFilters() { handler.onStartup(c -> { if (c == null) { - System.out.println("Null servlet context"); fail(); } FilterRegistration.Dynamic registration = c.addFilter("CustomHeaderFilter", CustomHeaderFilter.class); @@ -75,7 +74,6 @@ public void filters_unauthenticatedFilter_stopRequestProcessing() { handler.onStartup(c -> { if (c == null) { - System.out.println("Null servlet context"); fail(); } FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java index 34999445..e3733f3a 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java @@ -18,12 +18,11 @@ public class CustomHeaderFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { - System.out.println("Called init on filter"); + } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - System.out.println("Called doFilter"); HttpServletResponse resp = (HttpServletResponse)servletResponse; resp.addHeader(HEADER_NAME, HEADER_VALUE); @@ -33,6 +32,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo @Override public void destroy() { - System.out.println("Called destroy"); + } } \ No newline at end of file diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java index 60e8eb42..742072ca 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java @@ -27,13 +27,10 @@ public void init(FilterConfig filterConfig) @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - System.out.println("Running unauth filter"); if (((HttpServletRequest)servletRequest).getHeader(HEADER_NAME) != null) { ((HttpServletResponse) servletResponse).setStatus(401); - System.out.println("Returning 401"); return; } - System.out.println("Continue chain"); filterChain.doFilter(servletRequest, servletResponse); } From 961ed1b114d881b3b1df2ade66f774519dd63947 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 12:40:42 -0700 Subject: [PATCH 0312/1214] Simplified Spring and SpringBoot 1.x integration to use an embedded servlet container (#239 contd) --- aws-serverless-java-container-spring/pom.xml | 16 ++ .../SpringBootLambdaContainerHandler.java | 195 ++++-------------- ...SpringBootServletConfigurationSupport.java | 12 ++ .../spring/SpringLambdaContainerHandler.java | 68 +++--- ...erverlessServletEmbeddedServerFactory.java | 55 +++++ .../proxy/spring/SpringAwsProxyTest.java | 3 - .../proxy/spring/SpringBootAppTest.java | 18 +- .../proxy/spring/SpringBootSecurityTest.java | 1 - .../proxy/spring/echoapp/ContextResource.java | 1 - .../spring/echoapp/CustomHeaderFilter.java | 5 +- .../proxy/spring/echoapp/EchoResource.java | 3 +- .../spring/echoapp/EchoSpringAppConfig.java | 10 +- .../spring/echoapp/UnauthenticatedFilter.java | 3 - ...rlessServletEmbeddedServerFactoryTest.java | 106 ++++++++++ .../spring/sbsecurityapp/TestController.java | 1 - .../sbsecurityapp/TestSecurityConfig.java | 3 +- .../spring/springbootapp/TestController.java | 1 - .../proxy/struts2/Struts2AwsProxyTest.java | 5 - 18 files changed, 265 insertions(+), 241 deletions(-) create mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java create mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 15e62930..8862e478 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -81,6 +81,22 @@ 2.2.4 test + + org.springframework.boot + spring-boot + ${springboot.version} + true + + + org.springframework + spring-context + + + org.springframework + spring-core + + + org.springframework.boot spring-boot-autoconfigure diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 68cab4f7..f84f6ca3 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -23,24 +23,21 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; -import org.springframework.web.SpringServletContainerInitializer; import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; -import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.*; -import java.util.*; import java.util.concurrent.CountDownLatch; /** - * Spring implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` + * SpringBoot 1.x implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. * @@ -53,11 +50,24 @@ public class SpringBootLambdaContainerHandler extends private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); private String[] springProfiles = null; - private DispatcherServlet dispatcherServlet; + + private static SpringBootLambdaContainerHandler instance; // State vars private boolean initialized; + /** + * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. + * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() + * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it + * for our mock {@link com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory}. + * + * @return The initialized instance + */ + public static SpringBootLambdaContainerHandler getInstance() { + return instance; + } + /** * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects * @param springBootInitializer {@code SpringBootServletInitializer} class @@ -121,12 +131,20 @@ public SpringBootLambdaContainerHandler(Class requestTypeClass, throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); - setServletContext(new SpringBootAwsServletContext()); initialized = false; this.springBootInitializer = springBootInitializer; + SpringBootLambdaContainerHandler.setInstance(this); + Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); } + // this is not pretty. However, because SpringBoot wants to control all of the initialization + // we need to access this handler as a singleton from the EmbeddedContainer to set the servlet + // context and from the ServletConfigurationSupport implementation + private static void setInstance(SpringBootLambdaContainerHandler h) { + SpringBootLambdaContainerHandler.instance = h; + } + public void activateSpringProfiles(String... profiles) { springProfiles = profiles; // force a re-initialization @@ -151,7 +169,8 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt containerRequest.setServletContext(getServletContext()); // process filters & invoke servlet - doFilter(containerRequest, containerResponse, dispatcherServlet); + Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); } @@ -161,163 +180,19 @@ public void initialize() throws ContainerInitializationException { Timer.start("SPRINGBOOT_COLD_START"); - if (springProfiles != null && springProfiles.length > 0) { - System.setProperty("spring.profiles.active", String.join(",", springProfiles)); - } - SpringServletContainerInitializer springServletContainerInitializer = new SpringServletContainerInitializer(); - LinkedHashSet> webAppInitializers = new LinkedHashSet<>(); - webAppInitializers.add(springBootInitializer); - try { - springServletContainerInitializer.onStartup(webAppInitializers, getServletContext()); - } catch (ServletException e) { - throw new ContainerInitializationException("Could not initialize Spring Boot", e); - } - + SpringApplication app = new SpringApplication( + springBootInitializer, + ServerlessServletEmbeddedServerFactory.class, + SpringBootServletConfigurationSupport.class + ); if (springProfiles != null && springProfiles.length > 0) { ConfigurableEnvironment springEnv = new StandardEnvironment(); springEnv.setActiveProfiles(springProfiles); + app.setEnvironment(springEnv); } - - WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); - - dispatcherServlet = applicationContext.getBean("dispatcherServlet", DispatcherServlet.class); + app.run(); initialized = true; Timer.stop("SPRINGBOOT_COLD_START"); } - - public Servlet getServlet() { - return dispatcherServlet; - } - - - private class SpringBootAwsServletContext extends AwsServletContext { - public SpringBootAwsServletContext() { - super(SpringBootLambdaContainerHandler.this); - } - - @Override - public ServletRegistration.Dynamic addServlet(String s, String s1) { - throw new UnsupportedOperationException("Only dispatcherServlet is supported"); - } - - @Override - public ServletRegistration.Dynamic addServlet(String s, Class aClass) { - throw new UnsupportedOperationException("Only dispatcherServlet is supported"); - } - - @Override - public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) { - if ("dispatcherServlet".equals(s)) { - try { - servlet.init(new ServletConfig() { - @Override - public String getServletName() { - return s; - } - - @Override - public ServletContext getServletContext() { - return SpringBootAwsServletContext.this; - } - - @Override - public String getInitParameter(String name) { - return null; - } - - @Override - public Enumeration getInitParameterNames() { - return new Enumeration() { - @Override - public boolean hasMoreElements() { - return false; - } - - @Override - public String nextElement() { - return null; - } - }; - } - }); - } catch (ServletException e) { - throw new RuntimeException("Cannot add servlet " + servlet, e); - } - return new ServletRegistration.Dynamic() { - @Override - public String getName() { - return s; - } - - @Override - public String getClassName() { - return null; - } - - @Override - public boolean setInitParameter(String name, String value) { - return false; - } - - @Override - public String getInitParameter(String name) { - return null; - } - - @Override - public Set setInitParameters(Map initParameters) { - return null; - } - - @Override - public Map getInitParameters() { - return null; - } - - @Override - public Set addMapping(String... urlPatterns) { - return null; - } - - @Override - public Collection getMappings() { - return null; - } - - @Override - public String getRunAsRole() { - return null; - } - - @Override - public void setAsyncSupported(boolean isAsyncSupported) { - - } - - @Override - public void setLoadOnStartup(int loadOnStartup) { - - } - - @Override - public Set setServletSecurity(ServletSecurityElement constraint) { - return null; - } - - @Override - public void setMultipartConfig(MultipartConfigElement multipartConfig) { - - } - - @Override - public void setRunAsRole(String roleName) { - - } - }; - } else { - throw new UnsupportedOperationException("Only dispatcherServlet is supported"); - } - } - } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java new file mode 100644 index 00000000..d975bd20 --- /dev/null +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java @@ -0,0 +1,12 @@ +package com.amazonaws.serverless.proxy.spring; + +import org.springframework.boot.context.embedded.WebApplicationContextServletContextAwareProcessor; +import org.springframework.web.context.ConfigurableWebApplicationContext; + + +public class SpringBootServletConfigurationSupport extends WebApplicationContextServletContextAwareProcessor { + public SpringBootServletConfigurationSupport(ConfigurableWebApplicationContext webApplicationContext) { + super(webApplicationContext); + webApplicationContext.setServletContext(SpringBootLambdaContainerHandler.getInstance().getServletContext()); + } +} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 7fd87803..fcd9e7fd 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -26,9 +26,10 @@ import com.amazonaws.services.lambda.runtime.Context; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.Servlet; -import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; import java.util.concurrent.CountDownLatch; @@ -40,10 +41,11 @@ * @param The expected return type */ public class SpringLambdaContainerHandler extends AwsLambdaServletContainerHandler { - private LambdaSpringApplicationInitializer initializer; + private ConfigurableWebApplicationContext appContext; + private String[] profiles; // State vars - private boolean initialized; + private boolean refreshContext = false; /** * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects @@ -120,30 +122,21 @@ public SpringLambdaContainerHandler(Class requestTypeClass, throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); - initialized = false; - initializer = new LambdaSpringApplicationInitializer(applicationContext); + appContext = applicationContext; Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); } /** * Asks the custom web application initializer to refresh the Spring context. - * @param refreshContext true if the context should be refreshed + * @param refresh true if the context should be refreshed */ - public void setRefreshContext(boolean refreshContext) { - this.initializer.setRefreshContext(refreshContext); + public void setRefreshContext(boolean refresh) { + //this.initializer.setRefreshContext(refreshContext); + refreshContext = refresh; } - /** - * Returns the custom web application initializer used by the object. The custom application initializer gives you access - * to the dispatcher servlet. - * @return The instance of the custom {@link org.springframework.web.WebApplicationInitializer} - */ - public LambdaSpringApplicationInitializer getApplicationInitializer() { - return initializer; - } - @Override protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); @@ -153,33 +146,31 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest /** * Activates the given Spring profiles in the application. This method will cause the context to be * refreshed. To use a single Spring profile, use the static method {@link SpringLambdaContainerHandler#getAwsProxyHandler(ConfigurableWebApplicationContext, String...)} - * @param profiles A number of spring profiles + * @param p A number of spring profiles * @throws ContainerInitializationException if the initializer is not set yet. */ - public void activateSpringProfiles(String... profiles) throws ContainerInitializationException { - if (initializer == null) { - throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null); - } + public void activateSpringProfiles(String... p) throws ContainerInitializationException { + profiles = p; setServletContext(new AwsServletContext(this)); - initializer.setSpringProfiles(getServletContext(), profiles); + appContext.registerShutdownHook(); + appContext.close(); + initialize(); } @Override protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { Timer.start("SPRING_HANDLE_REQUEST"); - if (initializer == null) { - throw new ContainerInitializationException(LambdaSpringApplicationInitializer.ERROR_NO_CONTEXT, null); - } - // wire up the application context on the first invocation - if (!initialized) { - initialize(); + if (refreshContext) { + appContext.refresh(); + refreshContext = false; } containerRequest.setServletContext(getServletContext()); // process filters - doFilter(containerRequest, containerResponse, initializer); + Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRING_HANDLE_REQUEST"); } @@ -188,18 +179,13 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt public void initialize() throws ContainerInitializationException { Timer.start("SPRING_COLD_START"); - - try { - initializer.onStartup(getServletContext()); - } catch (ServletException e) { - throw new ContainerInitializationException("Could not initialize Spring", e); + if (profiles != null) { + appContext.getEnvironment().setActiveProfiles(profiles); } - - initialized = true; + appContext.setServletContext(getServletContext()); + DispatcherServlet dispatcher = new DispatcherServlet(appContext); + ServletRegistration.Dynamic reg = getServletContext().addServlet("dispatcherServlet", dispatcher); + reg.addMapping("/"); Timer.stop("SPRING_COLD_START"); } - - public Servlet getServlet() { - return initializer.getDispatcherServlet(); - } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java new file mode 100644 index 00000000..4e9a8836 --- /dev/null +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -0,0 +1,55 @@ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory; +import org.springframework.boot.context.embedded.EmbeddedServletContainer; +import org.springframework.boot.context.embedded.EmbeddedServletContainerException; +import org.springframework.boot.web.servlet.ServletContextInitializer; + +import javax.servlet.ServletException; + +/** + * Implementation of SpringBoot's embedded container factory and servlet container. This replaces SpringBoot's default + * embedded container and uses the {@link SpringBootLambdaContainerHandler} as a singleton to retrieve the current + * {@link javax.servlet.ServletContext} and pass it to the array of {@link javax.servlet.ServletContainerInitializer}. + */ +public class ServerlessServletEmbeddedServerFactory extends AbstractEmbeddedServletContainerFactory implements EmbeddedServletContainer { + private AwsLambdaServletContainerHandler handler; + private ServletContextInitializer[] initializers; + + public ServerlessServletEmbeddedServerFactory() { + super(); + handler = SpringBootLambdaContainerHandler.getInstance(); + } + + @Override + public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... servletContextInitializers) { + initializers = servletContextInitializers; + + return this; + } + + @Override + public void start() throws EmbeddedServletContainerException { + for (ServletContextInitializer i : initializers) { + try { + if (handler.getServletContext() == null) { + throw new EmbeddedServletContainerException("Attempting to initialize ServletEmbeddedWebServer without ServletContext in Handler", null); + } + i.onStartup(handler.getServletContext()); + } catch (ServletException e) { + throw new EmbeddedServletContainerException("Could not initialize Servlets", e); + } + } + } + + ServletContextInitializer[] getInitializers() { + return initializers; + } + + @Override + public void stop() throws EmbeddedServletContainerException { + + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 3fe730da..6ed37b77 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -246,7 +246,6 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertNotNull(output.getBody()); - System.out.println("Output:" + output.getBody()); validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } @@ -372,7 +371,6 @@ public void contextPath_generateLink_returnsCorrectPath() { AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - System.out.println("Response: " + output.getBody()); String expectedUri = "https://api.myserver.com/prod/echo/encoded-request-uri/" + EchoResource.TEST_GENERATE_URI; @@ -390,7 +388,6 @@ public void multipart_getFileName_returnsCorrectFileName() AwsProxyResponse output = handler.proxy(request, lambdaContext); assertEquals(200, output.getStatusCode()); - System.out.println("Response: " + output.getBody()); assertEquals("testFile", output.getBody()); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 0a17814d..57d8fda4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -10,7 +10,7 @@ import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestController; -import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; @@ -41,19 +41,6 @@ public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { assertNotNull(resp); assertEquals(404, resp.getStatusCode()); assertNotNull(resp.getMultiValueHeaders()); - assertTrue(resp.getMultiValueHeaders().containsKey("Content-Type")); - assertEquals("application/json; charset=UTF-8", resp.getMultiValueHeaders().getFirst("Content-Type")); - try { - JsonNode errorData = mapper.readTree(resp.getBody()); - assertNotNull(errorData.findValue("status")); - assertEquals(404, errorData.findValue("status").asInt()); - assertNotNull(errorData.findValue("message")); - assertEquals("No message available", errorData.findValue("message").asText()); - - } catch (IOException e) { - e.printStackTrace(); - fail(); - } } @Test @@ -84,7 +71,6 @@ public void staticContent_getHtmlFile_returnsHtmlContent() { .header(HttpHeaders.CONTENT_TYPE, "text/plain") .build(); AwsProxyResponse output = handler.handleRequest(request, context); - System.out.println("Response: " + output.getBody()); assertEquals(200, output.getStatusCode()); assertTrue(output.getBody().contains("

Static

")); } @@ -95,8 +81,6 @@ public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharset() { AwsProxyRequest request = new AwsProxyRequestBuilder("/test/utf8", "GET") .build(); AwsProxyResponse output = handler.handleRequest(request, context); - System.out.println("Response: " + output.getBody()); - System.out.println("Content-Type:" + output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); validateSingleValueModel(output, TestController.UTF8_TEST_STRING); assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains(";")); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java index dc46ed33..2fc6dd0d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java @@ -45,7 +45,6 @@ public void wrongUser_springSecurityBasicAuth_requestRedirectsSuccessfully() thr AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); mapper.enable(SerializationFeature.INDENT_OUTPUT); - System.out.println(mapper.writeValueAsString(resp.getMultiValueHeaders())); assertEquals(403, resp.getStatusCode()); validateSingleValueModel(resp, TestController.ACCESS_DENIED); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java index 59e74ad3..d5223756 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java @@ -47,7 +47,6 @@ public ResponseEntity getContext() { public ResponseEntity createUser(@Valid @RequestBody ValidatedUserModel newUser, BindingResult results) { if (results.hasErrors()) { - System.out.println("Has errors"); return new ResponseEntity(newUser, HttpStatus.BAD_REQUEST); } return new ResponseEntity(newUser, HttpStatus.OK); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java index 0d3eb903..ca003043 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java @@ -18,12 +18,11 @@ public class CustomHeaderFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { - System.out.println("Called init on filter"); + } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - System.out.println("Called doFilter"); HttpServletResponse resp = (HttpServletResponse)servletResponse; resp.addHeader(HEADER_NAME, HEADER_VALUE); @@ -33,6 +32,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo @Override public void destroy() { - System.out.println("Called destroy"); + } } \ No newline at end of file diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index 1487297d..c0702001 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -156,7 +156,6 @@ public SingleValueModel echoRequestURL(HttpServletRequest request) { public SingleValueModel helloForPopulatedBody(@RequestBody(required = false) Optional input) { SingleValueModel valueModel = new SingleValueModel(); if (input.isPresent() && !"null".equals(input.get())) { - System.out.println("Input: \"" + input.get() + "\""); valueModel.setValue("true"); } @@ -194,7 +193,7 @@ public ResponseEntity echoLastModified() { public ResponseEntity receiveFile(@RequestParam("testFile") MultipartFile file) throws IOException { String fileName = file.getName(); byte[] fileContents = file.getBytes(); - System.out.println("Content length: " + fileContents.length); + return ResponseEntity.ok(fileName); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index d9f49e7c..17e09d92 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -5,6 +5,7 @@ import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -17,9 +18,11 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.context.annotation.PropertySource; import org.springframework.web.context.ConfigurableWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; +import javax.servlet.ServletException; import java.util.EnumSet; @@ -50,7 +53,12 @@ public SpringLambdaContainerHandler springLambdaContainerHandler() throws Contai registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*"); // servlet name mappings are disabled and will throw an exception - handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); + //handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); + try { + ((DispatcherServlet)((AwsServletRegistration)c.getServletRegistration("dispatcherServlet")).getServlet()).setThrowExceptionIfNoHandlerFound(true); + } catch (ServletException e) { + e.printStackTrace(); + } }); return handler; } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java index b6340157..ba16d905 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java @@ -27,13 +27,10 @@ public void init(FilterConfig filterConfig) @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - System.out.println("Running unauth filter"); if (((HttpServletRequest)servletRequest).getHeader(HEADER_NAME) != null) { ((HttpServletResponse) servletResponse).setStatus(401); - System.out.println("Returning 401"); return; } - System.out.println("Continue chain"); filterChain.doFilter(servletRequest, servletResponse); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java new file mode 100644 index 00000000..b9e31a05 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -0,0 +1,106 @@ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; +import org.junit.Test; +import org.springframework.boot.context.embedded.EmbeddedServletContainer; +import org.springframework.boot.context.embedded.EmbeddedServletContainerException; +import org.springframework.boot.web.servlet.ServletContextInitializer; + +import javax.servlet.*; +import java.io.IOException; + +import static org.junit.Assert.*; + +public class ServerlessServletEmbeddedServerFactoryTest { + + // initialize a container handler to that the embedded factory can grab its instnace + private SpringBootLambdaContainerHandler h = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); + + public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { + } + + @Test + public void getContainer_populatesInitializers() { + ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); + TestServlet initializer = new TestServlet(false); + EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); + assertNotNull(((ServerlessServletEmbeddedServerFactory)container).getInitializers()); + assertEquals(1, ((ServerlessServletEmbeddedServerFactory)container).getInitializers().length); + assertEquals(initializer, ((ServerlessServletEmbeddedServerFactory)container).getInitializers()[0]); + container.stop(); // calling stop just once to get the test coverage since there's no code in it + } + + @Test + public void start_throwsException() { + ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); + TestServlet initializer = new TestServlet(true); + EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); + try { + container.start(); + } catch (EmbeddedServletContainerException e) { + assertTrue(ServletException.class.isAssignableFrom(e.getCause().getClass())); + assertEquals(TestServlet.EXCEPTION_MESSAGE, e.getCause().getMessage()); + return; + } + fail("Did not throw the expected exception"); + } + + @Test + public void start_withoutException_setsServletContext() { + ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); + TestServlet initializer = new TestServlet(false); + EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); + container.start(); + assertNotNull(initializer.getCtx()); + assertEquals(h.getServletContext(), initializer.getCtx()); + } + + public static class TestServlet implements Servlet, ServletContextInitializer { + private ServletContext ctx; + private boolean throwOnInit; + public static final String EXCEPTION_MESSAGE = "Throw on init"; + + public TestServlet(boolean throwOnInit) { + this.throwOnInit = throwOnInit; + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + + } + + @Override + public ServletConfig getServletConfig() { + return null; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + + } + + @Override + public String getServletInfo() { + return null; + } + + @Override + public void destroy() { + + } + + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + ctx = servletContext; + if (throwOnInit) { + throw new ServletException(EXCEPTION_MESSAGE); + } + } + + public ServletContext getCtx() { + return ctx; + } + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java index 351ddce1..33be36f8 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java @@ -33,7 +33,6 @@ public SingleValueModel testGet() { } else { value.setValue(null); } - System.out.println("Principal: " + value.getValue()); return value; } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java index 13b1ed87..b3ca81ea 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java @@ -24,12 +24,11 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser(USERNAME).password(pEncoder.encode(PASSWORD)).roles("ADMIN") .and().withUser(NO_ADMIN_USERNAME).password(pEncoder.encode(PASSWORD)).roles("USER") .and().passwordEncoder(pEncoder); - System.out.println("Configure authentication manager"); + } @Override public void configure(WebSecurity web) throws Exception { - System.out.println("Configure Web security"); } @Override diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index 51094bd1..0357328e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -59,7 +59,6 @@ public SingleValueModel testDomainInPath(@PathVariable("domain") String domainNa @RequestMapping(path = "/test/query-string", method = { RequestMethod.GET }) public SingleValueModel testQueryStringList(@RequestParam("list") List qsValues) { assert qsValues != null; - System.out.println("QUERY_STRING_VALUES: " + qsValues); SingleValueModel value = new SingleValueModel(); value.setValue(qsValues.size() + ""); return value; diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java index d362030f..1e6ad63a 100644 --- a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -92,12 +92,8 @@ public void context_serverInfo_correctContext() { .queryString("contentType", "true") .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); - for (String header : output.getMultiValueHeaders().keySet()) { - System.out.println(header + ": " + output.getMultiValueHeaders().getFirst(header)); - } assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - System.out.println("Body: " + output.getBody()); validateSingleValueModel(output, "Hello Struts2"); } @@ -271,7 +267,6 @@ public void queryParam_encoding_expectUnencodedParam() { String decodedParam = ""; try { decodedParam = URLDecoder.decode(paramValue, "UTF-8"); - System.out.println(decodedParam); } catch (UnsupportedEncodingException e) { e.printStackTrace(); fail("Could not decode parameter"); From ea39ff61ce673eaba5e87def8627148aa5399e66 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 12:41:18 -0700 Subject: [PATCH 0313/1214] Added new springboot2 module that supports both WebFlux and Servlet embedded servers, actually addressing #239. --- .../pom.xml | 171 +++++++++++++++ .../SpringBootLambdaContainerHandler.java | 204 ++++++++++++++++++ ...rverlessReactiveEmbeddedServerFactory.java | 93 ++++++++ ...erverlessServletEmbeddedServerFactory.java | 55 +++++ .../proxy/spring/ServletAppTest.java | 24 +++ .../proxy/spring/WebFluxAppTest.java | 32 +++ .../spring/servletapp/LambdaHandler.java | 25 +++ .../spring/servletapp/MessageController.java | 15 ++ .../spring/servletapp/ServletApplication.java | 8 + .../spring/webfluxapp/LambdaHandler.java | 25 +++ .../spring/webfluxapp/MessageController.java | 26 +++ .../webfluxapp/WebFluxTestApplication.java | 8 + pom.xml | 1 + 13 files changed, 687 insertions(+) create mode 100644 aws-serverless-java-container-springboot2/pom.xml create mode 100644 aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java create mode 100644 aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java create mode 100644 aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml new file mode 100644 index 00000000..f0a8258a --- /dev/null +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -0,0 +1,171 @@ + + + + aws-serverless-java-container + com.amazonaws.serverless + 1.4-SNAPSHOT + + 4.0.0 + + com.amazonaws.serverless + aws-serverless-java-container-springboot2 + AWS Serverless Java container support - SpringBoot 2 implementation + Allows Java applications written for SpringBoot 2 to run in AWS Lambda + https://aws.amazon.com/lambda + 1.4-SNAPSHOT + + + 5.1.9.RELEASE + 2.1.8.RELEASE + + 1.8 + 1.8 + + + + + + com.amazonaws.serverless + aws-serverless-java-container-core + 1.4-SNAPSHOT + + + + org.springframework + spring-webflux + ${spring.version} + true + + + org.springframework.boot + spring-boot + ${springboot.version} + true + + + org.springframework.boot + spring-boot-autoconfigure + ${springboot.version} + true + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.8.1 + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.9 + + always + + + + com.github.spotbugs + spotbugs-maven-plugin + 3.1.1 + + + Max + + Low + + true + + ${project.build.directory}/spotbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + + + + analyze-compile + compile + + check + + + + + + org.owasp + dependency-check-maven + ${dependencyCheck.version} + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + + + + + check + + + + + + + diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java new file mode 100644 index 00000000..c111b2c8 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -0,0 +1,204 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; +import com.amazonaws.services.lambda.runtime.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.StandardEnvironment; + +import javax.servlet.Servlet; +import java.util.concurrent.CountDownLatch; + +/** + * SpringBoot 1.x implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` + * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and + * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. + * + * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). + * + * @param The incoming event type + * @param The expected return type + */ +public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { + private final Class springBootInitializer; + private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); + private String[] springProfiles = null; + + private static SpringBootLambdaContainerHandler instance; + + // State vars + private boolean initialized; + + /** + * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. + * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() + * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it + * for our mock {@link com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory}. + * + * @return The initialized instance + */ + public static SpringBootLambdaContainerHandler getInstance() { + return instance; + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework + */ + public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) + throws ContainerInitializationException { + SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer); + newHandler.initialize(); + return newHandler; + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @param profiles A list of Spring profiles to activate + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework + */ + public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer); + newHandler.activateSpringProfiles(profiles); + newHandler.initialize(); + return newHandler; + } + + /** + * Creates a new container handler with the given reader and writer objects + * + * @param requestTypeClass The class for the incoming Lambda event + * @param requestReader An implementation of `RequestReader` + * @param responseWriter An implementation of `ResponseWriter` + * @param securityContextWriter An implementation of `SecurityContextWriter` + * @param exceptionHandler An implementation of `ExceptionHandler` + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework + */ + public SpringBootLambdaContainerHandler(Class requestTypeClass, + Class responseTypeClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler, + Class springBootInitializer) + throws ContainerInitializationException { + super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); + Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); + initialized = false; + this.springBootInitializer = springBootInitializer; + SpringBootLambdaContainerHandler.setInstance(this); + + Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); + } + + // this is not pretty. However, because SpringBoot wants to control all of the initialization + // we need to access this handler as a singleton from the EmbeddedContainer to set the servlet + // context and from the ServletConfigurationSupport implementation + private static void setInstance(SpringBootLambdaContainerHandler h) { + SpringBootLambdaContainerHandler.instance = h; + } + + public void activateSpringProfiles(String... profiles) { + springProfiles = profiles; + // force a re-initialization + initialized = false; + } + + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + // this method of the AwsLambdaServletContainerHandler sets the servlet context + Timer.start("SPRINGBOOT_HANDLE_REQUEST"); + + // wire up the application context on the first invocation + if (!initialized) { + initialize(); + } + + containerRequest.setServletContext(getServletContext()); + + // process filters & invoke servlet + Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + doFilter(containerRequest, containerResponse, reqServlet); + Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); + } + + + @Override + public void initialize() + throws ContainerInitializationException { + Timer.start("SPRINGBOOT_COLD_START"); + + SpringApplication app = new SpringApplication(getEmbeddedContainerClasses()); + if (springProfiles != null && springProfiles.length > 0) { + ConfigurableEnvironment springEnv = new StandardEnvironment(); + springEnv.setActiveProfiles(springProfiles); + app.setEnvironment(springEnv); + } + + app.run(); + + initialized = true; + Timer.stop("SPRINGBOOT_COLD_START"); + } + + private Class[] getEmbeddedContainerClasses() { + Class[] classes = new Class[2]; + try { + // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. + this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); + log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); + classes[0] = ServerlessReactiveEmbeddedServerFactory.class; + } catch (ClassNotFoundException e) { + classes[0] = ServerlessServletEmbeddedServerFactory.class; + } + + classes[1] = springBootInitializer; + return classes; + } +} diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java new file mode 100644 index 00000000..94a9d207 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java @@ -0,0 +1,93 @@ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFactory; +import org.springframework.boot.web.server.WebServer; +import org.springframework.boot.web.server.WebServerException; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; + +import javax.servlet.*; +import java.io.IOException; +import java.util.Enumeration; + +@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) +public class ServerlessReactiveEmbeddedServerFactory extends AbstractReactiveWebServerFactory implements WebServer, Servlet { + private ServletHttpHandlerAdapter handler; + private ServletConfig config; + static final String SERVLET_NAME = "com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory"; + static final String SERVLET_INFO = "ServerlessReactiveEmbeddedServerFactory"; + + @Override + @SuppressFBWarnings("MTIA_SUSPECT_SERVLET_INSTANCE_FIELD") + public WebServer getWebServer(HttpHandler httpHandler) { + handler = new ServletHttpHandlerAdapter(httpHandler); + return this; + } + + @Override + public void start() throws WebServerException { + // register this object as the main handler servlet with a mapping of / + SpringBootLambdaContainerHandler + .getInstance() + .getServletContext() + .addServlet(SERVLET_NAME, this) + .addMapping("/"); + handler.init(new ServletAdapterConfig()); + } + + @Override + public void stop() throws WebServerException { + // nothing to do here. + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + config = servletConfig; + } + + @Override + public ServletConfig getServletConfig() { + return config; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + handler.service(servletRequest, servletResponse); + } + + @Override + public String getServletInfo() { + return SERVLET_INFO; + } + + @Override + public void destroy() { + + } + + private static class ServletAdapterConfig implements ServletConfig { + @Override + public String getServletName() { + return SERVLET_NAME; + } + + @Override + public ServletContext getServletContext() { + return SpringBootLambdaContainerHandler.getInstance().getServletContext(); + } + + @Override + public String getInitParameter(String s) { + return null; + } + + @Override + public Enumeration getInitParameterNames() { + return null; + } + } +} diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java new file mode 100644 index 00000000..b47b081c --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -0,0 +1,55 @@ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.web.server.WebServer; +import org.springframework.boot.web.server.WebServerException; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.core.Ordered; + +import javax.servlet.ServletException; + +@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) +public class ServerlessServletEmbeddedServerFactory implements ServletWebServerFactory, WebServer { + private ServletContextInitializer[] initializers; + private AwsLambdaServletContainerHandler handler; + + public ServerlessServletEmbeddedServerFactory() { + super(); + handler = SpringBootLambdaContainerHandler.getInstance(); + } + + @Override + public WebServer getWebServer(ServletContextInitializer... initializers) { + this.initializers = initializers; + for (ServletContextInitializer i : initializers) { + try { + if (handler.getServletContext() == null) { + throw new WebServerException("Attempting to initialize ServletEmbeddedWebServer without ServletContext in Handler", null); + } + i.onStartup(handler.getServletContext()); + } catch (ServletException e) { + throw new WebServerException("Could not initialize Servlets", e); + } + } + return this; + } + + @Override + public void start() throws WebServerException { + + } + + @Override + public void stop() throws WebServerException { + + } + + @Override + public int getPort() { + return 0; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java new file mode 100644 index 00000000..b7353cd8 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java @@ -0,0 +1,24 @@ +package com.amazonaws.servlerss.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.servlerss.proxy.spring.servletapp.LambdaHandler; +import com.amazonaws.servlerss.proxy.spring.servletapp.MessageController; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ServletAppTest { + + LambdaHandler handler = new LambdaHandler(); + MockLambdaContext lambdaContext = new MockLambdaContext(); + + @Test + public void helloRequest_respondsWithSingleMessage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java new file mode 100644 index 00000000..ffdb98e4 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java @@ -0,0 +1,32 @@ +package com.amazonaws.servlerss.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.servlerss.proxy.spring.webfluxapp.LambdaHandler; +import com.amazonaws.servlerss.proxy.spring.webfluxapp.MessageController; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class WebFluxAppTest { + + LambdaHandler handler = new LambdaHandler(); + MockLambdaContext lambdaContext = new MockLambdaContext(); + + @Test + public void helloRequest_respondsWithSingleMessage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/single", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(MessageController.MESSAGE, resp.getBody()); + } + + @Test + public void helloDoubleRequest_respondsWithDoubleMessage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/double", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + + assertEquals(MessageController.MESSAGE + MessageController.MESSAGE, resp.getBody()); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java new file mode 100644 index 00000000..c6b4e0b7 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java @@ -0,0 +1,25 @@ +package com.amazonaws.servlerss.proxy.spring.servletapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(ServletApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java new file mode 100644 index 00000000..48731347 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java @@ -0,0 +1,15 @@ +package com.amazonaws.servlerss.proxy.spring.servletapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java new file mode 100644 index 00000000..c7050f1b --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java @@ -0,0 +1,8 @@ +package com.amazonaws.servlerss.proxy.spring.servletapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication +public class ServletApplication extends SpringBootServletInitializer { +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java new file mode 100644 index 00000000..60dcbd4a --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java @@ -0,0 +1,25 @@ +package com.amazonaws.servlerss.proxy.spring.webfluxapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(WebFluxTestApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java new file mode 100644 index 00000000..a507ff97 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java @@ -0,0 +1,26 @@ +package com.amazonaws.servlerss.proxy.spring.webfluxapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +@RestController +public class MessageController { + public static final String MESSAGE = "Hello"; + + @RequestMapping(path="/single", method= RequestMethod.GET) + Flux singleMessage(){ + return Flux.just( + MESSAGE + ); + } + + @RequestMapping(path="/double", method= RequestMethod.GET) + Flux doubleMessage(){ + return Flux.just( + MESSAGE, + MESSAGE + ); + } +} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java new file mode 100644 index 00000000..ec06ac4d --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -0,0 +1,8 @@ +package com.amazonaws.servlerss.proxy.spring.webfluxapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.reactive.config.EnableWebFlux; + +@SpringBootApplication +public class WebFluxTestApplication { +} diff --git a/pom.xml b/pom.xml index 807aecd9..00617337 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ aws-serverless-spring-archetype aws-serverless-springboot-archetype aws-serverless-springboot2-archetype + aws-serverless-java-container-springboot2 From db4664cad08322c26fb5ff5f321a7ec04691344c Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 13:02:49 -0700 Subject: [PATCH 0314/1214] Fixed springboot2 archetype to use the new module --- .../resources/archetype-resources/pom.xml | 10 +++++-- .../src/main/java/Application.java | 30 +------------------ 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index fcdf963f..3dfaa123 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 2.1.8.RELEASE @@ -27,13 +27,19 @@ com.amazonaws.serverless - aws-serverless-java-container-spring + aws-serverless-java-container-springboot2 ${project.version} org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java index 7351392f..1b74086f 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java @@ -5,21 +5,9 @@ #set($logging = $logging.replaceAll("\n", "").trim()) package ${groupId}; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import ${groupId}.controller.PingController; @@ -28,23 +16,7 @@ // We use direct @Import instead of @ComponentScan to speed up cold starts // @ComponentScan(basePackages = "${groupId}.controller") @Import({ PingController.class }) -public class Application extends SpringBootServletInitializer { - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } +public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); From 248fad3f84bbf5f8ba3538757bda53b02076e183 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 13:56:04 -0700 Subject: [PATCH 0315/1214] Unit test for Servlet embedded factory --- ...rlessServletEmbeddedServerFactoryTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java new file mode 100644 index 00000000..60412ec1 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -0,0 +1,46 @@ +package com.amazonaws.servlerss.proxy.spring.embedded; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; +import org.junit.Test; +import org.springframework.boot.web.servlet.ServletContextInitializer; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; + +import static org.junit.Assert.fail; + +public class ServerlessServletEmbeddedServerFactoryTest { + private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + null + ); + + public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { + } + + @Test + public void getWebServer_callsInitializers() { + ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); + factory.getWebServer(new ServletContextInitializer() { + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + if (servletContext == null) { + fail("Null servlet context"); + } + } + }); + } +} From 0ddf275b7550b7e8c1f8b0d60555877b476b8130 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 19:38:13 -0700 Subject: [PATCH 0316/1214] Correct order of submodules in pom to fix build --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 00617337..203dd981 100644 --- a/pom.xml +++ b/pom.xml @@ -20,13 +20,13 @@ aws-serverless-java-container-spark aws-serverless-java-container-spring aws-serverless-java-container-struts2 + aws-serverless-java-container-springboot2 aws-serverless-struts2-archetype aws-serverless-jersey-archetype aws-serverless-spark-archetype aws-serverless-spring-archetype aws-serverless-springboot-archetype aws-serverless-springboot2-archetype - aws-serverless-java-container-springboot2 From d026ca23e0e9de2e8ab71685aa0b4e7b39c13774 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 19:39:32 -0700 Subject: [PATCH 0317/1214] Cleaned up exception dumps in unit tests --- .../internal/servlet/AwsAsyncContext.java | 3 ++- .../testutils/AwsProxyRequestBuilder.java | 1 - .../internal/servlet/AwsAsyncContextTest.java | 1 - .../servlet/AwsFilterChainManagerTest.java | 4 ++-- .../AwsProxyHttpServletRequestReaderTest.java | 4 +--- .../AwsProxyHttpServletRequestTest.java | 18 +++++++++--------- .../servlet/AwsServletContextTest.java | 4 ++-- .../model/CognitoAuthorizerClaimsTest.java | 1 - .../proxy/jersey/JerseyAwsProxyTest.java | 4 ++-- .../proxy/jersey/JerseyParamEncodingTest.java | 4 ++-- .../proxy/spring/SpringAwsProxyTest.java | 4 ++-- .../proxy/spring/SpringBootAppTest.java | 2 +- .../proxy/spring/SpringBootSecurityTest.java | 2 +- .../proxy/struts2/Struts2AwsProxyTest.java | 4 ++-- 14 files changed, 26 insertions(+), 30 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index ae6d1869..daab77e3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -84,7 +84,8 @@ public void complete() { notifyListeners(NotificationType.COMPLETE, null); res.flushBuffer(); } catch (IOException e) { - e.printStackTrace(); + log.error("Could not flush response buffer", e); + throw new RuntimeException(e); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 47c3b97c..d861227b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -209,7 +209,6 @@ public AwsProxyRequestBuilder queryString(String key, String value) { ); //} } catch (UnsupportedEncodingException e) { - e.printStackTrace(); throw new RuntimeException(e); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index d5c86f1c..349a9549 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -110,7 +110,6 @@ protected void doFilter(HttpServletRequest request, HttpServletResponse response this.response.setStatus(desiredStatus); this.response.flushBuffer(); } catch (Exception e) { - e.printStackTrace(); throw new ServletException(e); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index dd344d3b..8bc75354 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -193,11 +193,11 @@ public void filerChain_executeMultipleFilters_expectRunEachTime() { try { fcHolder2.doFilter(req2, resp2); } catch (IOException e) { - fail("IO Exception while executing filters"); e.printStackTrace(); + fail("IO Exception while executing filters"); } catch (ServletException e) { - fail("Servlet exception while executing filters"); e.printStackTrace(); + fail("Servlet exception while executing filters"); } assertTrue(req2.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME) != null); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 72270b87..de246bc0 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -117,8 +117,8 @@ public void readRequest_validEventEmptyPath_expectException() { AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); assertNotNull(servletReq); } catch (InvalidRequestEventException e) { - fail("Could not read a request with a null path"); e.printStackTrace(); + fail("Could not read a request with a null path"); } } @@ -130,7 +130,6 @@ public void readRequest_invalidEventEmptyMethod_expectException() { fail("Expected InvalidRequestEventException"); } catch (InvalidRequestEventException e) { assertEquals(AwsProxyHttpServletRequestReader.INVALID_REQUEST_ERROR, e.getMessage()); - e.printStackTrace(); } } @@ -143,7 +142,6 @@ public void readRequest_invalidEventEmptyContext_expectException() { fail("Expected InvalidRequestEventException"); } catch (InvalidRequestEventException e) { assertEquals(AwsProxyHttpServletRequestReader.INVALID_REQUEST_ERROR, e.getMessage()); - e.printStackTrace(); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 62c78545..c73e64ab 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -274,11 +274,12 @@ public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { try { request.setCharacterEncoding(StandardCharsets.UTF_8.name()); // we have not specified a content type so the encoding will not be set - assertEquals(null, request.getCharacterEncoding()); - assertEquals(null, request.getContentType()); + assertNull(request.getCharacterEncoding()); + assertNull(request.getContentType()); } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); e.printStackTrace(); + fail("Unsupported encoding"); + } } @@ -286,7 +287,7 @@ public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { public void charEncoding_getEncoding_expectContentTypeOnly() { HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); // we have not specified a content type so the encoding will not be set - assertEquals(null, request.getCharacterEncoding()); + assertNull(request.getCharacterEncoding()); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); try { request.setCharacterEncoding(StandardCharsets.UTF_8.name()); @@ -295,8 +296,8 @@ public void charEncoding_getEncoding_expectContentTypeOnly() { assertEquals(newHeaderValue, request.getContentType()); assertEquals(StandardCharsets.UTF_8.name(), request.getCharacterEncoding()); } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); e.printStackTrace(); + fail("Unsupported encoding"); } } @@ -321,8 +322,8 @@ public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() assertEquals(newHeaderValue, request.getContentType()); assertEquals(StandardCharsets.ISO_8859_1.name(), request.getCharacterEncoding()); } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); e.printStackTrace(); + fail("Unsupported encoding"); } } @@ -335,10 +336,9 @@ public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { assertEquals(newHeaderValue, request.getHeader(HttpHeaders.CONTENT_TYPE)); assertEquals(newHeaderValue, request.getContentType()); assertEquals(StandardCharsets.UTF_8.name(), request.getCharacterEncoding()); - } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); e.printStackTrace(); + fail("Unsupported encoding"); } } @@ -352,8 +352,8 @@ public void contentType_duplicateCase_expectSingleContentTypeHeader() { assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE)); assertNotNull(request.getHeader(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))); } catch (UnsupportedEncodingException e) { - fail("Unsupported encoding"); e.printStackTrace(); + fail("Unsupported encoding"); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index ccb62bad..07628f18 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -34,8 +34,8 @@ public static void setUp() { try { LambdaContainerHandler.getContainerConfig().addValidFilePath(tmpFile.getCanonicalPath()); } catch (IOException e) { - fail("Could not add tmp dir to valid paths"); e.printStackTrace(); + fail("Could not add tmp dir to valid paths"); } LambdaContainerHandler.getContainerConfig().addValidFilePath("C:\\MyTestFolder"); } @@ -48,8 +48,8 @@ public void getMimeType_disabledPath_expectException() { } catch (IllegalArgumentException e) { assertTrue(e.getMessage().startsWith("File path not allowed")); } catch (Exception e) { - fail("Unrecognized exception"); e.printStackTrace(); + fail("Unrecognized exception"); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java index de8b3654..55b5d936 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java @@ -85,7 +85,6 @@ public void claims_serialize_validJsonString() { assertEquals(EMAIL, req.getRequestContext().getAuthorizer().getClaims().getEmail()); assertTrue(req.getRequestContext().getAuthorizer().getClaims().isEmailVerified()); } catch (IOException e) { - e.printStackTrace(); fail(); } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index baecb13a..be89c3a0 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -408,8 +408,8 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin assertNotNull(response.getValues().get(key)); assertEquals(value, response.getValues().get(key)); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } @@ -419,8 +419,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(response.getValue()); assertEquals(value, response.getValue()); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 0484e62d..d3b951ae 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -239,8 +239,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(response.getValue()); assertEquals(value, response.getValue()); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } @@ -250,8 +250,8 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin assertNotNull(response.getValues().get(key)); assertEquals(value, response.getValues().get(key)); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 6ed37b77..b9cb728d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -398,8 +398,8 @@ private void validateMapResponseModel(AwsProxyResponse output) { assertNotNull(response.getValues().get(CUSTOM_HEADER_KEY)); assertEquals(CUSTOM_HEADER_VALUE, response.getValues().get(CUSTOM_HEADER_KEY)); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } @@ -409,8 +409,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(response.getValue()); assertEquals(value, response.getValue()); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 57d8fda4..6fcedce6 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -94,8 +94,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(response.getValue()); assertEquals(value, response.getValue()); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java index 2fc6dd0d..b8d50446 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java @@ -55,8 +55,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(response.getValue()); assertEquals(value, response.getValue()); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java index 1e6ad63a..45e14ccd 100644 --- a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -304,8 +304,8 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin assertNotNull(response.get(key)); assertEquals(value, response.get(key)); } catch (IOException e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } @@ -314,8 +314,8 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { assertNotNull(output.getBody()); assertEquals(value, objectMapper.readerFor(String.class).readValue(output.getBody())); } catch (Exception e) { - fail("Exception while parsing response body: " + e.getMessage()); e.printStackTrace(); + fail("Exception while parsing response body: " + e.getMessage()); } } } From 9f28d25e34d9663466080287217987809155dea3 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 11 Sep 2019 19:54:37 -0700 Subject: [PATCH 0318/1214] Updated springboot2 sample to use new package --- samples/springboot2/pet-store/build.gradle | 6 ++++-- samples/springboot2/pet-store/pom.xml | 10 ++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 8ad81f12..7a9c8b9f 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -11,8 +11,10 @@ repositories { dependencies { compile ( - 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + implementation('org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE') { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' + }, + 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) testCompile("junit:junit") diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index b9d47fc1..547a7ead 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.1.RELEASE + 2.1.8.RELEASE @@ -22,11 +22,17 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + com.amazonaws.serverless - aws-serverless-java-container-spring + aws-serverless-java-container-springboot2 [0.1,) From e5a9bba2d05721d5ea83c1698ada1625529181c1 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 12 Sep 2019 08:50:34 -0700 Subject: [PATCH 0319/1214] Fixed gradle build file for springboot2 archetype to use the new dependency --- .../src/main/resources/archetype-resources/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 7bd0e7fe..e48a0dc9 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -12,7 +12,7 @@ repositories { dependencies { compile ( 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) From d1ad9c7e36a97f27fdc850ffe2f89ba43f9a8bae Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 20 Sep 2019 12:56:11 -0700 Subject: [PATCH 0320/1214] Updated getParameterValues to support multi-value query string prameters and address #280 --- .../servlet/AwsProxyHttpServletRequest.java | 13 +++---------- .../internal/testutils/AwsProxyRequestBuilder.java | 9 +++++++++ .../serverless/proxy/spring/SpringBootAppTest.java | 10 ++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index cf9729b5..83e99c74 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -474,7 +474,7 @@ public String getParameter(String s) { } String[] bodyParams = getFormBodyParameterCaseInsensitive(s); - if (bodyParams == null || bodyParams.length == 0) { + if (bodyParams.length == 0) { return null; } else { return bodyParams[0]; @@ -495,16 +495,9 @@ public Enumeration getParameterNames() { @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - List values = new ArrayList<>(); - String queryValue = getFirstQueryParamValue(s, config.isQueryStringCaseSensitive()); - if (queryValue != null) { - values.add(queryValue); - } + List values = new ArrayList<>(Arrays.asList(getQueryParamValues(s, config.isQueryStringCaseSensitive()))); - String[] formBodyValues = getFormBodyParameterCaseInsensitive(s); - if (formBodyValues != null) { - values.addAll(Arrays.asList(formBodyValues)); - } + values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); if (values.size() == 0) { return null; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index d861227b..3260d433 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -366,6 +366,15 @@ public AwsProxyRequestBuilder referer(String referer) { return this; } + + public AwsProxyRequestBuilder basicAuth(String username, String password) { + // we remove the existing authorization strategy + request.getMultiValueHeaders().remove(HttpHeaders.AUTHORIZATION); + String authHeader = "Basic " + Base64.getMimeEncoder().encodeToString((username + ":" + password).getBytes(Charset.defaultCharset())); + request.getMultiValueHeaders().add(HttpHeaders.AUTHORIZATION, authHeader); + return this; + } + public AwsProxyRequestBuilder fromJsonString(String jsonContent) throws IOException { request = LambdaContainerHandler.getObjectMapper().readValue(jsonContent, AwsProxyRequest.class); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 6fcedce6..286d69cc 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -63,6 +63,16 @@ public void queryString_commaSeparatedList_expectUnmarshalAsList() { validateSingleValueModel(resp, "3"); } + @Test + public void queryString_multipleParamsWithSameName_expectUnmarshalAsList() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/test/query-string", "GET") + .queryString("list", "v1").queryString("list", "v2").build(); + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + validateSingleValueModel(resp, "2"); + } + @Test public void staticContent_getHtmlFile_returnsHtmlContent() { LambdaContainerHandler.getContainerConfig().addValidFilePath("/Users/bulianis/workspace/aws-serverless-java-container/aws-serverless-java-container-spring"); From 301f718287a9155f9fd3b48865838a45d83c58e2 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 25 Sep 2019 21:51:15 -0700 Subject: [PATCH 0321/1214] Added new InitializationWrapper and Async implementation to address #210 and #234. Also added a new builder object that makes it easier to construct container handlers --- .../proxy/AsyncInitializationWrapper.java | 103 ++++++++++++ .../proxy/InitializationWrapper.java | 34 ++++ .../internal/LambdaContainerHandler.java | 46 +++++- .../ServletLambdaContainerHandlerBuilder.java | 148 ++++++++++++++++++ .../proxy/model/ContainerConfig.java | 26 +++ ...vletLambdaContainerHandlerBuilderTest.java | 106 +++++++++++++ .../SpringBootLambdaContainerHandler.java | 48 ++---- .../spring/SpringBootProxyHandlerBuilder.java | 63 ++++++++ .../spring/SpringLambdaContainerHandler.java | 57 ++----- .../spring/SpringProxyHandlerBuilder.java | 80 ++++++++++ .../SpringBootLambdaContainerHandler.java | 56 ++----- .../spring/SpringBootProxyHandlerBuilder.java | 62 ++++++++ .../proxy/spring/ServletAppTest.java | 0 .../proxy/spring/WebFluxAppTest.java | 0 ...rlessServletEmbeddedServerFactoryTest.java | 4 +- .../spring/servletapp/LambdaHandler.java | 0 .../spring/servletapp/MessageController.java | 0 .../spring/servletapp/ServletApplication.java | 13 ++ .../spring/webfluxapp/LambdaHandler.java | 0 .../spring/webfluxapp/MessageController.java | 0 .../webfluxapp/WebFluxTestApplication.java | 12 ++ .../spring/servletapp/ServletApplication.java | 8 - .../webfluxapp/WebFluxTestApplication.java | 8 - 23 files changed, 730 insertions(+), 144 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java create mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java create mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java create mode 100644 aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/ServletAppTest.java (100%) rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/WebFluxAppTest.java (100%) rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java (94%) rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/servletapp/LambdaHandler.java (100%) rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/servletapp/MessageController.java (100%) create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/webfluxapp/LambdaHandler.java (100%) rename aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/{servlerss => serverless}/proxy/spring/webfluxapp/MessageController.java (100%) create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java delete mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java delete mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java new file mode 100644 index 00000000..7ef74fc8 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -0,0 +1,103 @@ +package com.amazonaws.serverless.proxy; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Instant; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * An async implementation of the InitializationWrapper interface. This initializer calls the + * {@link LambdaContainerHandler#initialize()} in a separate thread. Then uses a latch to wait for the maximum Lambda + * initialization time of 10 seconds, if the initialize method takes longer than 10 seconds to return, the + * {@link #start(LambdaContainerHandler)} returns control to the caller and lets the initialization thread continue in + * the background. The {@link LambdaContainerHandler#proxy(Object, Context)} automatically waits for the latch of the + * initializer to be released. + * + * The constructor of this class expects an epoch long. This is meant to be as close as possible to the time the Lambda + * function actually started. In most cases, the first action in the constructor of the handler class should be to populate + * this long value ({@code Instant.now().toEpochMs();}). This class uses the value to estimate how much of the init 10 + * seconds has already been used up. + */ +public class AsyncInitializationWrapper extends InitializationWrapper { + private static final int INIT_GRACE_TIME_MS = 250; + private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; + + private CountDownLatch initializationLatch; + private long actualStartTime; + private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); + + /** + * Creates a new instance of the async initializer. + * @param startTime The epoch ms start time of the Lambda function, this should be measured as close as possible to + * the initialization of the function. + */ + public AsyncInitializationWrapper(long startTime) { + actualStartTime = startTime; + } + + @Override + public void start(LambdaContainerHandler handler) throws ContainerInitializationException { + initializationLatch = new CountDownLatch(1); + AsyncInitializer initializer = new AsyncInitializer(initializationLatch, handler); + Thread initThread = new Thread(initializer); + initThread.start(); + try { + long curTime = Instant.now().toEpochMilli(); + // account for the time it took to call the various constructors with the actual start time + a grace of 500ms + long awaitTime = LAMBDA_MAX_INIT_TIME_MS - (curTime - actualStartTime) - INIT_GRACE_TIME_MS; + log.info("Async initialization will wait for " + awaitTime + "ms"); + if (!initializationLatch.await(awaitTime, TimeUnit.MILLISECONDS)) { + log.info("Initialization took longer than " + LAMBDA_MAX_INIT_TIME_MS + ", setting new CountDownLatch and " + + "continuing in event handler"); + initializationLatch = new CountDownLatch(1); + initializer.replaceLatch(initializationLatch); + } + } catch (InterruptedException e) { + // at the moment we assume that this happened because of a timeout since the init thread calls System.exit + // when an exception is thrown. + throw new ContainerInitializationException("Container initialization interrupted", e); + } + } + + @Override + public CountDownLatch getInitializationLatch() { + return initializationLatch; + } + + private static class AsyncInitializer implements Runnable { + private LambdaContainerHandler handler; + private CountDownLatch initLatch; + private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); + + AsyncInitializer(CountDownLatch latch, LambdaContainerHandler h) { + initLatch = latch; + handler = h; + } + + synchronized void replaceLatch(CountDownLatch newLatch) { + initLatch = newLatch; + } + + @Override + @SuppressFBWarnings("DM_EXIT") + public void run() { + log.info("Starting async initializer"); + try { + handler.initialize(); + } catch (ContainerInitializationException e) { + log.error("Failed to initialize container handler", e); + // we cannot return the exception so we crash the whole kaboodle here + System.exit(1); + } + synchronized(this) { + initLatch.countDown(); + } + } + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java new file mode 100644 index 00000000..188a83bd --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java @@ -0,0 +1,34 @@ +package com.amazonaws.serverless.proxy; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; + +import java.util.concurrent.CountDownLatch; + +/** + * This class is in charge of initializing a {@link LambdaContainerHandler}. + * In most cases, this means calling the {@link LambdaContainerHandler#initialize()} method. Some implementations may + * require additional initialization steps, in this case implementations should provide their own + * InitializationWrapper. This library includes an async implementation of this class + * {@link AsyncInitializationWrapper} for frameworks that are likely to take longer than 10 seconds to start. + */ +public class InitializationWrapper { + /** + * This is the main entry point. Container handler builder and the static getAwsProxyHandler() methods + * of the various implementations will call this to initialize the underlying framework + * @param handler The container handler to be initializer + * @throws ContainerInitializationException If anything goes wrong during container initialization. + */ + public void start(LambdaContainerHandler handler) throws ContainerInitializationException { + handler.initialize(); + } + + /** + * Asynchronous implementations of the framework should return a latch that the container handler can use to decide + * whether it can start handling events. Synchronous implementations of this interface should return null. + * @return An initialized latch if the underlying container is starting in a separate thread, null otherwise. + */ + public CountDownLatch getInitializationLatch() { + return null; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 0e61495a..1e9bfaa8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -14,13 +14,9 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.LogFormatter; +import com.amazonaws.serverless.proxy.*; import com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter; import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonParseException; @@ -38,6 +34,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** @@ -67,6 +64,7 @@ public abstract class LambdaContainerHandler exceptionHandler; private Class requestTypeClass; private Class responseTypeClass; + private InitializationWrapper initializationWrapper; protected Context lambdaContext; private LogFormatter logFormatter; @@ -97,7 +95,8 @@ protected LambdaContainerHandler(Class requestClass, RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler) { + ExceptionHandler exceptionHandler, + InitializationWrapper init) { log.info("Starting Lambda Container Handler"); requestTypeClass = requestClass; responseTypeClass = responseClass; @@ -105,8 +104,19 @@ protected LambdaContainerHandler(Class requestClass, this.responseWriter = responseWriter; this.securityContextWriter = securityContextWriter; this.exceptionHandler = exceptionHandler; + initializationWrapper = init; objectReader = getObjectMapper().readerFor(requestTypeClass); objectWriter = getObjectMapper().writerFor(responseTypeClass); + + } + + protected LambdaContainerHandler(Class requestClass, + Class responseClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler) { + this(requestClass, responseClass, requestReader, responseWriter, securityContextWriter, exceptionHandler, new InitializationWrapper()); } @@ -131,6 +141,23 @@ public static ObjectMapper getObjectMapper() { return objectMapper; } + /** + * Returns the initialization wrapper this container handler will monitor to handle events + * @return The initialization wrapper that was passed to the constructor and this instance will use to decide + * whether it can start handling events. + */ + public InitializationWrapper getInitializationWrapper() { + return initializationWrapper; + } + + /** + * Sets a new initialization wrapper. + * @param wrapper The wrapper this instance will use to decide whether it can start handling events. + */ + public void setInitializationWrapper(InitializationWrapper wrapper) { + initializationWrapper = wrapper; + } + /** * Configures the library to strip a base path from incoming requests before passing them on to the wrapped * framework. This was added in response to issue #34 (https://github.com/awslabs/aws-serverless-java-container/issues/34). @@ -174,6 +201,13 @@ public ResponseType proxy(RequestType request, Context context) { ContainerRequestType containerRequest = requestReader.readRequest(request, securityContext, context, config); ContainerResponseType containerResponse = getContainerResponse(containerRequest, latch); + if (initializationWrapper != null && initializationWrapper.getInitializationLatch() != null) { + // we let the potential InterruptedException bubble up + if (!initializationWrapper.getInitializationLatch().await(config.getInitializationTimeout(), TimeUnit.MILLISECONDS)) { + throw new ContainerInitializationException("Could not initialize framework within the " + config.getInitializationTimeout() + "ms timeout", null); + } + } + handleRequest(containerRequest, containerResponse, context); latch.await(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java new file mode 100644 index 00000000..50743e73 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java @@ -0,0 +1,148 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +/** + * Base builder class for {@link AwsLambdaServletContainerHandler}. Implmentations can extend this class to have setters + * for the basic parameters. + * @param The event object class + * @param The output object class + * @param The container request type. For proxy implementations, this is {@link AwsProxyHttpServletRequest}. + * The response type is hardcoded to {@link AwsHttpServletResponse} since it is a generic + * servlet response implementation. + * @param The type of the handler we are building + * @param The builder object itself. This is used to allow implementations to re-use the setter method from this + * abstract class through + * "curiously recurring generic patterns" + */ +public abstract class ServletLambdaContainerHandlerBuilder< + RequestType, + ResponseType, + ContainerRequestType extends HttpServletRequest, + HandlerType extends AwsLambdaServletContainerHandler, + Builder extends ServletLambdaContainerHandlerBuilder> +{ + private static final String MISSING_FIELD_ERROR = "Missing %s in lambda container handler builder"; + + protected InitializationWrapper initializationWrapper; + protected RequestReader requestReader; + protected ResponseWriter responseWriter; + protected SecurityContextWriter securityContextWriter; + protected ExceptionHandler exceptionHandler; + protected Class requestTypeClass; + protected Class responseTypeClass; + + /** + * Validates that all of the required fields are populated. + * @throws ContainerInitializationException If values have not been set on the builder. The message in the exception + * contains a standard error message {@link ServletLambdaContainerHandlerBuilder#MISSING_FIELD_ERROR} populated with + * the list of missing fields. + */ + protected void validate() throws ContainerInitializationException { + List errFields = new ArrayList<>(); + if (requestTypeClass == null) { + errFields.add("request type class"); + } + if (responseTypeClass == null) { + errFields.add("response type class"); + } + if (requestReader == null) { + errFields.add("request reader"); + } + if (responseWriter == null) { + errFields.add("response writer"); + } + if (securityContextWriter == null) { + errFields.add("security context writer"); + } + if (exceptionHandler == null) { + errFields.add("exception handler"); + } + if (initializationWrapper == null) { + errFields.add("initialization wrapper"); + } + if (!errFields.isEmpty()) { + throw new ContainerInitializationException(String.format(MISSING_FIELD_ERROR, String.join(", ", errFields)), null); + } + } + + /** + * Sets all of the required fields in the builder to the default settings for a Servlet-compatible framework that wants + * to support AWS proxy event and output types. + * @return A populated builder + */ + public Builder defaultProxy() { + initializationWrapper(new InitializationWrapper()) + .requestReader((RequestReader) new AwsProxyHttpServletRequestReader()) + .responseWriter((ResponseWriter) new AwsProxyHttpServletResponseWriter()) + .securityContextWriter((SecurityContextWriter) new AwsProxySecurityContextWriter()) + .exceptionHandler((ExceptionHandler) new AwsProxyExceptionHandler()) + .requestTypeClass((Class) AwsProxyRequest.class) + .responseTypeClass((Class) AwsProxyResponse.class); + return self(); + } + + /** + * Sets the initialization wrapper to be used by the {@link ServletLambdaContainerHandlerBuilder#buildAndInitialize()} + * method to start the framework implementations + * @param initializationWrapper An implementation of InitializationWrapper. In most cases, this will be + * set to {@link InitializationWrapper}. The {@link ServletLambdaContainerHandlerBuilder#asyncInit(long)} + * method sets this to {@link AsyncInitializationWrapper}. + * @return This builder object + */ + public Builder initializationWrapper(InitializationWrapper initializationWrapper) { + this.initializationWrapper = initializationWrapper; + return self(); + } + + public Builder requestReader(RequestReader requestReader) { + this.requestReader = requestReader; + return self(); + } + + public Builder responseWriter(ResponseWriter responseWriter) { + this.responseWriter = responseWriter; + return self(); + } + + public Builder securityContextWriter(SecurityContextWriter securityContextWriter) { + this.securityContextWriter = securityContextWriter; + return self(); + } + + public Builder exceptionHandler(ExceptionHandler exceptionHandler) { + this.exceptionHandler = exceptionHandler; + return self(); + } + + public Builder requestTypeClass(Class requestType) { + this.requestTypeClass = requestType; + return self(); + } + + public Builder responseTypeClass(Class responseType) { + this.responseTypeClass = responseType; + return self(); + } + + public Builder asyncInit(long actualStartTime) { + this.initializationWrapper = new AsyncInitializationWrapper(actualStartTime); + return self(); + } + + /** + * Implementations should implement this method to return their type. All of the builder methods in this abstract + * class use this method to return the correct builder type. + * @return The current builder. + */ + protected abstract Builder self(); + public abstract HandlerType build() throws ContainerInitializationException; + public abstract HandlerType buildAndInitialize() throws ContainerInitializationException; +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 18175dd7..e5c80d63 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -16,6 +16,7 @@ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1"; private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; + private static final int MAX_INIT_TIMEOUT_MS = 10_000; public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); @@ -27,6 +28,7 @@ public static ContainerConfig defaultConfig() { configuration.setQueryStringCaseSensitive(false); configuration.addBinaryContentTypes("application/octet-stream", "image/jpeg", "image/png", "image/gif"); configuration.setDefaultContentCharset(DEFAULT_CONTENT_CHARSET); + configuration.setInitializationTimeout(MAX_INIT_TIMEOUT_MS); return configuration; } @@ -45,6 +47,7 @@ public static ContainerConfig defaultConfig() { private List customDomainNames; private boolean queryStringCaseSensitive; private final HashSet binaryContentTypes; + private int initializationTimeout; public ContainerConfig() { validFilePaths = new ArrayList<>(); @@ -271,4 +274,27 @@ public String getDefaultContentCharset() { public void setDefaultContentCharset(String defaultContentCharset) { this.defaultContentCharset = defaultContentCharset; } + + /** + * Returns the maximum amount of time (in milliseconds) set for the initialization time. See documentation on the + * {@link #setInitializationTimeout(int)} for additional details. + * @return The max time allocated for initialization + */ + public int getInitializationTimeout() { + return initializationTimeout; + } + + /** + * Sets the initialization timeout. When using an async {@link com.amazonaws.serverless.proxy.InitializationWrapper} + * the underlying framework is initialized in a separate thread. Serverless Java Container will wait for the maximum + * time available during AWS Lambda's init step (~10 seconds) and then return control to the main thread. In the meanwhile, + * the initialization process of the underlying framework can continue in a separate thread. AWS Lambda will then call + * the handler class to handle an event. This timeout is the maximum amount of time Serverless Java Container framework + * will wait for the underlying framework to initialize before returning an error. By default, this is set to 10 seconds. + * @param initializationTimeout The maximum amount of time to wait for the underlying framework initialization after + * an event is received in milliseconds. + */ + public void setInitializationTimeout(int initializationTimeout) { + this.initializationTimeout = initializationTimeout; + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java new file mode 100644 index 00000000..a9fef9b1 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java @@ -0,0 +1,106 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import org.junit.Test; + +import java.util.concurrent.CountDownLatch; + +import static org.junit.Assert.*; + +public class ServletLambdaContainerHandlerBuilderTest { + + @Test + public void validation_throwsException() { + TestBuilder testBuilder = new TestBuilder(); + try { + testBuilder.validate(); + } catch (ContainerInitializationException e) { + return; + } + fail("Did not throw exception"); + } + + @Test + public void additionalMethod_testSetter() { + TestBuilder test = new TestBuilder().exceptionHandler(new AwsProxyExceptionHandler()).name("test"); + assertEquals("test", test.getName()); + } + + @Test + public void defaultProxy_setsValuesCorrectly() { + TestBuilder test = new TestBuilder().defaultProxy().name("test"); + assertNotNull(test.initializationWrapper); + assertTrue(test.exceptionHandler instanceof AwsProxyExceptionHandler); + assertTrue(test.requestReader instanceof AwsProxyHttpServletRequestReader); + assertTrue(test.responseWriter instanceof AwsProxyHttpServletResponseWriter); + assertTrue(test.securityContextWriter instanceof AwsProxySecurityContextWriter); + assertSame(test.requestTypeClass, AwsProxyRequest.class); + assertSame(test.responseTypeClass, AwsProxyResponse.class); + assertEquals("test", test.name); + } + + public static final class TestHandler extends AwsLambdaServletContainerHandler { + + public TestHandler() { + super(AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler()); + } + @Override + protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + return null; + } + + @Override + protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + + } + + @Override + public void initialize() throws ContainerInitializationException { + + } + } + + public static final class TestBuilder + extends ServletLambdaContainerHandlerBuilder< + AwsProxyRequest, + AwsProxyResponse, + AwsProxyHttpServletRequest, + TestHandler, + TestBuilder> { + + public TestBuilder() { + super(); + } + + private String name; + + public TestBuilder name(String n) { + name = n; + return this; + } + + public String getName() { + return name; + } + + @Override + protected TestBuilder self() { + return this; + } + + @Override + public TestHandler build() throws ContainerInitializationException { + return null; + } + + @Override + public TestHandler buildAndInitialize() throws ContainerInitializationException { + return null; + } + } +} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index f84f6ca3..38994ed3 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -13,12 +13,7 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -68,26 +63,6 @@ public static SpringBootLambdaContainerHandler getInstance() { return instance; } - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) - throws ContainerInitializationException { - SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer); - newHandler.initialize(); - return newHandler; - } - /** * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles * @param springBootInitializer {@code SpringBootServletInitializer} class @@ -97,17 +72,12 @@ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) throws ContainerInitializationException { - SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer); - newHandler.activateSpringProfiles(profiles); - newHandler.initialize(); - return newHandler; + return new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); } /** @@ -127,12 +97,14 @@ public SpringBootLambdaContainerHandler(Class requestTypeClass, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, - Class springBootInitializer) + Class springBootInitializer, + InitializationWrapper init) throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); initialized = false; this.springBootInitializer = springBootInitializer; + setInitializationWrapper(init); SpringBootLambdaContainerHandler.setInstance(this); Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java new file mode 100644 index 00000000..4ead5bc4 --- /dev/null +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.web.WebApplicationInitializer; + +public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + AwsProxyRequest, + AwsProxyResponse, + AwsProxyHttpServletRequest, + SpringBootLambdaContainerHandler, + SpringBootProxyHandlerBuilder> { + private Class springBootInitializer; + private String[] profiles; + + @Override + protected SpringBootProxyHandlerBuilder self() { + return this; + } + + + public SpringBootProxyHandlerBuilder springBootApplication(Class app) { + springBootInitializer = app; + return self(); + } + + public SpringBootProxyHandlerBuilder profiles(String... profiles) { + this.profiles = profiles; + return self(); + } + + @Override + public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { + validate(); + if (springBootInitializer == null) { + throw new ContainerInitializationException("Missing spring boot application class in builder", null); + } + SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( + requestTypeClass, + responseTypeClass, + requestReader, + responseWriter, + securityContextWriter, + exceptionHandler, + springBootInitializer, + initializationWrapper + ); + if (profiles != null) { + handler.activateSpringProfiles(profiles); + } + return handler; + } + + @Override + public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringBootLambdaContainerHandler handler = build(); + initializationWrapper.start(handler); + return handler; + } +} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index fcd9e7fd..c63165a4 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -13,12 +13,7 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -54,30 +49,11 @@ public class SpringLambdaContainerHandler extends Aws * @throws ContainerInitializationException */ public static SpringLambdaContainerHandler getAwsProxyHandler(Class... config) throws ContainerInitializationException { - AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); - applicationContext.register(config); - - return getAwsProxyHandler(applicationContext); - } - - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects - * @param applicationContext A custom ConfigurableWebApplicationContext to be used - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException - */ - public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext) - throws ContainerInitializationException { - SpringLambdaContainerHandler newHandler = new SpringLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - applicationContext); - newHandler.initialize(); - return newHandler; + return new SpringProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .configurationClasses(config) + .buildAndInitialize(); } /** @@ -89,17 +65,12 @@ public static SpringLambdaContainerHandler ge */ public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext, String... profiles) throws ContainerInitializationException { - SpringLambdaContainerHandler newHandler = new SpringLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - applicationContext); - newHandler.activateSpringProfiles(profiles); - newHandler.initialize(); - return newHandler; + return new SpringProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springApplicationContext(applicationContext) + .profiles(profiles) + .buildAndInitialize(); } /** @@ -118,11 +89,13 @@ public SpringLambdaContainerHandler(Class requestTypeClass, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, - ConfigurableWebApplicationContext applicationContext) + ConfigurableWebApplicationContext applicationContext, + InitializationWrapper init) throws ContainerInitializationException { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); appContext = applicationContext; + setInitializationWrapper(init); Timer.stop("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java new file mode 100644 index 00000000..9bfbf3cb --- /dev/null +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java @@ -0,0 +1,80 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ConfigurableWebApplicationContext; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +public final class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + AwsProxyRequest, + AwsProxyResponse, + AwsProxyHttpServletRequest, + SpringLambdaContainerHandler, + SpringProxyHandlerBuilder> { + private ConfigurableWebApplicationContext springContext; + private Class[] configurationClasses; + private String[] profiles; + + @Override + protected SpringProxyHandlerBuilder self() { + return this; + } + + + public SpringProxyHandlerBuilder springApplicationContext(ConfigurableWebApplicationContext app) { + springContext = app; + return self(); + } + + public SpringProxyHandlerBuilder configurationClasses(Class... config) { + configurationClasses = config; + return self(); + } + + public SpringProxyHandlerBuilder profiles(String... profiles) { + this.profiles = profiles; + return self(); + } + + @Override + public SpringLambdaContainerHandler build() throws ContainerInitializationException { + validate(); + if (springContext == null && (configurationClasses == null || configurationClasses.length == 0)) { + throw new ContainerInitializationException("Missing both configuration classes and application context, at least" + + " one of the two must be populated", null); + } + ConfigurableWebApplicationContext ctx = springContext; + if (ctx == null) { + ctx = new AnnotationConfigWebApplicationContext(); + if (configurationClasses != null) { + ((AnnotationConfigWebApplicationContext)ctx).register(configurationClasses); + } + } + + SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>( + requestTypeClass, + responseTypeClass, + requestReader, + responseWriter, + securityContextWriter, + exceptionHandler, + ctx, + initializationWrapper + ); + if (profiles != null) { + handler.activateSpringProfiles(profiles); + } + return handler; + } + + @Override + public SpringLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringLambdaContainerHandler handler = build(); + initializationWrapper.start(handler); + return handler; + } +} diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index c111b2c8..b6f6973c 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -62,26 +62,6 @@ public static SpringBootLambdaContainerHandler getInstance() { return instance; } - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer) - throws ContainerInitializationException { - SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer); - newHandler.initialize(); - return newHandler; - } - /** * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles * @param springBootInitializer {@code SpringBootServletInitializer} class @@ -91,17 +71,12 @@ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) throws ContainerInitializationException { - SpringBootLambdaContainerHandler newHandler = new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer); - newHandler.activateSpringProfiles(profiles); - newHandler.initialize(); - return newHandler; + return new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); } /** @@ -121,15 +96,16 @@ public SpringBootLambdaContainerHandler(Class requestTypeClass, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, - Class springBootInitializer) - throws ContainerInitializationException { + Class springBootInitializer, + InitializationWrapper init) { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); + Timer.start("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); initialized = false; this.springBootInitializer = springBootInitializer; + setInitializationWrapper(init); SpringBootLambdaContainerHandler.setInstance(this); - Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); + Timer.stop("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); } // this is not pretty. However, because SpringBoot wants to control all of the initialization @@ -153,26 +129,24 @@ protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest @Override protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { // this method of the AwsLambdaServletContainerHandler sets the servlet context - Timer.start("SPRINGBOOT_HANDLE_REQUEST"); + Timer.start("SPRINGBOOT2_HANDLE_REQUEST"); // wire up the application context on the first invocation if (!initialized) { initialize(); } - containerRequest.setServletContext(getServletContext()); - // process filters & invoke servlet Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); doFilter(containerRequest, containerResponse, reqServlet); - Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); + Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } @Override public void initialize() throws ContainerInitializationException { - Timer.start("SPRINGBOOT_COLD_START"); + Timer.start("SPRINGBOOT2_COLD_START"); SpringApplication app = new SpringApplication(getEmbeddedContainerClasses()); if (springProfiles != null && springProfiles.length > 0) { @@ -184,7 +158,7 @@ public void initialize() app.run(); initialized = true; - Timer.stop("SPRINGBOOT_COLD_START"); + Timer.stop("SPRINGBOOT2_COLD_START"); } private Class[] getEmbeddedContainerClasses() { diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java new file mode 100644 index 00000000..943cc69f --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -0,0 +1,62 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; + +public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + AwsProxyRequest, + AwsProxyResponse, + AwsProxyHttpServletRequest, + SpringBootLambdaContainerHandler, + SpringBootProxyHandlerBuilder> { + private Class springBootInitializer; + private String[] profiles; + + @Override + protected SpringBootProxyHandlerBuilder self() { + return this; + } + + + public SpringBootProxyHandlerBuilder springBootApplication(Class app) { + springBootInitializer = app; + return self(); + } + + public SpringBootProxyHandlerBuilder profiles(String... profiles) { + this.profiles = profiles; + return self(); + } + + @Override + public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { + validate(); + if (springBootInitializer == null) { + throw new ContainerInitializationException("Missing spring boot application class in builder", null); + } + SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( + requestTypeClass, + responseTypeClass, + requestReader, + responseWriter, + securityContextWriter, + exceptionHandler, + springBootInitializer, + initializationWrapper + ); + if (profiles != null) { + handler.activateSpringProfiles(profiles); + } + return handler; + } + + @Override + public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringBootLambdaContainerHandler handler = build(); + initializationWrapper.start(handler); + return handler; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/ServletAppTest.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/WebFluxAppTest.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java similarity index 94% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index 60412ec1..e9b9cfb1 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.SyncInitializationWrapper; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; @@ -25,7 +26,8 @@ public class ServerlessServletEmbeddedServerFactoryTest { new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), - null + null, + new SyncInitializationWrapper() ); public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/LambdaHandler.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/MessageController.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java new file mode 100644 index 00000000..a85851b8 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -0,0 +1,13 @@ +package com.amazonaws.servlerss.proxy.spring.servletapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class +}) +public class ServletApplication extends SpringBootServletInitializer { +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/LambdaHandler.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/MessageController.java rename to aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java new file mode 100644 index 00000000..b3f14a0e --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -0,0 +1,12 @@ +package com.amazonaws.servlerss.proxy.spring.webfluxapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.reactive.config.EnableWebFlux; + +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class +}) +public class WebFluxTestApplication { +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java deleted file mode 100644 index c7050f1b..00000000 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/servletapp/ServletApplication.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.amazonaws.servlerss.proxy.spring.servletapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; - -@SpringBootApplication -public class ServletApplication extends SpringBootServletInitializer { -} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java deleted file mode 100644 index ec06ac4d..00000000 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/servlerss/proxy/spring/webfluxapp/WebFluxTestApplication.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.amazonaws.servlerss.proxy.spring.webfluxapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.web.reactive.config.EnableWebFlux; - -@SpringBootApplication -public class WebFluxTestApplication { -} From e87a86e11b65e71db42f7b476245798c5c91621e Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 25 Sep 2019 21:53:24 -0700 Subject: [PATCH 0322/1214] Bug fix in servlet request impl to null-check headers in case Lambda gets sent an event without the multiValueHeaders property (#281). Also moved the ServletContext to be managed by the ServletRequestReader istead of set on each request by the LambdaContainerHandler. Additional bug fix to set the correct dispatcher type when startAsync is called on the request --- .../servlet/AwsProxyHttpServletRequest.java | 18 +++++++----------- .../AwsProxyHttpServletRequestReader.java | 8 +++++++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 83e99c74..eb5d9025 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -31,13 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.AsyncContext; -import javax.servlet.ReadListener; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.*; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -119,10 +114,6 @@ public void setResponse(AwsHttpServletResponse response) { this.response = response; } - public AwsLambdaServletContainerHandler getContainerHandler() { - return containerHandler; - } - public void setContainerHandler(AwsLambdaServletContainerHandler containerHandler) { this.containerHandler = containerHandler; } @@ -380,6 +371,9 @@ public String getCharacterEncoding() { @Override public void setCharacterEncoding(String s) throws UnsupportedEncodingException { + if (request.getMultiValueHeaders() == null) { + request.setMultiValueHeaders(new Headers()); + } String currentContentType = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (currentContentType == null || "".equals(currentContentType)) { log.debug("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); @@ -679,6 +673,7 @@ public boolean isAsyncSupported() { public AsyncContext startAsync() throws IllegalStateException { asyncContext = new AwsAsyncContext(this, response, containerHandler); + setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; } @@ -688,6 +683,7 @@ public AsyncContext startAsync() public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 6b687fb8..405ae973 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; +import javax.servlet.ServletContext; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; @@ -27,11 +28,15 @@ */ public class AwsProxyHttpServletRequestReader extends RequestReader { static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer"; - + private ServletContext servletContext; //------------------------------------------------------------- // Methods - Implementation //------------------------------------------------------------- + public void setServletContext(ServletContext ctx) { + servletContext = ctx; + } + @Override public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException { @@ -48,6 +53,7 @@ public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityC request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, getContentTypeWithCharset(contentType, config)); } AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(request, lambdaContext, securityContext, config); + servletRequest.setServletContext(servletContext); servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, request.getRequestContext()); servletRequest.setAttribute(API_GATEWAY_STAGE_VARS_PROPERTY, request.getStageVariables()); servletRequest.setAttribute(API_GATEWAY_EVENT_PROPERTY, request); From a4b9ab072d332a64155097645cff61f1a7b81349 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 25 Sep 2019 21:53:58 -0700 Subject: [PATCH 0323/1214] Lots of new integration tests for springboot2 support --- .../proxy/spring/SpringBootAppTest.java | 52 ++++++++++++++++ .../spring/echoapp/EchoSpringAppConfig.java | 17 +++--- .../spring/springbootapp/TestController.java | 16 +++-- .../pom.xml | 20 +++++- .../proxy/spring/SecurityAppTest.java | 46 ++++++++++++++ .../proxy/spring/ServletAppTest.java | 9 +-- .../serverless/proxy/spring/SlowAppTest.java | 33 ++++++++++ .../proxy/spring/WebFluxAppTest.java | 9 +-- ...rlessServletEmbeddedServerFactoryTest.java | 9 ++- .../spring/securityapp/LambdaHandler.java | 26 ++++++++ .../spring/securityapp/MessageController.java | 16 +++++ .../spring/securityapp/SecurityConfig.java | 61 +++++++++++++++++++ .../securityapp/ServletApplication.java | 13 ++++ .../spring/servletapp/LambdaHandler.java | 3 +- .../spring/servletapp/MessageController.java | 2 +- .../spring/servletapp/ServletApplication.java | 2 +- .../proxy/spring/slowapp/LambdaHandler.java | 41 +++++++++++++ .../spring/slowapp/MessageController.java | 15 +++++ .../spring/slowapp/SlowTestApplication.java | 24 ++++++++ .../spring/webfluxapp/LambdaHandler.java | 3 +- .../spring/webfluxapp/MessageController.java | 2 +- .../webfluxapp/WebFluxTestApplication.java | 2 +- 22 files changed, 386 insertions(+), 35 deletions(-) create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 286d69cc..91a559ca 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -6,6 +6,8 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.Headers; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestController; @@ -17,6 +19,8 @@ import javax.ws.rs.core.HttpHeaders; import java.io.IOException; +import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_HEADER_NAME; +import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_QS_NAME; import static org.junit.Assert.*; @@ -34,6 +38,54 @@ public void testMethod_springSecurity_doesNotThrowException() { validateSingleValueModel(resp, TestController.TEST_VALUE); } + @Test + public void testMethod_testRequestFromString_doesNotThrowNpe() throws IOException { + AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString("{\n" + + " \"resource\": \"/missing-params\",\n" + + " \"path\": \"/missing-params\",\n" + + " \"httpMethod\": \"GET\",\n" + + " \"headers\": null,\n" + + " \"multiValueHeaders\": null,\n" + + " \"queryStringParameters\": null,\n" + + " \"multiValueQueryStringParameters\": null,\n" + + " \"pathParameters\": null,\n" + + " \"stageVariables\": null,\n" + + " \"requestContext\": {\n" + + " \"resourcePath\": \"/path/resource\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"path\": \"//path/resource\",\n" + + " \"accountId\": \"accountIdNumber\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"stage\": \"test-invoke-stage\",\n" + + " \"domainPrefix\": \"testPrefix\",\n" + + " \"identity\": {\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"apiKey\": \"test-invoke-api-key\",\n" + + " \"principalOrgId\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"userArn\": \"actual arn\",\n" + + " \"apiKeyId\": \"test-invoke-api-key-id\"\n" + + " }\n" + + " },\n" + + " \"body\": \"{ \\\"Key1\\\": \\\"Value1\\\", \\\"Key2\\\": \\\"Value2\\\", \\\"Key3\\\": \\\"Vaue3\\\" }\",\n" + + " \"isBase64Encoded\": \"false\"\n" + + "}").build(); + + AwsProxyResponse resp = handler.handleRequest(req, context); + assertNotNull(resp); + // Spring identifies the missing header + assertEquals(400, resp.getStatusCode()); + req.setMultiValueHeaders(new Headers()); + req.getMultiValueHeaders().add(CUSTOM_HEADER_NAME, "val"); + resp = handler.handleRequest(req, context); + assertEquals(400, resp.getStatusCode()); + req.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); + req.getMultiValueQueryStringParameters().add(CUSTOM_QS_NAME, "val"); + resp = handler.handleRequest(req, context); + assertEquals(200, resp.getStatusCode()); + } + @Test public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/test2", "GET").build(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index 17e09d92..c32935c7 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -3,6 +3,7 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.InitializationWrapper; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; @@ -10,6 +11,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringProxyHandlerBuilder; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -37,16 +39,11 @@ public class EchoSpringAppConfig { @Bean public SpringLambdaContainerHandler springLambdaContainerHandler() throws ContainerInitializationException { - SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - applicationContext); - handler.setRefreshContext(false); - handler.initialize(); + SpringLambdaContainerHandler handler = new SpringProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springApplicationContext(applicationContext) + .buildAndInitialize(); handler.onStartup(c -> { FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); // update the registration to map to a path diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java index 0357328e..900ce50e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java @@ -7,11 +7,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @@ -27,6 +23,8 @@ public class TestController extends WebSecurityConfigurerAdapter { public static final String TEST_VALUE = "test"; public static final String UTF8_TEST_STRING = "health心跳测试完成。可正常使用"; + public static final String CUSTOM_HEADER_NAME = "X-Custom-Header"; + public static final String CUSTOM_QS_NAME = "qs"; // workaround to address the most annoying issue in the world: https://blog.georgovassilis.com/2015/10/29/spring-mvc-rest-controller-says-406-when-emails-are-part-url-path/ @Configuration @@ -49,6 +47,14 @@ public SingleValueModel testGet() { return value; } + @RequestMapping(path = "/missing-params", method = {RequestMethod.GET}) + public Map testInvalidParameters(@RequestHeader(CUSTOM_HEADER_NAME) String h1, @RequestParam(CUSTOM_QS_NAME) String qsValue) { + Map output = new HashMap<>(); + output.put("header", h1 == null); + output.put("queryString", qsValue == null); + return output; + } + @RequestMapping(path = "/test/{domain}", method = { RequestMethod.GET}) public SingleValueModel testDomainInPath(@PathVariable("domain") String domainName) { SingleValueModel value = new SingleValueModel(); diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index f0a8258a..90134a04 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -18,6 +18,7 @@ 5.1.9.RELEASE + 5.1.6.RELEASE 2.1.8.RELEASE 1.8 @@ -50,7 +51,24 @@ ${springboot.version} true - + + org.springframework.security + spring-security-config + ${springsecurity.version} + test + + + org.springframework.security + spring-security-web + ${springsecurity.version} + test + + + org.jetbrains + annotations + 17.0.0 + compile + diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java new file mode 100644 index 00000000..34a593fd --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java @@ -0,0 +1,46 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.securityapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.securityapp.MessageController; +import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Test; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class SecurityAppTest { + + LambdaHandler handler = new LambdaHandler(); + MockLambdaContext lambdaContext = new MockLambdaContext(); + + public SecurityAppTest() { + System.setProperty("logging.level.root", "DEBUG"); + } + + @Test + public void helloRequest_withAuth_respondsWithSingleMessage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(401, resp.getStatusCode()); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.WWW_AUTHENTICATE)); + req = new AwsProxyRequestBuilder("/hello", "GET") + .basicAuth(SecurityConfig.USERNAME, SecurityConfig.PASSWORD) + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .build(); + resp = handler.handleRequest(req, lambdaContext); + assertEquals(200, resp.getStatusCode()); + } + + public void helloRequest_withoutAuith_respondsWithError() { + + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index b7353cd8..4d5797e5 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -1,11 +1,12 @@ -package com.amazonaws.servlerss.proxy.spring; +package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.servlerss.proxy.spring.servletapp.LambdaHandler; -import com.amazonaws.servlerss.proxy.spring.servletapp.MessageController; +import com.amazonaws.serverless.proxy.spring.servletapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.servletapp.MessageController; +import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -19,6 +20,6 @@ public class ServletAppTest { public void helloRequest_respondsWithSingleMessage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java new file mode 100644 index 00000000..8dabc5f6 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -0,0 +1,33 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.slowapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.slowapp.MessageController; +import com.amazonaws.serverless.proxy.spring.slowapp.SlowTestApplication; +import org.junit.Assert; +import org.junit.Test; + +import java.time.Instant; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class SlowAppTest { + + @Test + public void slowAppInit_continuesInBackgroundThread_returnsCorrect() { + LambdaHandler slowApp = new LambdaHandler(); + System.out.println("Start time: " + slowApp.getConstructorTime()); + assertTrue(slowApp.getConstructorTime() < 10_000); + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + long startRequestTime = Instant.now().toEpochMilli(); + AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); + long endRequestTime = Instant.now().toEpochMilli(); + assertTrue(endRequestTime - startRequestTime > SlowTestApplication.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); + assertEquals(200, resp.getStatusCode()); + Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java index ffdb98e4..7148e3b6 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java @@ -1,11 +1,12 @@ -package com.amazonaws.servlerss.proxy.spring; +package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.servlerss.proxy.spring.webfluxapp.LambdaHandler; -import com.amazonaws.servlerss.proxy.spring.webfluxapp.MessageController; +import com.amazonaws.serverless.proxy.spring.webfluxapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageController; +import org.junit.Assert; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -19,7 +20,7 @@ public class WebFluxAppTest { public void helloRequest_respondsWithSingleMessage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/single", "GET").build(); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals(MessageController.MESSAGE, resp.getBody()); + Assert.assertEquals(MessageController.MESSAGE, resp.getBody()); } @Test diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index e9b9cfb1..010bcbdc 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -1,15 +1,14 @@ -package com.amazonaws.servlerss.proxy.spring.embedded; +package com.amazonaws.serverless.proxy.spring.embedded; import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.SyncInitializationWrapper; +import com.amazonaws.serverless.proxy.InitializationWrapper; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import org.junit.Test; import org.springframework.boot.web.servlet.ServletContextInitializer; @@ -19,7 +18,7 @@ import static org.junit.Assert.fail; public class ServerlessServletEmbeddedServerFactoryTest { - private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( + private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), @@ -27,7 +26,7 @@ public class ServerlessServletEmbeddedServerFactoryTest { new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), null, - new SyncInitializationWrapper() + new InitializationWrapper() ); public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java new file mode 100644 index 00000000..75dc158a --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java @@ -0,0 +1,26 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(ServletApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java new file mode 100644 index 00000000..c1d3f157 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java @@ -0,0 +1,16 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) + public String hello() { + System.out.println("Invoke hello"); + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java new file mode 100644 index 00000000..128ae3dd --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java @@ -0,0 +1,61 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.security.SecurityProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.server.SecurityWebFilterChain; + +@Configuration +@EnableWebFluxSecurity +public class SecurityConfig { + public static final String USERNAME = "user"; + public static String PASSWORD = "testPassword"; + public static BCryptPasswordEncoder pEncoder = new BCryptPasswordEncoder(); + + @Bean + public SecurityWebFilterChain securitygWebFilterChain( + ServerHttpSecurity http) { + return http.authorizeExchange() + .anyExchange().authenticated() + .and().httpBasic() + .and().build(); + } + + @Bean + public MapReactiveUserDetailsService reactiveUserDetailsService(SecurityProperties properties, ObjectProvider passwordEncoder) { + return new MapReactiveUserDetailsService(getUser()); + } + + private UserDetails getUser() { + return User.builder().username(USERNAME).password(passwordEncoder().encode(PASSWORD)).authorities("USER").build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return pEncoder; + } + + /*@Autowired + public void configureGlobal(AuthenticationManagerBuilder authentication) + throws Exception + { + authentication.inMemoryAuthentication() + .withUser(USERNAME) + .password(passwordEncoder().encode(PASSWORD)) + .authorities("ROLE_USER"); + if (userService != null) { + if (userService.loadUserByUsername("user") != null) { + System.out.println("Setting password in configureGlobal"); + PASSWORD = userService.loadUserByUsername("user").getPassword().replace("{noop}", ""); + } + } + }*/ +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java new file mode 100644 index 00000000..2f1def12 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java @@ -0,0 +1,13 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; +import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; + +@SpringBootApplication() +public class ServletApplication { +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java index c6b4e0b7..7faf9b1b 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java @@ -1,6 +1,7 @@ -package com.amazonaws.servlerss.proxy.spring.servletapp; +package com.amazonaws.serverless.proxy.spring.servletapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index 48731347..937b2432 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -1,4 +1,4 @@ -package com.amazonaws.servlerss.proxy.spring.servletapp; +package com.amazonaws.serverless.proxy.spring.servletapp; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java index a85851b8..927dd6ce 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -1,4 +1,4 @@ -package com.amazonaws.servlerss.proxy.spring.servletapp; +package com.amazonaws.serverless.proxy.spring.servletapp; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java new file mode 100644 index 00000000..bd696a99 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java @@ -0,0 +1,41 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +import java.time.Instant; + +public class LambdaHandler implements RequestHandler { + private SpringBootLambdaContainerHandler handler; + private long constructorTime; + + public LambdaHandler() { + try { + long startTime = Instant.now().toEpochMilli(); + System.out.println("startCall: " + startTime); + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .asyncInit(startTime) + .springBootApplication(SlowTestApplication.class) + .buildAndInitialize(); + constructorTime = Instant.now().toEpochMilli() - startTime; + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + public long getConstructorTime() { + return constructorTime; + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java new file mode 100644 index 00000000..098e8e7d --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java @@ -0,0 +1,15 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java new file mode 100644 index 00000000..b3fe177a --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java @@ -0,0 +1,24 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.stereotype.Component; + +import java.time.Instant; + +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class +}) +public class SlowTestApplication { + + @Component + public static class SlowDownInit implements InitializingBean { + public static final int INIT_SLEEP_TIME_MS = 13_000; + + @Override + public void afterPropertiesSet() throws Exception { + Thread.sleep(INIT_SLEEP_TIME_MS); + } + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java index 60dcbd4a..913da5bb 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java @@ -1,6 +1,7 @@ -package com.amazonaws.servlerss.proxy.spring.webfluxapp; +package com.amazonaws.serverless.proxy.spring.webfluxapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java index a507ff97..65ce0786 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java @@ -1,4 +1,4 @@ -package com.amazonaws.servlerss.proxy.spring.webfluxapp; +package com.amazonaws.serverless.proxy.spring.webfluxapp; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java index b3f14a0e..04d48ff3 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -1,4 +1,4 @@ -package com.amazonaws.servlerss.proxy.spring.webfluxapp; +package com.amazonaws.serverless.proxy.spring.webfluxapp; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; From a007be98c308617918b9b0f0eff040c07b175425 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 11:59:37 -0700 Subject: [PATCH 0324/1214] Renamed Reactive embedded server class to clarify that it still relies on the Servlet specs --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 6 +++--- ... => ServerlessReactiveServletEmbeddedServerFactory.java} | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/{ServerlessReactiveEmbeddedServerFactory.java => ServerlessReactiveServletEmbeddedServerFactory.java} (95%) diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index b6f6973c..d1debcea 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -18,7 +18,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; @@ -54,7 +54,7 @@ public class SpringBootLambdaContainerHandler extends * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it - * for our mock {@link com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory}. + * for our mock {@link ServerlessReactiveServletEmbeddedServerFactory}. * * @return The initialized instance */ @@ -167,7 +167,7 @@ private Class[] getEmbeddedContainerClasses() { // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); - classes[0] = ServerlessReactiveEmbeddedServerFactory.class; + classes[0] = ServerlessReactiveServletEmbeddedServerFactory.class; } catch (ClassNotFoundException e) { classes[0] = ServerlessServletEmbeddedServerFactory.class; } diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java similarity index 95% rename from aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java rename to aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java index 94a9d207..7fa366dd 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveEmbeddedServerFactory.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java @@ -15,7 +15,7 @@ import java.util.Enumeration; @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) -public class ServerlessReactiveEmbeddedServerFactory extends AbstractReactiveWebServerFactory implements WebServer, Servlet { +public class ServerlessReactiveServletEmbeddedServerFactory extends AbstractReactiveWebServerFactory implements WebServer, Servlet { private ServletHttpHandlerAdapter handler; private ServletConfig config; static final String SERVLET_NAME = "com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory"; From 1d3456763f32fda30c065637d3c3f2517f32a16b Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 12:44:07 -0700 Subject: [PATCH 0325/1214] Added comment explaining async initializer in springboot 2 archetyoe --- .../src/main/java/StreamLambdaHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index e022540c..ba15c6d6 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -18,6 +18,13 @@ public class StreamLambdaHandler implements RequestStreamHandler { static { try { handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + // For applications that take longer than 10 seconds to start, use the async builder: + // long startTime = Instant.now().toEpochMilli(); + // handler = new SpringBootProxyHandlerBuilder() + // .defaultProxy() + // .asyncInit(startTime) + // .springBootApplication(Application.class) + // .buildAndInitialize(); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); From 50b76dffb190a9fe3464a640b4caf7bca862d292 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 14:37:52 -0700 Subject: [PATCH 0326/1214] Bump Jersey version to address #266 --- aws-serverless-java-container-jersey/pom.xml | 8 +++++++- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 80a21388..6a0dc711 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.27 + 2.29.1 @@ -46,6 +46,12 @@ ${jersey.version} true test + + + jakarta.annotation + jakarta.annotation-api + +
diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index fd34a171..dcb7a596 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,7 @@ 1.8 1.8 - 2.27 + 2.29.1 2.9.9.3 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index ddf808ce..2ac418cd 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.27 + 2.29.1 From 5434a8fa76d9881622a5a4b2b81eecc152adff70 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 14:57:49 -0700 Subject: [PATCH 0327/1214] Bump Spring version --- aws-serverless-java-container-spring/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8862e478..11eb7ad3 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 5.1.8.RELEASE + 5.1.9.RELEASE 1.5.21.RELEASE 5.1.5.RELEASE 2.9.9.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index f9c2ee98..a6a574c8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.1.1.RELEASE + 5.1.9.RELEASE 4.12 2.8.2 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 1f60ce0b..d25d1dc0 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.1.1.RELEASE + 5.1.9.RELEASE 4.12 2.8.2 From 39756cd11d7796e89436ebb3af7ed83e0a8c6ace Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 15:02:27 -0700 Subject: [PATCH 0328/1214] Bump spring boot version --- aws-serverless-java-container-spring/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot/pet-store/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 11eb7ad3..eef76640 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 5.1.9.RELEASE - 1.5.21.RELEASE + 1.5.22.RELEASE 5.1.5.RELEASE 2.9.9.3 diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml index e0ee7b74..f3a4a650 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.17.RELEASE + 1.5.22.RELEASE diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index 51f177e5..639b927a 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.17.RELEASE + 1.5.22.RELEASE From 8e70836b352114c719a75629498de2a7952fd601 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 15:05:06 -0700 Subject: [PATCH 0329/1214] Updated SpringBoot 2 sample to latest code --- .../serverless/sample/springboot2/Application.java | 2 +- .../sample/springboot2/StreamLambdaHandler.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java index e49b1f6d..d613fc07 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java @@ -21,7 +21,7 @@ @SpringBootApplication @Import({ PetsController.class }) -public class Application extends SpringBootServletInitializer { +public class Application { // silence console logging @Value("${logging.level.root:OFF}") diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java index cecee6db..0b7cf554 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java @@ -25,6 +25,14 @@ public class StreamLambdaHandler implements RequestStreamHandler { try { handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + // For applications that take longer than 10 seconds to start, use the async builder: + // long startTime = Instant.now().toEpochMilli(); + // handler = new SpringBootProxyHandlerBuilder() + // .defaultProxy() + // .asyncInit(startTime) + // .springBootApplication(Application.class) + // .buildAndInitialize(); + // we use the onStartup method of the handler to register our custom filter handler.onStartup(servletContext -> { FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); From bf87475100a05101efba4e0f1b7623e13df82205 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 15:27:39 -0700 Subject: [PATCH 0330/1214] Bump jackson version and moved dependency version management to property in main pom --- aws-serverless-java-container-core/pom.xml | 3 +-- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 1 - aws-serverless-java-container-struts2/pom.xml | 1 - .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 1 + samples/jersey/pet-store/pom.xml | 3 ++- samples/spark/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 5 ++--- 10 files changed, 10 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f5fafe2e..c893a4f6 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,6 @@ - 2.9.9.3 2.1 3.1.0 @@ -54,7 +53,7 @@ com.fasterxml.jackson.module jackson-module-afterburner - 2.9.9 + ${jackson.version} com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 6a0dc711..16421124 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -66,7 +66,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9.3 + ${jackson.version} true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eef76640..5d84ed55 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -19,7 +19,6 @@ 5.1.9.RELEASE 1.5.22.RELEASE 5.1.5.RELEASE - 2.9.9.3 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e414eab5..e7537b43 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,6 @@ 2.5.20 - 2.9.9.3 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index dcb7a596..3282eb25 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.29.1 - 2.9.9.3 + 2.9.10 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 6d8db992..86d63cf2 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.9.9.3 + 2.9.10 2.8.0 diff --git a/pom.xml b/pom.xml index 203dd981..c8ecf082 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ 0.7 5.1.0 + 2.9.10 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 2ac418cd..bd319546 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,6 +27,7 @@ 1.8 1.8 2.29.1 + 2.9.10 @@ -77,7 +78,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9.3 + ${jackson.version} diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index e71a773b..9c0bd8d2 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.9.3 + 2.9.10 2.8.0 diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 2cff49e5..80c66879 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,8 +27,7 @@ 1.8 1.8 2.5.20 - 2.9.9 - 2.9.9.3 + 2.9.10 4.12 2.11.1 @@ -98,7 +97,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson-databind.version} + ${jackson.version} From ea3fb4b4b2f9029d636e16db2109022326315532 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 15:50:46 -0700 Subject: [PATCH 0331/1214] Bump various versions of dependencies in gradle build files (I always forget them) --- .../main/resources/archetype-resources/build.gradle | 6 +++--- .../main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 6 +++--- .../main/resources/archetype-resources/build.gradle | 2 +- .../main/resources/archetype-resources/build.gradle | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- samples/jersey/pet-store/build.gradle | 6 +++--- samples/spark/pet-store/build.gradle | 4 ++-- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/springboot/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/build.gradle | 2 +- 14 files changed, 29 insertions(+), 29 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index eda69dc9..e9324e09 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,17 +9,17 @@ dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'io.symphonia:lambda-logging:1.0.1' ) - compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.27") { + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.29.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - compile("org.glassfish.jersey.inject:jersey-hk2:2.27") { + compile("org.glassfish.jersey.inject:jersey-hk2:2.29.1") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index ace7a6b3..f4e280ce 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,9 +7,9 @@ repositories { dependencies { compile ( - 'com.sparkjava:spark-core:2.8.0', + 'com.sparkjava:spark-core:2.9.1', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 86d63cf2..055fc432 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 2.9.10 - 2.8.0 + 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index ec235eba..e67eb52e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,13 +7,13 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.1.1.RELEASE', - 'org.springframework:spring-context:5.1.1.RELEASE', + 'org.springframework:spring-webmvc:5.1.9.RELEASE', + 'org.springframework:spring-context:5.1.9.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle index 88c7d62f..53c675de 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '1.5.17.RELEASE' + id 'org.springframework.boot' version '1.5.22.RELEASE' } apply plugin: 'java' diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index e48a0dc9..e85ac40d 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,7 +11,7 @@ repositories { dependencies { compile ( - 'org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE', + 'org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 41046f45..ee08f5d4 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,13 +8,13 @@ repositories { dependencies { compile ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.17', - 'org.apache.struts:struts2-rest-plugin:2.5.17', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.17', - 'org.apache.struts:struts2-junit-plugin:2.5.17', + 'org.apache.struts:struts2-convention-plugin:2.5.20', + 'org.apache.struts:struts2-rest-plugin:2.5.20', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.20', + 'org.apache.struts:struts2-junit-plugin:2.5.20', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 3e9e9762..c719ba13 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,17 +9,17 @@ dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'io.symphonia:lambda-logging:1.0.1' ) - compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.27") { + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.29.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - compile("org.glassfish.jersey.inject:jersey-hk2:2.27") { + compile("org.glassfish.jersey.inject:jersey-hk2:2.29.1") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 681dd4df..6b6c7012 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -7,9 +7,9 @@ repositories { dependencies { compile ( - 'com.sparkjava:spark-core:2.8.0', + 'com.sparkjava:spark-core:2.9.1', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'io.symphonia:lambda-logging:1.0.1' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 9c0bd8d2..1b1a370d 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.9.10 - 2.8.0 + 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 73e18d96..7d7a74c4 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,13 +7,13 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.1.1.RELEASE', - 'org.springframework:spring-context:5.1.1.RELEASE', + 'org.springframework:spring-webmvc:5.1.9.RELEASE', + 'org.springframework:spring-context:5.1.9.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) } diff --git a/samples/springboot/pet-store/build.gradle b/samples/springboot/pet-store/build.gradle index 1c5e5d48..53295266 100644 --- a/samples/springboot/pet-store/build.gradle +++ b/samples/springboot/pet-store/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '1.5.17.RELEASE' + id 'org.springframework.boot' version '1.5.22.RELEASE' } apply plugin: 'java' diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 7a9c8b9f..65826e90 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.springframework.boot' version '2.1.1.RELEASE' + id 'org.springframework.boot' version '2.1.8.RELEASE' } apply plugin: 'java' @@ -11,7 +11,7 @@ repositories { dependencies { compile ( - implementation('org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE') { + implementation('org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 829ca79b..9f2ccf09 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.20', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.1.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.8', + 'com.fasterxml.jackson.core:jackson-databind:2.9.10', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', From 96bc2f597ad017984799cc1bf100895a6b1282eb Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 20:52:12 -0700 Subject: [PATCH 0332/1214] Added latch countdown on exception to address a potential leak in the implementation of #273 --- .../serverless/proxy/internal/LambdaContainerHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 1e9bfaa8..3bb401d1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -195,9 +195,9 @@ public void setLogFormatter(LogFormatter Date: Thu, 26 Sep 2019 21:23:30 -0700 Subject: [PATCH 0333/1214] Basic implementation of createListener in async context --- .../proxy/internal/servlet/AwsAsyncContext.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index daab77e3..906bc6fc 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -91,7 +91,7 @@ public void complete() { @Override public void start(Runnable runnable) { - throw new UnsupportedOperationException("Cannot start background tasks"); + throw new UnsupportedOperationException("Operation not supported"); } @Override @@ -109,7 +109,11 @@ public void addListener(AsyncListener asyncListener, ServletRequest servletReque @Override public T createListener(Class aClass) throws ServletException { - return null; + try { + return aClass.newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + throw new ServletException(e); + } } @Override From 4fec44933fcc61a46a58de48ccd8886089fcc9e7 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 26 Sep 2019 22:06:06 -0700 Subject: [PATCH 0334/1214] Attempting to replicate cookie issue reported in #274 --- .../serverless/proxy/spark/HelloWorldSparkTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 4e09a35d..108eeabe 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -35,6 +35,8 @@ public class HelloWorldSparkTest { private static final String COOKIE_DOMAIN = "mydomain.com"; private static final String COOKIE_PATH = "/"; + private static final String READ_COOKIE_NAME = "customCookie"; + private static SparkLambdaContainerHandler handler; private boolean isAlb; @@ -122,6 +124,13 @@ public void rootResource_basicRequest_expectSuccess() { assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } + @Test + public void readCookie_customDomainName_expectValidCookie() { + AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie-read").cookie(READ_COOKIE_NAME, "test").build(); + AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); + assertEquals("test", response.getBody()); + } + private static void configureRoutes() { get("/", (req, res) -> { res.status(200); @@ -154,5 +163,7 @@ private static void configureRoutes() { res.raw().addCookie(testCookie2); return BODY_TEXT_RESPONSE; }); + + get("/cookie-read", (req, res) -> req.cookie(READ_COOKIE_NAME)); } } From ae6fd4fd1e3fed751b7d6713d2db2830e061c5ee Mon Sep 17 00:00:00 2001 From: sapessi Date: Fri, 27 Sep 2019 08:34:54 -0700 Subject: [PATCH 0335/1214] Added slow init tests for Spring and SpringBoot 1.x applications that use the asyn initialization wrapper (#210) --- .../serverless/proxy/spring/SlowAppTest.java | 60 +++++++++++++++++++ .../springbootslowapp/MessageController.java | 15 +++++ .../springbootslowapp/SBLambdaHandler.java | 40 +++++++++++++ .../springbootslowapp/TestApplication.java | 25 ++++++++ .../spring/springslowapp/LambdaHandler.java | 35 +++++++++++ .../springslowapp/MessageController.java | 15 +++++ .../spring/springslowapp/SlowAppConfig.java | 20 +++++++ 7 files changed, 210 insertions(+) create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java new file mode 100644 index 00000000..2d149590 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -0,0 +1,60 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.springbootslowapp.SBLambdaHandler; +import com.amazonaws.serverless.proxy.spring.springslowapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.springslowapp.MessageController; +import com.amazonaws.serverless.proxy.spring.springslowapp.SlowAppConfig; +import org.junit.Assert; +import org.junit.Test; + +import java.time.Instant; + +import static org.junit.Assert.*; + +public class SlowAppTest { + + @Test + public void springSlowApp_continuesInBackgroundThread_returnsCorrect() { + LambdaHandler slowApp = null; + try { + slowApp = new LambdaHandler(); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail("Exception during initialization"); + } + System.out.println("Start time: " + slowApp.getConstructorTime()); + assertTrue(slowApp.getConstructorTime() < 10_000); + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + long startRequestTime = Instant.now().toEpochMilli(); + AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); + long endRequestTime = Instant.now().toEpochMilli(); + assertTrue(endRequestTime - startRequestTime > SlowAppConfig.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); + assertEquals(200, resp.getStatusCode()); + Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + + @Test + public void springBootSlowApp_continuesInBackgroundThread_returnsCorrect() { + SBLambdaHandler slowApp = null; + try { + slowApp = new SBLambdaHandler(); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail("Exception during initialization"); + } + System.out.println("Start time: " + slowApp.getConstructorTime()); + assertTrue(slowApp.getConstructorTime() < 10_000); + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + long startRequestTime = Instant.now().toEpochMilli(); + AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); + long endRequestTime = Instant.now().toEpochMilli(); + assertTrue(endRequestTime - startRequestTime > SlowAppConfig.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); + assertEquals(200, resp.getStatusCode()); + Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java new file mode 100644 index 00000000..20dda417 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java @@ -0,0 +1,15 @@ +package com.amazonaws.serverless.proxy.spring.springbootslowapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java new file mode 100644 index 00000000..64a399a2 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java @@ -0,0 +1,40 @@ +package com.amazonaws.serverless.proxy.spring.springbootslowapp; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +import java.time.Instant; + + +public class SBLambdaHandler + implements RequestHandler +{ + SpringBootLambdaContainerHandler handler; + private long constructorTime; + + public SBLambdaHandler() throws ContainerInitializationException { + long startTime = Instant.now().toEpochMilli(); + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .asyncInit(startTime) + .springBootApplication(TestApplication.class) + .buildAndInitialize(); + constructorTime = Instant.now().toEpochMilli() - startTime; + } + + public long getConstructorTime() { + return constructorTime; + } + + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) + { + return handler.proxy(awsProxyRequest, context); + } +} + diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java new file mode 100644 index 00000000..d55fc30c --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java @@ -0,0 +1,25 @@ +package com.amazonaws.serverless.proxy.spring.springbootslowapp; + + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + + +@SpringBootApplication +@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootslowapp") +@PropertySource("classpath:boot-application.properties") +public class TestApplication extends SpringBootServletInitializer { + @Component + public static class SlowDownInit implements InitializingBean { + public static final int INIT_SLEEP_TIME_MS = 13_000; + + @Override + public void afterPropertiesSet() throws Exception { + Thread.sleep(INIT_SLEEP_TIME_MS); + } + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java new file mode 100644 index 00000000..b61a7191 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java @@ -0,0 +1,35 @@ +package com.amazonaws.serverless.proxy.spring.springslowapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +import java.time.Instant; + +public class LambdaHandler implements RequestHandler { + private SpringLambdaContainerHandler handler; + private long constructorTime; + + public LambdaHandler() throws ContainerInitializationException { + long startTime = Instant.now().toEpochMilli(); + handler = new SpringProxyHandlerBuilder() + .defaultProxy() + .asyncInit(startTime) + .configurationClasses(SlowAppConfig.class) + .buildAndInitialize(); + constructorTime = Instant.now().toEpochMilli() - startTime; + } + + public long getConstructorTime() { + return constructorTime; + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java new file mode 100644 index 00000000..85bce73a --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java @@ -0,0 +1,15 @@ +package com.amazonaws.serverless.proxy.spring.springslowapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java new file mode 100644 index 00000000..1b8eec18 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.proxy.spring.springslowapp; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.stereotype.Component; + +@Configuration +@Import({MessageController.class}) +public class SlowAppConfig { + @Component + public static class SlowDownInit implements InitializingBean { + public static final int INIT_SLEEP_TIME_MS = 13_000; + + @Override + public void afterPropertiesSet() throws Exception { + Thread.sleep(INIT_SLEEP_TIME_MS); + } + } +} From 3d0570028a0dc07aa4445b2fc4389180a2366ab9 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sat, 28 Sep 2019 16:26:47 -0700 Subject: [PATCH 0336/1214] Implementation of isAsyncStarted in proxy request was missing --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index eb5d9025..2c54816d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -668,6 +668,11 @@ public boolean isAsyncSupported() { return true; } + @Override + public boolean isAsyncStarted() { + return asyncContext != null; + } + @Override public AsyncContext startAsync() From 02792504b45697d315232216247446ffff46ec83 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sat, 28 Sep 2019 16:27:37 -0700 Subject: [PATCH 0337/1214] Fix on request dispatcher to maintain compatibility with spring 4.3.x and test fixes for older spring --- .../internal/servlet/AwsProxyRequestDispatcher.java | 4 ---- .../spring/springbootslowapp/TestApplication.java | 11 ++++++----- .../proxy/spring/springslowapp/MessageController.java | 2 ++ .../proxy/spring/springslowapp/SlowAppConfig.java | 2 ++ 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index da1c6d38..2ffcc97d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -39,10 +39,6 @@ public class AwsProxyRequestDispatcher implements RequestDispatcher { public AwsProxyRequestDispatcher(final String target, final boolean namedDispatcher, final AwsLambdaServletContainerHandler handler) { - if (!namedDispatcher && !target.startsWith("/")) { - throw new UnsupportedOperationException("Only dispatchers with absolute paths are supported"); - } - isNamedDispatcher = namedDispatcher; dispatchTo = target; lambdaContainerHandler = handler; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java index d55fc30c..7e9dce5a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java @@ -5,13 +5,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; - -@SpringBootApplication -@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootslowapp") -@PropertySource("classpath:boot-application.properties") +// Need to explicitly exclude security because of some bizarre witchcraft inside SpringBoot that +// enables it even when I don't ask for it - this is only true when I test against spring-webmvc 4.3.x +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class +}) +@ComponentScan(basePackages="com.amazonaws.serverless.proxy.spring.springbootslowapp") public class TestApplication extends SpringBootServletInitializer { @Component public static class SlowDownInit implements InitializingBean { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java index 85bce73a..1c8abd20 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/MessageController.java @@ -3,8 +3,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; @RestController +@EnableWebMvc public class MessageController { public static final String HELLO_MESSAGE = "Hello"; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java index 1b8eec18..d698e30e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/SlowAppConfig.java @@ -5,9 +5,11 @@ import org.springframework.context.annotation.Import; import org.springframework.stereotype.Component; + @Configuration @Import({MessageController.class}) public class SlowAppConfig { + @Component public static class SlowDownInit implements InitializingBean { public static final int INIT_SLEEP_TIME_MS = 13_000; From b96a9f8af9fc8907a9504232c9cbf90403197724 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sat, 28 Sep 2019 22:34:09 -0700 Subject: [PATCH 0338/1214] Fix for async context and setting response in proxy servlet request before processing --- .../proxy/internal/servlet/AwsAsyncContext.java | 15 +++++++++++++++ .../servlet/AwsProxyHttpServletRequest.java | 10 ++++++++-- .../spring/SpringBootLambdaContainerHandler.java | 1 + .../spring/SpringLambdaContainerHandler.java | 1 + .../spring/SpringBootLambdaContainerHandler.java | 1 + 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 906bc6fc..0b35d7ba 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; /** * Async context for Serverless Java Container. This is used to support reactive embedded servers for our support for @@ -23,6 +24,8 @@ public class AwsAsyncContext implements AsyncContext { private AwsLambdaServletContainerHandler handler; private List listeners; private long timeout; + private AtomicBoolean dispatched; + private AtomicBoolean completed; private Logger log = LoggerFactory.getLogger(AwsAsyncContext.class); @@ -33,6 +36,8 @@ public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response, handler = servletHandler; listeners = new ArrayList<>(); timeout = 3000; + dispatched = new AtomicBoolean(false); + completed = new AtomicBoolean(false); } @Override @@ -57,6 +62,7 @@ public void dispatch() { notifyListeners(NotificationType.START_ASYNC, null); Servlet servlet = ((AwsServletContext)handler.getServletContext()).getServletForPath(req.getPathInfo()); handler.doFilter(req, res, servlet); + dispatched.set(true); } catch (ServletException | IOException e) { notifyListeners(NotificationType.ERROR, e); } @@ -83,6 +89,7 @@ public void complete() { log.debug("Completing request"); notifyListeners(NotificationType.COMPLETE, null); res.flushBuffer(); + completed.set(true); } catch (IOException e) { log.error("Could not flush response buffer", e); throw new RuntimeException(e); @@ -126,6 +133,14 @@ public long getTimeout() { return timeout; } + public boolean isDispatched() { + return dispatched.get(); + } + + public boolean isCompleted() { + return completed.get(); + } + private void notifyListeners(NotificationType type, Throwable t) { listeners.forEach((h) -> { try { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 2c54816d..8d58850c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -76,7 +76,7 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private AwsProxyRequest request; private SecurityContext securityContext; - private AsyncContext asyncContext; + private AwsAsyncContext asyncContext; private Map> urlEncodedFormParameters; private Map multipartFormParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); @@ -670,7 +670,13 @@ public boolean isAsyncSupported() { @Override public boolean isAsyncStarted() { - return asyncContext != null; + if (asyncContext == null) { + return false; + } + if (asyncContext.isCompleted() || asyncContext.isDispatched()) { + return false; + } + return true; } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 38994ed3..4cccb0bf 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -142,6 +142,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // process filters & invoke servlet Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + containerRequest.setResponse(containerResponse); doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index c63165a4..5168fa96 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -143,6 +143,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // process filters Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + containerRequest.setResponse(containerResponse); doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRING_HANDLE_REQUEST"); } diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index d1debcea..0a854509 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -138,6 +138,7 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // process filters & invoke servlet Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + containerRequest.setResponse(containerResponse); doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } From aa72b6de6b74d6de7b53eb758b85c0d5f2858426 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sun, 29 Sep 2019 08:12:02 -0700 Subject: [PATCH 0339/1214] Temporarily disable dependency check until the TLS issue that emerged on the night of 9/28 is fixed --- aws-serverless-java-container-core/pom.xml | 1 + aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 1 + aws-serverless-java-container-springboot2/pom.xml | 1 + aws-serverless-java-container-struts2/pom.xml | 1 + pom.xml | 2 +- 7 files changed, 7 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index c893a4f6..bb42cf04 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -197,6 +197,7 @@ ${project.basedir}/../owasp-suppression.xml 7 + false diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 16421124..d53142a8 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -206,7 +206,7 @@ ${project.basedir}/../owasp-suppression.xml 7 - + false diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 8dce826b..c185bec6 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -146,7 +146,7 @@ ${project.basedir}/../owasp-suppression.xml 7 - + false diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5d84ed55..8e6bff69 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -278,6 +278,7 @@ ${project.basedir}/../owasp-suppression.xml 7 + false diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 90134a04..caa07ae3 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -175,6 +175,7 @@ ${project.basedir}/../owasp-suppression.xml 7 + false diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e7537b43..66cfd17a 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -204,6 +204,7 @@ ${project.basedir}/../owasp-suppression.xml 7 + false diff --git a/pom.xml b/pom.xml index c8ecf082..e2e48c5c 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ 0.7 - 5.1.0 + 5.2.2 2.9.10 From 41e37bbe7a9be06216d56f5b84c80429f2a8b439 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sun, 29 Sep 2019 18:34:57 -0700 Subject: [PATCH 0340/1214] Fixed Javadoc comments in SpringBoot 2 implementation --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 0a854509..5b56e58b 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -83,12 +83,13 @@ public static SpringBootLambdaContainerHandler requestTypeClass, Class responseTypeClass, From 453f9a63d2ee4fdd985b5cca0fa1d700a875922d Mon Sep 17 00:00:00 2001 From: sapessi Date: Sun, 29 Sep 2019 18:46:43 -0700 Subject: [PATCH 0341/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.4 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 10 ++++------ aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 13 files changed, 31 insertions(+), 33 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index bb42cf04..9809df0a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d53142a8..116fab3e 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.4 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index c185bec6..5247449d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.4 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8e6bff69..0a8e0aa9 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.4 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index caa07ae3..208640d1 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -1,11 +1,9 @@ - + aws-serverless-java-container com.amazonaws.serverless - 1.4-SNAPSHOT + 1.4 4.0.0 @@ -14,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 5.1.9.RELEASE @@ -30,7 +28,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.4 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 66cfd17a..e64577c0 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4-SNAPSHOT + 1.4 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d89ca75b..e3a311aa 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 65c870e5..12103c93 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 35331470..a96e3dca 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 011cc1a9..3852fad6 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 2ade62df..c48c9dcb 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c3578068..aff9e297 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4-SNAPSHOT + 1.4 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.4-SNAPSHOT + 1.4 maven-archetype diff --git a/pom.xml b/pom.xml index e2e48c5c..0d78c27b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.4-SNAPSHOT + 1.4 AWS Serverless Java container From 11d1f85b2593c47b87052d1b566cce69fc74d4d8 Mon Sep 17 00:00:00 2001 From: sapessi Date: Sun, 29 Sep 2019 18:46:43 -0700 Subject: [PATCH 0342/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot-archetype/pom.xml | 4 ++-- aws-serverless-springboot2-archetype/pom.xml | 4 ++-- aws-serverless-struts2-archetype/pom.xml | 4 ++-- pom.xml | 2 +- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9809df0a..7145733e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 116fab3e..28edd3c9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4 + 1.5-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5247449d..e5200e3f 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4 + 1.5-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 0a8e0aa9..01bab305 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4 + 1.5-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 208640d1..90c98f00 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.4 + 1.5-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT 5.1.9.RELEASE @@ -28,7 +28,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4 + 1.5-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e64577c0..7e456c85 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.4 + 1.5-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e3a311aa..5b2aa801 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 12103c93..0118ea5c 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index a96e3dca..128a51bf 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 3852fad6..a8f66909 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index c48c9dcb..41a98455 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index aff9e297..e309fdd8 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.4 + 1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.4 + 1.5-SNAPSHOT maven-archetype diff --git a/pom.xml b/pom.xml index 0d78c27b..67a3283a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.4 + 1.5-SNAPSHOT AWS Serverless Java container From 63faf2db0205e5319f4faebb58b0d634bd809d3a Mon Sep 17 00:00:00 2001 From: sapessi Date: Sun, 29 Sep 2019 20:18:29 -0700 Subject: [PATCH 0343/1214] Added quickstart link for Spring Boot 2 to main README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 66ffc502..b8baf7bc 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) +* [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From 3ee467a3a123e1b19c3784f6471e5d107fe7b543 Mon Sep 17 00:00:00 2001 From: Stefano Buliani <2996317+sapessi@users.noreply.github.com> Date: Mon, 30 Sep 2019 15:23:36 -0700 Subject: [PATCH 0344/1214] New GitHub Actions build process (#285) * First test of GitHub actions integration * Changed actions checkout to specific version * New build script to install dependencies on local environment in a single run * Fixed issues with CI workflow for spring, springboot2 and struts * More minor fixes to build workflow. getting there * Renamed struts sample folder to match the naming used in the framework implementation * Minor fix for Spring 4.3 build * Added GitHub actions badge to readme --- .../continuous-integration-workflow.yml | 70 ++++++++++ README.md | 2 +- gha_build.sh | 123 ++++++++++++++++++ .../{struts => struts2}/pet-store/README.md | 0 .../pet-store/build.gradle | 0 samples/{struts => struts2}/pet-store/pom.xml | 0 .../{struts => struts2}/pet-store/sam.yaml | 0 .../pet-store/src/main/assembly/dist.xml | 0 .../sample/struts/actions/PetsController.java | 0 .../serverless/sample/struts/model/Pet.java | 0 .../sample/struts/model/PetData.java | 0 .../pet-store/src/main/resources/log4j2.xml | 0 .../pet-store/src/main/resources/struts.xml | 0 13 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/continuous-integration-workflow.yml create mode 100755 gha_build.sh rename samples/{struts => struts2}/pet-store/README.md (100%) rename samples/{struts => struts2}/pet-store/build.gradle (100%) rename samples/{struts => struts2}/pet-store/pom.xml (100%) rename samples/{struts => struts2}/pet-store/sam.yaml (100%) rename samples/{struts => struts2}/pet-store/src/main/assembly/dist.xml (100%) rename samples/{struts => struts2}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java (100%) rename samples/{struts => struts2}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java (100%) rename samples/{struts => struts2}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java (100%) rename samples/{struts => struts2}/pet-store/src/main/resources/log4j2.xml (100%) rename samples/{struts => struts2}/pet-store/src/main/resources/struts.xml (100%) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml new file mode 100644 index 00000000..7fc2c357 --- /dev/null +++ b/.github/workflows/continuous-integration-workflow.yml @@ -0,0 +1,70 @@ +name: Serverless Java Container Continuous Integration +on: + push: + pull_request: + branches: + - master + +jobs: + build_core: + name: Build and test core + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: mvn -q clean install + working-directory: ./aws-serverless-java-container-core + + build_jersey: + name: Build and test Jersey + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: ./gha_build.sh jersey true true + - name: Build Jersey 2.26 + run: ./gha_build.sh jersey false false -Djersey.version=2.26 + - name: Build Jersey 2.27 + run: ./gha_build.sh jersey false false -Djersey.version=2.27 + - name: Build Jersey 2.28 + run: ./gha_build.sh jersey false false -Djersey.version=2.28 + + build_spark: + name: Build and test Spark + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: ./gha_build.sh spark true true + - name: Build Spark 2.8.0 + run: ./gha_build.sh spark false false -Dspark.version=2.8.0 + + build_spring: + name: Build and test Spring & SpringBoot + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: ./gha_build.sh spring true true + - name: Build Spring 4.3 + run: ./gha_build.sh spring false false -Dspring.version=4.3.25.RELEASE -Dspring-security.version=4.2.13.RELEASE + - name: Build Spring 5.0 + run: ./gha_build.sh spring false false -Dspring.version=5.0.15.RELEASE -Dspring-security.version=5.0.13.RELEASE + + build_springboot2: + name: Build and test SpringBoot 2 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: ./gha_build.sh springboot2 true true + - name: Build Spring Boot 2.0 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.13.RELEASE -Dspringsecurity.version=5.0.12.RELEASE + + build_struts2: + name: Build and test Struts 2 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Build latest + run: ./gha_build.sh struts2 true true \ No newline at end of file diff --git a/README.md b/README.md index b8baf7bc..6a5bacd6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) +# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/.github/workflows/continuous-integration-workflow.yml/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Apache Struts](http://struts.apache.org/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. diff --git a/gha_build.sh b/gha_build.sh new file mode 100755 index 00000000..d4d2d723 --- /dev/null +++ b/gha_build.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash + +WORKING_DIR=$(pwd) +FRAMEWORK=$1 +RUN_ARCHETYPE=$2 +RUN_SAMPLES=$3 +EXTRA_PARAMS=${*:4} + +echo "Starting build script for ${FRAMEWORK} with params ${EXTRA_PARAMS}" + +if [[ -z ${FRAMEWORK} ]] ; then + echo "Missing framework parameter" + exit 1 +fi + +function install { + # we skip tests for core because we assume they will be run in a separate branch of the workflow + cd ${WORKING_DIR}/aws-serverless-java-container-core && mvn -q clean install -DskipTests + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${WORKING_DIR}/aws-serverless-java-container-$1 && mvn -q clean install ${@:2} + if [[ "$?" -ne 0 ]]; then + exit 1 + fi +} + +function archetype { + ARCHETYPE_NAME=aws-serverless-$1-archetype + PROJ_NAME=$1-archetype-test + cd ${WORKING_DIR}/${ARCHETYPE_NAME} && mvn -q clean install + ARCHETYPE_TEST_DIR=${WORKING_DIR}/$1_archetype_test + mkdir -p ${ARCHETYPE_TEST_DIR} + cd ${ARCHETYPE_TEST_DIR} && mvn archetype:generate -DgroupId=my.service -DartifactId=${PROJ_NAME} -Dversion=1.0-SNAPSHOT \ + -DarchetypeGroupId=com.amazonaws.serverless.archetypes \ + -DarchetypeArtifactId=${ARCHETYPE_NAME} \ + -DarchetypeCatalog=local \ + -DinteractiveMode=false + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && mvn -q clean package -Pshaded-jar + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && mvn -q clean package + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && gradle -q wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew wrapper --gradle-version 5.0 + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew -q clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi +} + +function sample { + # force to pet store for now. In the future we may loop over all samples + SAMPLE_FOLDER=${WORKING_DIR}/samples/$1/pet-store + cd ${SAMPLE_FOLDER} && mvn -q clean package + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && gradle -q wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && ./gradlew wrapper --gradle-version 5.0 + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && ./gradlew -q clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + + SAM_FILE=${SAMPLE_FOLDER}/sam.yaml + if [[ -f "$SAM_FILE" ]]; then + TARGET_ZIP=$(cat ${SAM_FILE} | grep CodeUri | sed -e 's/^.*:\ //g') + if [[ ! -f "${SAMPLE_FOLDER}/${TARGET_ZIP}" ]]; then + echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP FOR $1 SAMPLE" + exit 1 + fi + else + echo "COULD NOT FIND SAM FILE: '${SAM_FILE}'" + exit 1 + fi +} + +# set up the master pom otherwise we won't be able to find new dependencies +cd ${WORKING_DIR}/ && mvn -q --non-recursive clean install + +case $1 in + # special case for spring since we include both spring and springboot 1.x in one package + spring) + install ${FRAMEWORK} ${EXTRA_PARAMS} + if [[ "$RUN_ARCHETYPE" = true ]] ; then + archetype ${FRAMEWORK} + archetype springboot + fi + if [[ "$RUN_SAMPLES" = true ]] ; then + sample ${FRAMEWORK} + sample springboot + fi + break + ;; + *) + install ${FRAMEWORK} ${EXTRA_PARAMS} + if [[ "$RUN_ARCHETYPE" = true ]] ; then + archetype ${FRAMEWORK} + fi + if [[ "$RUN_SAMPLES" = true ]] ; then + sample ${FRAMEWORK} + fi + ;; +esac \ No newline at end of file diff --git a/samples/struts/pet-store/README.md b/samples/struts2/pet-store/README.md similarity index 100% rename from samples/struts/pet-store/README.md rename to samples/struts2/pet-store/README.md diff --git a/samples/struts/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle similarity index 100% rename from samples/struts/pet-store/build.gradle rename to samples/struts2/pet-store/build.gradle diff --git a/samples/struts/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml similarity index 100% rename from samples/struts/pet-store/pom.xml rename to samples/struts2/pet-store/pom.xml diff --git a/samples/struts/pet-store/sam.yaml b/samples/struts2/pet-store/sam.yaml similarity index 100% rename from samples/struts/pet-store/sam.yaml rename to samples/struts2/pet-store/sam.yaml diff --git a/samples/struts/pet-store/src/main/assembly/dist.xml b/samples/struts2/pet-store/src/main/assembly/dist.xml similarity index 100% rename from samples/struts/pet-store/src/main/assembly/dist.xml rename to samples/struts2/pet-store/src/main/assembly/dist.xml diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java b/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java similarity index 100% rename from samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java rename to samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java b/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java similarity index 100% rename from samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java rename to samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java b/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java similarity index 100% rename from samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java rename to samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java diff --git a/samples/struts/pet-store/src/main/resources/log4j2.xml b/samples/struts2/pet-store/src/main/resources/log4j2.xml similarity index 100% rename from samples/struts/pet-store/src/main/resources/log4j2.xml rename to samples/struts2/pet-store/src/main/resources/log4j2.xml diff --git a/samples/struts/pet-store/src/main/resources/struts.xml b/samples/struts2/pet-store/src/main/resources/struts.xml similarity index 100% rename from samples/struts/pet-store/src/main/resources/struts.xml rename to samples/struts2/pet-store/src/main/resources/struts.xml From ca111d2e8976a07f03d22f35313b1df3e28a6aad Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 30 Sep 2019 15:30:00 -0700 Subject: [PATCH 0345/1214] Updated readme link and removed travis files --- .travis.yml | 14 ------- README.md | 2 +- travis.sh | 112 ---------------------------------------------------- 3 files changed, 1 insertion(+), 127 deletions(-) delete mode 100644 .travis.yml delete mode 100755 travis.sh diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f79cc86b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: java -dist: trusty -jdk: - - openjdk8 -addons: - apt: - update: true -before_install: - - wget https://services.gradle.org/distributions/gradle-5.0-bin.zip - - mkdir /opt/gradle - - unzip -d /opt/gradle gradle-5.0-bin.zip - - export GRADLE=/opt/gradle/gradle-5.0/bin/gradle -install: true -script: ./travis.sh diff --git a/README.md b/README.md index 6a5bacd6..ea886223 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/.github/workflows/continuous-integration-workflow.yml/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) +# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/Serverless%20Java%20Container%20Continuous%20Integration/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Apache Struts](http://struts.apache.org/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. diff --git a/travis.sh b/travis.sh deleted file mode 100755 index d61e696c..00000000 --- a/travis.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env bash - -IFS=$'\n' - -echo "STARTING TRAVIS BUILD in $(pwd)" -cd $TRAVIS_BUILD_DIR -mvn -q install -if [[ "$?" -ne 0 ]]; then - exit 1 -fi -echo "COMPLETED MAIN FRAMEWORK INSTALL" - -echo "STARTING SAMPLES BUILD" -for SAMPLE in $(find samples -type d -maxdepth 2 -mindepth 2); -do - echo "BUILDING SAMPLE '$SAMPLE'" - cd $SAMPLE - mvn -q clean package - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - $GRADLE -q wrapper - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - ./gradlew wrapper --gradle-version 5.0 - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - ./gradlew -q clean build - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - - SAM_FILE="$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml" - if [[ -f "$SAM_FILE" ]]; then - TARGET_ZIP=$(cat $SAM_FILE | grep CodeUri | sed -e 's/^.*:\ //g') - if [[ ! -f "./$TARGET_ZIP" ]]; then - echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP for $SAMPLE" - exit 1 - fi - else - echo "COULD NOT FIND SAM FILE: '$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml'" - exit 1 - fi - - cd $TRAVIS_BUILD_DIR - echo "'$SAMPLE' BUILT SUCCESSFULLY" -done -echo "COMPLETED SAMPLES BUILD" - -cd $TRAVIS_BUILD_DIR -rm -rf tmp -echo "STARTING ARCHETYPE BUILD" -for ARCH in $(find . -name "*archetype" -type d); -do - echo "TESTING ARCHETYPE '$ARCH'" - ARCH_NAME=$(basename $ARCH) - TEST_PROJ="TEST-$ARCH_NAME" - mkdir tmp && cd tmp - mvn archetype:generate -DgroupId=my.service -DartifactId=$TEST_PROJ -Dversion=1.0-SNAPSHOT \ - -DarchetypeGroupId=com.amazonaws.serverless.archetypes \ - -DarchetypeArtifactId=$ARCH_NAME \ - -DarchetypeCatalog=local \ - -DinteractiveMode=false - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - cd ${TEST_PROJ} - mvn -q clean package -Pshaded-jar - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - mvn -q clean package - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - if [[ -f "$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/build.gradle" ]]; then - $GRADLE -q wrapper - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - ./gradlew wrapper --gradle-version 5.0 - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - ./gradlew -q clean build - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - else - echo "GRADLE BUILD FILE NOT FOUND" - fi - - SAM_FILE="$TRAVIS_BUILD_DIR/tmp/$TEST_PROJ/sam.yaml" - if [[ -f "$SAM_FILE" ]]; then - TARGET_ZIP=$(cat $SAM_FILE | grep CodeUri | sed -e 's/^.*:\ //g') - if [[ ! -f "./$TARGET_ZIP" ]]; then - echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP for $ARCH" - exit 1 - fi - else - echo "COULD NOT FIND SAM FILE: '$TRAVIS_BUILD_DIR/$SAMPLE/sam.yaml'" - exit 1 - fi - - - echo "'$ARCH' BUILT SUCCESSFULLY" - cd $TRAVIS_BUILD_DIR - rm -rf tmp -done -echo "COMPLETED ARCHETYPE BUILD" \ No newline at end of file From de485d36ee2ca5e7d57cef57f7a343f415cc0673 Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 30 Sep 2019 15:31:58 -0700 Subject: [PATCH 0346/1214] Shortened name of CI workflow --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea886223..6f4dced3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/Serverless%20Java%20Container%20Continuous%20Integration/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) +# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/Continuous%20Integration/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Apache Struts](http://struts.apache.org/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. From 7dccd80c76a9f743dd75ee04499e92a638853fda Mon Sep 17 00:00:00 2001 From: sapessi Date: Mon, 30 Sep 2019 15:35:10 -0700 Subject: [PATCH 0347/1214] Workflow rename --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 7fc2c357..8aa7bf9f 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -1,4 +1,4 @@ -name: Serverless Java Container Continuous Integration +name: Continuous Integration on: push: pull_request: From 240dbacf37bce4e044dbe85cadec7b6621232803 Mon Sep 17 00:00:00 2001 From: Stefano Buliani <2996317+sapessi@users.noreply.github.com> Date: Thu, 14 Nov 2019 09:57:33 -0800 Subject: [PATCH 0348/1214] Micronaut sample (#303) * First import of micronaut native demo * Cleanup, upgrade dependencies and use latest GraalVM version * Change default shell for execution It seems, for those who don't have bash as their default shell, [[ is not valid syntax for `sh` (it did not run on my machine running Linux Mint 19 and zsh as my default, I got multiple `./docker-build.sh: 4: ./docker-build.sh: [[: not found` errors). I would propose changing this to `#!/bin/bash`, for which this is definitely valid syntax. * Further differentiates running via SAM vs AWS It wasn't initially super obvious to me how to run this locally, but I was able to figure it out. I'm hoping to make it clearer to anyone else looking at it in the future via this change. * Updated Micronaut readmes --- README.md | 4 +- samples/micronaut/pet-store/Dockerfile | 24 ++++ samples/micronaut/pet-store/README.md | 74 ++++++++++++ samples/micronaut/pet-store/build.gradle | 77 ++++++++++++ samples/micronaut/pet-store/docker-build.sh | 25 ++++ samples/micronaut/pet-store/gradle.properties | 1 + samples/micronaut/pet-store/micronaut-cli.yml | 5 + samples/micronaut/pet-store/sam-local.sh | 4 + samples/micronaut/pet-store/sam-native.yaml | 30 +++++ samples/micronaut/pet-store/scripts/bootstrap | 3 + .../pet-store/scripts/graalvm-build.sh | 9 ++ samples/micronaut/pet-store/settings.gradle | 1 + .../amazonaws/micronaut/demo/Application.java | 17 +++ .../micronaut/demo/PetsController.java | 79 ++++++++++++ .../amazonaws/micronaut/demo/model/Pet.java | 61 ++++++++++ .../micronaut/demo/model/PetData.java | 114 ++++++++++++++++++ .../native-image.properties | 4 + .../src/main/resources/application.yml | 6 + .../pet-store/src/main/resources/logback.xml | 15 +++ 19 files changed, 552 insertions(+), 1 deletion(-) create mode 100644 samples/micronaut/pet-store/Dockerfile create mode 100644 samples/micronaut/pet-store/README.md create mode 100644 samples/micronaut/pet-store/build.gradle create mode 100755 samples/micronaut/pet-store/docker-build.sh create mode 100644 samples/micronaut/pet-store/gradle.properties create mode 100644 samples/micronaut/pet-store/micronaut-cli.yml create mode 100755 samples/micronaut/pet-store/sam-local.sh create mode 100644 samples/micronaut/pet-store/sam-native.yaml create mode 100755 samples/micronaut/pet-store/scripts/bootstrap create mode 100755 samples/micronaut/pet-store/scripts/graalvm-build.sh create mode 100644 samples/micronaut/pet-store/settings.gradle create mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java create mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java create mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java create mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java create mode 100644 samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties create mode 100644 samples/micronaut/pet-store/src/main/resources/application.yml create mode 100644 samples/micronaut/pet-store/src/main/resources/logback.xml diff --git a/README.md b/README.md index 6f4dced3..cad345f0 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,9 @@ Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serve * [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) -* [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) +* [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) + +* Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). diff --git a/samples/micronaut/pet-store/Dockerfile b/samples/micronaut/pet-store/Dockerfile new file mode 100644 index 00000000..6bb80136 --- /dev/null +++ b/samples/micronaut/pet-store/Dockerfile @@ -0,0 +1,24 @@ +FROM amazonlinux:2017.03.1.20170812 as graalvm +# install graal to amazon linux. +ENV LANG=en_US.UTF-8 + +RUN yum install -y gcc gcc-c++ libc6-dev zlib1g-dev curl bash zlib zlib-devel zip \ +# && yum install -y libcxx libcxx-devel llvm-toolset-7 \ + && rm -rf /var/cache/yum + + +ENV GRAAL_VERSION 19.2.0.1 +ENV GRAAL_FILENAME graalvm-ce-linux-amd64-${GRAAL_VERSION}.tar.gz + +RUN curl -4 -L https://github.com/oracle/graal/releases/download/vm-${GRAAL_VERSION}/graalvm-ce-linux-amd64-${GRAAL_VERSION}.tar.gz -o /tmp/${GRAAL_FILENAME} + +RUN tar -zxvf /tmp/${GRAAL_FILENAME} -C /tmp \ + && mv /tmp/graalvm-ce-${GRAAL_VERSION} /usr/lib/graalvm + +RUN rm -rf /tmp/* +RUN /usr/lib/graalvm/bin/gu install native-image +ADD scripts/graalvm-build.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/graalvm-build.sh +VOLUME ["/func"] +WORKDIR /func +ENTRYPOINT ["/usr/local/bin/graalvm-build.sh"] \ No newline at end of file diff --git a/samples/micronaut/pet-store/README.md b/samples/micronaut/pet-store/README.md new file mode 100644 index 00000000..fc5793a5 --- /dev/null +++ b/samples/micronaut/pet-store/README.md @@ -0,0 +1,74 @@ +# Micronaut Native Pet store example + +The [Micronaut framework](https://micronaut.io/) is compatible with Spring's annotations and makes it easy to use [GraalVM](https://www.graalvm.org/) to build application images into native binaries. Further, Micronaut includes builtin support for AWS Lambda. + +This demo application shows how to use Micronaut to compile our standard pet store example, using Spring annotations, into a native binary with GraalVM and execute it in AWS Lambda. To run this demo, you will need to have [Gradle](https://gradle.org/) installed as well as [Docker](https://www.docker.com/) to run the GraalVM build. + +With all the pre-requisites installed including: + +* JDK 8 or above +* Gradle 5.6.x + +You should be able to build a native image of the application by running the `docker-build.sh` from the repository's root. + +```bash +$ ./docker-build.sh +``` + +The build process will perform the following tasks: +1. Use gradle to compile the application +2. Create a `native-image` folder in the current directory +3. Check if a Docker image called `graalvm-lambda-build` exists on the local machine. If not, create it using the `Dockerfile` in the root of the repository +4. Run the docker image to execute the GraalVM build process + +The output of the build is an executable file called `server` and a deployable zip called `function.zip` in the `native-image` folder: + +```bash +$ ls -lh native-image/ +total 75M +-rwxr-xr-x 1 user user 36 Oct 1 16:01 bootstrap +-rw-r--r-- 1 user user 18M Oct 1 16:01 function.zip +-rwxr-xr-x 1 user user 57M Oct 1 16:01 server +``` + +To run the lambda locally, you can utilize the SAM cli by running `./sam-local.sh`. This should start up the listeners in the `PetsController`, and you can test locally with your preferred http client. + +For example, to test the GET /pets endpoint via curl: +```bash +curl localhost:3000/pets +``` + +You should see JSON output of pets. + +To deploy the application to AWS Lambda you can use the pre-configured `sam-native.yaml` file included in the repo. Using the AWS or SAM CLI, run the following commands: + +```bash +$ aws cloudformation package --template-file sam-native.yaml \ + --output-template-file packaged-sam.yaml \ + --s3-bucket +Uploading to d3e2617f3c8c2e8ca78e35a0dc856884 18553505 / 18553505.0 (100.00%) +Successfully packaged artifacts and wrote output template to file packaged-sam.yaml. +Execute the following command to deploy the packaged template +aws cloudformation deploy --template-file /workspace/graal-spring-demo/packaged-sam.yaml --stack-name + + +$ aws cloudformation deploy --template-file ./packaged-sam.yaml --stack-name MicronautGraalVmDemo --capabilities CAPABILITY_IAM + +Waiting for changeset to be created.. +Waiting for stack create/update to complete +Successfully created/updated stack - MicronautGraalVmDemo +``` + +You can use the AWS CLI to get the API endpoint generated by the deployment process: + +```bash +aws cloudformation describe-stacks --stack-name MicronautGraalVmDemo --query Stacks[0].Outputs[0].OutputValue +"https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets" +``` + +Make a test request to the API endpoint using curl or your preferred http client. + +For example, to check the GET /pets endpoint via curl: +```bash +curl https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets +``` diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle new file mode 100644 index 00000000..94f3d1b5 --- /dev/null +++ b/samples/micronaut/pet-store/build.gradle @@ -0,0 +1,77 @@ +plugins { + id "java" + id "com.github.johnrengelman.shadow" version "5.0.0" + id "application" + id "net.ltgt.apt-eclipse" version "0.21" + id "org.springframework.boot" version "2.1.8.RELEASE" + id "io.spring.dependency-management" version "1.0.6.RELEASE" +} + +version "0.1" +group "graal.spring.demo" + +repositories { + mavenCentral() + maven { url "https://jcenter.bintray.com" } +} + +configurations { + // for dependencies that are needed for development only + developmentOnly +} + +dependencies { + annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") + annotationProcessor "io.micronaut:micronaut-graal" + annotationProcessor "io.micronaut:micronaut-inject-java" + annotationProcessor "io.micronaut:micronaut-validation" + annotationProcessor "io.micronaut.spring:micronaut-spring-boot" + annotationProcessor "io.micronaut.spring:micronaut-spring-boot-annotation" + annotationProcessor "io.micronaut.spring:micronaut-spring-web-annotation" + testAnnotationProcessor "io.micronaut.spring:micronaut-spring-web-annotation" + + compileOnly "com.oracle.substratevm:svm" + implementation platform("io.micronaut:micronaut-bom:$micronautVersion") + implementation "io.micronaut:micronaut-http-client" + implementation "io.micronaut:micronaut-inject" + implementation "io.micronaut:micronaut-validation" + implementation "io.micronaut:micronaut-runtime" + implementation("io.micronaut.aws:micronaut-function-aws-custom-runtime:1.3.2") { + exclude group: "com.fasterxml.jackson.module", module: "jackson-module-afterburner" + } + implementation("io.micronaut.aws:micronaut-function-aws-api-proxy:1.3.2") { + exclude group: "com.fasterxml.jackson.module", module: "jackson-module-afterburner" + } + developmentOnly "io.micronaut:micronaut-http-server-netty" + runtimeOnly "ch.qos.logback:logback-classic:1.2.3" + testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") + testAnnotationProcessor "io.micronaut:micronaut-inject-java" + testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion") + testImplementation "org.junit.jupiter:junit-jupiter-api" + testImplementation "io.micronaut.test:micronaut-test-junit5" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine" + + // spring support + compile("org.springframework.boot:spring-boot-starter-web") + runtime("io.micronaut.spring:micronaut-spring-boot:1.0.1") + runtime("io.micronaut.spring:micronaut-spring-web:1.0.1") +} + +test.classpath += configurations.developmentOnly + +mainClassName = "graal.spring.demo.Application" +// use JUnit 5 platform +test { + useJUnitPlatform() +} + +shadowJar { + mergeServiceFiles() +} + +run.classpath += configurations.developmentOnly +run.jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote') +tasks.withType(JavaCompile){ + options.encoding = "UTF-8" + options.compilerArgs.add('-parameters') +} diff --git a/samples/micronaut/pet-store/docker-build.sh b/samples/micronaut/pet-store/docker-build.sh new file mode 100755 index 00000000..41a644cc --- /dev/null +++ b/samples/micronaut/pet-store/docker-build.sh @@ -0,0 +1,25 @@ +#!/bin/bash +DOCKER_IMAGE_NAME=graalvm-lambda-build + +if [[ -d "${PWD}/native-image" ]]; then + rm -rf native-image/* +fi + +gradle clean build --info + +if [[ $? -ne 0 ]]; then + echo "Gradle build failed" + exit 1 +fi + +mkdir -p ${PWD}/native-image + +if [[ "$(docker images -q ${DOCKER_IMAGE_NAME} 2> /dev/null)" == "" ]]; then + docker build . -t ${DOCKER_IMAGE_NAME} +fi + +docker run --rm -v ${PWD}:/func ${DOCKER_IMAGE_NAME} + +if [[ -f "${PWD}/native-image/function.zip" ]]; then + echo "The function is ready to deploy in the ./native-image/function.zip file. Use the sam-native.yaml template to set up your Lambda function and API" +fi diff --git a/samples/micronaut/pet-store/gradle.properties b/samples/micronaut/pet-store/gradle.properties new file mode 100644 index 00000000..04c81860 --- /dev/null +++ b/samples/micronaut/pet-store/gradle.properties @@ -0,0 +1 @@ +micronautVersion=1.2.3 \ No newline at end of file diff --git a/samples/micronaut/pet-store/micronaut-cli.yml b/samples/micronaut/pet-store/micronaut-cli.yml new file mode 100644 index 00000000..262c35c0 --- /dev/null +++ b/samples/micronaut/pet-store/micronaut-cli.yml @@ -0,0 +1,5 @@ +profile: service +defaultPackage: com.amazonaws.micronaut.demo +--- +testFramework: junit +sourceLanguage: java \ No newline at end of file diff --git a/samples/micronaut/pet-store/sam-local.sh b/samples/micronaut/pet-store/sam-local.sh new file mode 100755 index 00000000..0c82b851 --- /dev/null +++ b/samples/micronaut/pet-store/sam-local.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +./docker-build.sh +sam local start-api -t sam-native.yaml \ No newline at end of file diff --git a/samples/micronaut/pet-store/sam-native.yaml b/samples/micronaut/pet-store/sam-native.yaml new file mode 100644 index 00000000..76a08d1e --- /dev/null +++ b/samples/micronaut/pet-store/sam-native.yaml @@ -0,0 +1,30 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Micronaut API - graal.spring.demo::graal-spring-demo +Globals: + Api: + EndpointConfiguration: REGIONAL +Resources: + GraalVMApiService: + Type: AWS::Serverless::Function + Properties: + Handler: not.used.in.provided.runtime + Runtime: provided + CodeUri: native-image/function.zip + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Tracing: Active + Timeout: 15 + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + MicronautNativeServiceApi: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Export: + Name: MicronautNativeServiceApi diff --git a/samples/micronaut/pet-store/scripts/bootstrap b/samples/micronaut/pet-store/scripts/bootstrap new file mode 100755 index 00000000..f10361a2 --- /dev/null +++ b/samples/micronaut/pet-store/scripts/bootstrap @@ -0,0 +1,3 @@ +#!/bin/sh +set -euo pipefail +./server \ No newline at end of file diff --git a/samples/micronaut/pet-store/scripts/graalvm-build.sh b/samples/micronaut/pet-store/scripts/graalvm-build.sh new file mode 100755 index 00000000..44b8b260 --- /dev/null +++ b/samples/micronaut/pet-store/scripts/graalvm-build.sh @@ -0,0 +1,9 @@ +#!/bin/sh +echo "Startin GraalVM build" +/usr/lib/graalvm/bin/native-image -H:+TraceClassInitialization --initialize-at-build-time=reactor.core.publisher.Mono --initialize-at-build-time=reactor.core.publisher.Flux --no-fallback --no-server -cp /func/build/libs/pet-store-*-all.jar +rm -rf /func/native-image/* + +chmod 755 /func/server +mv /func/server /func/native-image/server +cp /func/scripts/bootstrap /func/native-image/bootstrap +cd /func/native-image && zip -j function.zip bootstrap server diff --git a/samples/micronaut/pet-store/settings.gradle b/samples/micronaut/pet-store/settings.gradle new file mode 100644 index 00000000..a6e417eb --- /dev/null +++ b/samples/micronaut/pet-store/settings.gradle @@ -0,0 +1 @@ +rootProject.name="pet-store" \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java new file mode 100644 index 00000000..0340d5c4 --- /dev/null +++ b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java @@ -0,0 +1,17 @@ +package com.amazonaws.micronaut.demo; + +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import io.micronaut.runtime.Micronaut; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + Logger rootLogger = (ch.qos.logback.classic.Logger)org.slf4j.LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); + rootLogger.setLevel(Level.TRACE); + Micronaut.run(Application.class); + } +} \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java new file mode 100644 index 00000000..a0d43e61 --- /dev/null +++ b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java @@ -0,0 +1,79 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.micronaut.demo; + +import com.amazonaws.micronaut.demo.model.Pet; +import com.amazonaws.micronaut.demo.model.PetData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import javax.annotation.Nullable; +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + +@RestController +@EnableWebMvc +public class PetsController { + + private PetData petData; + + @Autowired + public PetsController(PetData data) { + petData = data; + } + + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, @Nullable Principal principal) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(petData.getRandomName()); + newPet.setBreed(petData.getRandomBreed()); + newPet.setDateOfBirth(petData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet getPet(@RequestParam("petId") String petId) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(petData.getRandomBreed()); + newPet.setDateOfBirth(petData.getRandomDoB()); + newPet.setName(petData.getRandomName()); + return newPet; + } + +} diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java new file mode 100644 index 00000000..3f0328ee --- /dev/null +++ b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java @@ -0,0 +1,61 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.micronaut.demo.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.micronaut.core.annotation.Introspected; + +import java.util.Date; + +@Introspected +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + @JsonProperty("petId") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonFormat(pattern = "YYYY-mm-dd") + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java new file mode 100644 index 00000000..f7bc03c4 --- /dev/null +++ b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java @@ -0,0 +1,114 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.micronaut.demo.model; + +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +@Component +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public List getBreeds() { + return breeds; + } + + public List getNames() { + return names; + } + + public String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties b/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties new file mode 100644 index 00000000..fd9f904e --- /dev/null +++ b/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties @@ -0,0 +1,4 @@ +Args = -H:IncludeResources=application.yml|log4j2.xml \ + -H:Name=server \ + -H:-AllowVMInspection \ + -H:Class=io.micronaut.function.aws.runtime.MicronautLambdaRuntime \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/resources/application.yml b/samples/micronaut/pet-store/src/main/resources/application.yml new file mode 100644 index 00000000..c16e60c1 --- /dev/null +++ b/samples/micronaut/pet-store/src/main/resources/application.yml @@ -0,0 +1,6 @@ +micronaut: + application: + name: pet-store +jackson: + serialization: + indentOutput: true \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/resources/logback.xml b/samples/micronaut/pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..6010eb52 --- /dev/null +++ b/samples/micronaut/pet-store/src/main/resources/logback.xml @@ -0,0 +1,15 @@ + + + + true + + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + From c9087955357c62eaedffdac5cd1cb5628733c93f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 09:58:06 -0800 Subject: [PATCH 0349/1214] Bump jackson.version from 2.9.10 to 2.10.1 in /samples/struts2/pet-store (#301) Bumps `jackson.version` from 2.9.10 to 2.10.1. Updates `jackson-core` from 2.9.10 to 2.10.1 - [Release notes](https://github.com/FasterXML/jackson-core/releases) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.9.10...jackson-core-2.10.1) Updates `jackson-annotations` from 2.9.10 to 2.10.1 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Updates `jackson-databind` from 2.9.10 to 2.10.1 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 80c66879..9689fc6a 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.20 - 2.9.10 + 2.10.1 4.12 2.11.1 From 97a36f19a9c6eec8364d81e3f7150ec294140188 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 09:58:21 -0800 Subject: [PATCH 0350/1214] Bump jackson-databind in /samples/jersey/pet-store (#300) Bumps [jackson-databind](https://github.com/FasterXML/jackson) from 2.9.10 to 2.9.10.1. - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index bd319546..ced682ae 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.29.1 - 2.9.10 + 2.9.10.1 From 612d9471201635a103278c48ffd266d359a96b01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 09:58:38 -0800 Subject: [PATCH 0351/1214] Bump jackson-databind in /samples/spark/pet-store (#299) Bumps [jackson-databind](https://github.com/FasterXML/jackson) from 2.9.10 to 2.9.10.1. - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Signed-off-by: dependabot[bot] --- samples/spark/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 1b1a370d..bbb57685 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.10 + 2.9.10.1 2.9.1 From 8b5a8f5a6c26a667139b574d675da2b3670763a0 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 14 Nov 2019 11:31:46 -0800 Subject: [PATCH 0352/1214] Bump Jackson version in main framework and removed owasp suppression --- owasp-suppression.xml | 5 ----- pom.xml | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/owasp-suppression.xml b/owasp-suppression.xml index be75cff2..fe70f749 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -36,10 +36,5 @@ cpe:/a:slf4j:slf4j:1.8.0 - - - - cpe:/a:fasterxml:jackson-databind:2.9.9 - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 67a3283a..298bdc8b 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 0.7 5.2.2 - 2.9.10 + 2.10.1 From 792eaa34ef14eb8429e4b7829968ea3140bd1b7a Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 14 Nov 2019 11:32:01 -0800 Subject: [PATCH 0353/1214] Added SpringBoot 2.2 to CI --- .github/workflows/continuous-integration-workflow.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 8aa7bf9f..1937e03d 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -60,6 +60,10 @@ jobs: run: ./gha_build.sh springboot2 true true - name: Build Spring Boot 2.0 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.13.RELEASE -Dspringsecurity.version=5.0.12.RELEASE + - name: Build Spring Boot 2.1 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.10.RELEASE -Dspring.version=5.1.11.RELEASE -Dspringsecurity.version=5.1.7.RELEASE + - name: Build Spring Boot 2.2 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.1.RELEASE -Dspring.version=5.2.1.RELEASE -Dspringsecurity.version=5.2.1.RELEASE build_struts2: name: Build and test Struts 2 From 67abc3e5733c26623b8689b6a5e8b18911fedca1 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 14 Nov 2019 11:53:35 -0800 Subject: [PATCH 0354/1214] Bump jackson version in samples --- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index c719ba13..064fdf37 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'io.symphonia:lambda-logging:1.0.1' ) - compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.29.1") { + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.10.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index ced682ae..6761c621 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.29.1 - 2.9.10.1 + 2.10.1 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 6b6c7012..00ac4797 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.sparkjava:spark-core:2.9.1', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.1', 'io.symphonia:lambda-logging:1.0.1' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index bbb57685..4bdd9095 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.9.10.1 + 2.10.1 2.9.1 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 9f2ccf09..2d7e4250 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.20', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.1.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.1', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', From d816d4df0ab88e592e1dde5576d4e0aca01f6e9c Mon Sep 17 00:00:00 2001 From: Harold Sun Date: Fri, 6 Dec 2019 01:08:40 +0800 Subject: [PATCH 0355/1214] add Quarkus pet store sample. (#309) * add Quarkus pet store sample. * update source code package structure --- samples/quarkus/pet-store/README.md | 68 +++++++++ samples/quarkus/pet-store/pom.xml | 141 ++++++++++++++++++ samples/quarkus/pet-store/sam.native.yaml | 36 +++++ .../quarkus/pet-store/src/assembly/zip.xml | 17 +++ .../sample/quarkus/PetsController.java | 63 ++++++++ .../serverless/sample/quarkus/model/Pet.java | 50 +++++++ .../sample/quarkus/model/PetData.java | 102 +++++++++++++ .../src/main/resources/application.properties | 4 + 8 files changed, 481 insertions(+) create mode 100644 samples/quarkus/pet-store/README.md create mode 100644 samples/quarkus/pet-store/pom.xml create mode 100644 samples/quarkus/pet-store/sam.native.yaml create mode 100644 samples/quarkus/pet-store/src/assembly/zip.xml create mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java create mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java create mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java create mode 100644 samples/quarkus/pet-store/src/main/resources/application.properties diff --git a/samples/quarkus/pet-store/README.md b/samples/quarkus/pet-store/README.md new file mode 100644 index 00000000..3ff1371d --- /dev/null +++ b/samples/quarkus/pet-store/README.md @@ -0,0 +1,68 @@ +# Quarkus Native Pet store example + +The [Quarkus framework](https://quarkus.io/) is compatible with Spring's annotations and makes it easy to use [GraalVM](https://www.graalvm.org/) to build application images into native binaries. Further, Micronaut includes builtin support for AWS Lambda. + +This demo application shows how to use Quarkus to compile our standard pet store example, using Spring annotations, into a native binary with GraalVM and execute it in AWS Lambda. To run this demo, you will need to have [Maven](https://maven.apache.org/) installed as well as [Docker](https://www.docker.com/) to build GraalVM native image. + +With all the pre-requisites installed including: + +* JDK 8 or above +* Maven 3.5.x + +You should be able to build a native image of the application by running mvn from the repository's root. + +```bash +$ mvn clean install -Pnative +``` + +The output of the build is a deployable zip called `function.zip` in the `target` folder. + +To run the lambda locally, you can utilize the SAM cli. This should start up the listeners in the `PetsController`, and you can test locally with your preferred http client. + +```bash +sam local start-api -t sam.native.yaml +``` + +For example, to test the GET /pets endpoint via curl: +```bash +curl localhost:3000/pets +``` + +You should see JSON output of pets. + +To deploy the application to AWS Lambda you can use the pre-configured `sam-native.yaml` file included in the repo. Using the AWS or SAM CLI, run the following commands: + +```bash +sam deploy -g -t sam.native.yaml +``` + +You should see the stack deployed successfully: + +```bash +Stack quarkus-sample-pet-store outputs: +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +PetStoreNativeApi - URL for application https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/ +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Successfully created/updated stack - quarkus-sample-pet-store in xx-xxxx-1 + +``` + +Make a test request to the API endpoint using curl or your preferred http client. + +For example, to check the GET /pets endpoint via curl: +```bash +curl https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets +``` + +Finally, there’s an environment variable that must be set for native GraalVM deployments. If you look at sam.native.yaml you’ll see this: + +```bash + Environment: + Variables: + DISABLE_SIGNAL_HANDLERS: true +``` + +This environment variable resolves some incompatibilites between GraalVM and the Amazon Lambda Custom Runtime environment. \ No newline at end of file diff --git a/samples/quarkus/pet-store/pom.xml b/samples/quarkus/pet-store/pom.xml new file mode 100644 index 00000000..0147be88 --- /dev/null +++ b/samples/quarkus/pet-store/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + com.amazonaws.serverless.sample + serverless-quarkus-example + 1.0-SNAPSHOT + + 3.8.1 + true + 1.8 + 1.8 + UTF-8 + UTF-8 + 1.0.1.Final + quarkus-universe-bom + io.quarkus + 1.0.1.Final + 2.22.1 + + + + + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + + + + + + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-amazon-lambda-http + + + io.quarkus + quarkus-spring-web + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + + + io.quarkus + quarkus-maven-plugin + ${quarkus-plugin.version} + + + + build + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + + + + + + + + native + + + native + + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + zip-assembly + package + + single + + + function + + src/assembly/zip.xml + + false + false + + + + + + + + native + + + + diff --git a/samples/quarkus/pet-store/sam.native.yaml b/samples/quarkus/pet-store/sam.native.yaml new file mode 100644 index 00000000..54ca55d0 --- /dev/null +++ b/samples/quarkus/pet-store/sam.native.yaml @@ -0,0 +1,36 @@ + AWSTemplateFormatVersion: '2010-09-09' + Transform: AWS::Serverless-2016-10-31 + Description: AWS Serverless Quarkus HTTP - com.amazon.quarkus.demo::pet-store + Globals: + Api: + EndpointConfiguration: REGIONAL + BinaryMediaTypes: + - "*/*" + + Resources: + PetStoreNativeFunction: + Type: AWS::Serverless::Function + Properties: + Handler: not.used.in.provided.runtime + Runtime: provided + CodeUri: target/function.zip + MemorySize: 128 + Policies: AWSLambdaBasicExecutionRole + Tracing: Active + Timeout: 15 + Environment: + Variables: + DISABLE_SIGNAL_HANDLERS: true + Events: + GetResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + + Outputs: + PetStoreNativeApi: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/' + Export: + Name: PetStoreNativeApi diff --git a/samples/quarkus/pet-store/src/assembly/zip.xml b/samples/quarkus/pet-store/src/assembly/zip.xml new file mode 100644 index 00000000..ce2cb642 --- /dev/null +++ b/samples/quarkus/pet-store/src/assembly/zip.xml @@ -0,0 +1,17 @@ + + lambda-package + + zip + + false + + + ${project.build.directory}${file.separator}${artifactId}-${version}-runner + / + bootstrap + 755 + + + diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java new file mode 100644 index 00000000..57188785 --- /dev/null +++ b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.sample.quarkus; + +import com.amazonaws.serverless.sample.quarkus.model.Pet; +import com.amazonaws.serverless.sample.quarkus.model.PetData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Optional; +import java.util.UUID; + +@RestController +public class PetsController { + + private PetData petData; + + @Autowired + public PetsController(PetData data) { + petData = data; + } + + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(petData.getRandomName()); + newPet.setBreed(petData.getRandomBreed()); + newPet.setDateOfBirth(petData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet getPet(@RequestParam("petId") String petId) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(petData.getRandomBreed()); + newPet.setDateOfBirth(petData.getRandomDoB()); + newPet.setName(petData.getRandomName()); + return newPet; + } + +} diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java new file mode 100644 index 00000000..47521336 --- /dev/null +++ b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.sample.quarkus.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.quarkus.runtime.annotations.RegisterForReflection; + +import java.util.Date; + +@RegisterForReflection +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + @JsonProperty("petId") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @JsonFormat(pattern = "YYYY-mm-dd") + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + +} diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java new file mode 100644 index 00000000..90b837d0 --- /dev/null +++ b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java @@ -0,0 +1,102 @@ +package com.amazonaws.serverless.sample.quarkus.model; + +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +@Component +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public List getBreeds() { + return breeds; + } + + public List getNames() { + return names; + } + + public String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/quarkus/pet-store/src/main/resources/application.properties b/samples/quarkus/pet-store/src/main/resources/application.properties new file mode 100644 index 00000000..ee9b09c9 --- /dev/null +++ b/samples/quarkus/pet-store/src/main/resources/application.properties @@ -0,0 +1,4 @@ +quarkus.native.container-build=true +quarkus.native.container-runtime=docker +quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.2.1 +quarkus.log.level=INFO \ No newline at end of file From 21430d65062f5f072a376f1d6e89ed7158b59ae8 Mon Sep 17 00:00:00 2001 From: sullis Date: Wed, 8 Jan 2020 08:14:21 -0800 Subject: [PATCH 0356/1214] GitHub Actions checkout v2 (#312) --- .../workflows/continuous-integration-workflow.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 1937e03d..c1b10ca7 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -10,7 +10,7 @@ jobs: name: Build and test core runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest run: mvn -q clean install working-directory: ./aws-serverless-java-container-core @@ -19,7 +19,7 @@ jobs: name: Build and test Jersey runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh jersey true true - name: Build Jersey 2.26 @@ -33,7 +33,7 @@ jobs: name: Build and test Spark runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh spark true true - name: Build Spark 2.8.0 @@ -43,7 +43,7 @@ jobs: name: Build and test Spring & SpringBoot runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh spring true true - name: Build Spring 4.3 @@ -55,7 +55,7 @@ jobs: name: Build and test SpringBoot 2 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh springboot2 true true - name: Build Spring Boot 2.0 @@ -69,6 +69,6 @@ jobs: name: Build and test Struts 2 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Build latest - run: ./gha_build.sh struts2 true true \ No newline at end of file + run: ./gha_build.sh struts2 true true From 3b5177566e63ae79eb67ccf6d9ce8a5774de2281 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2020 21:42:29 -0700 Subject: [PATCH 0357/1214] Bump spring.version in /samples/spring/pet-store (#320) Bumps `spring.version` from 5.1.9.RELEASE to 5.2.3.RELEASE. Updates `spring-webmvc` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.3.RELEASE) Updates `spring-context` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.3.RELEASE) Updates `spring-context-indexer` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.3.RELEASE) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index d25d1dc0..86d26471 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.1.9.RELEASE + 5.2.3.RELEASE 4.12 2.8.2 From dce832e2efcf5f0ccd0779a35bc49b56b3bc7deb Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Sat, 28 Mar 2020 22:40:46 -0700 Subject: [PATCH 0358/1214] chore(deps): Bump default Spring version to 5.2.x --- aws-serverless-java-container-spring/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 01bab305..5b6117cb 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,9 +16,9 @@ - 5.1.9.RELEASE + 5.2.5.RELEASE 1.5.22.RELEASE - 5.1.5.RELEASE + 5.2.2.RELEASE From 41ac2cbb5fd7af2e76e5e47d5e6f6c72ad35d87b Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Sat, 28 Mar 2020 22:42:31 -0700 Subject: [PATCH 0359/1214] patch: Added CI against spring 5.1 and 5.2. Updated unit tests to skip SpringBoot tests when running against Spring 5.2 since SpringBoot 1.5 is deprecated and newer breaking changes are not supported --- .../workflows/continuous-integration-workflow.yml | 6 ++++++ .../serverless/proxy/spring/SlowAppTest.java | 8 ++++++++ .../serverless/proxy/spring/SpringBootAppTest.java | 13 ++++++++++++- .../proxy/spring/SpringBootSecurityTest.java | 12 ++++++++++++ .../ServerlessServletEmbeddedServerFactoryTest.java | 12 ++++++++++++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c1b10ca7..1dfb971d 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -50,6 +50,12 @@ jobs: run: ./gha_build.sh spring false false -Dspring.version=4.3.25.RELEASE -Dspring-security.version=4.2.13.RELEASE - name: Build Spring 5.0 run: ./gha_build.sh spring false false -Dspring.version=5.0.15.RELEASE -Dspring-security.version=5.0.13.RELEASE + - name: Build Spring 5.1 + run: ./gha_build.sh spring false false -Dspring.version=5.1.14.RELEASE -Dspring-security.version=5.1.8.RELEASE + - name: Build Spring 5.2 + # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with + # Spring core 5.2 and above. SpringBoot 1.5 is deprecated + run: ./gha_build.sh spring false false -Dspring.version=5.2.5.RELEASE -Dspring-security.version=5.2.2.RELEASE -Djacoco.minCoverage=0.4 build_springboot2: name: Build and test SpringBoot 2 diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java index 2d149590..29bc83ee 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -11,10 +11,13 @@ import com.amazonaws.serverless.proxy.spring.springslowapp.SlowAppConfig; import org.junit.Assert; import org.junit.Test; +import org.springframework.core.SpringVersion; import java.time.Instant; +import java.util.Objects; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; public class SlowAppTest { @@ -40,6 +43,11 @@ public void springSlowApp_continuesInBackgroundThread_returnsCorrect() { @Test public void springBootSlowApp_continuesInBackgroundThread_returnsCorrect() { + // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer + // breaking changes in the latest Spring releases have not been supported in it. + // TODO: Update the check to verify any Spring version above 5.2 + assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); + SBLambdaHandler slowApp = null; try { slowApp = new SBLambdaHandler(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index 91a559ca..d453dfe4 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -12,16 +12,19 @@ import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestController; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.BeforeClass; import org.junit.Test; +import org.springframework.core.SpringVersion; import javax.ws.rs.core.HttpHeaders; import java.io.IOException; +import java.util.Objects; import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_HEADER_NAME; import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_QS_NAME; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; public class SpringBootAppTest { @@ -29,6 +32,14 @@ public class SpringBootAppTest { private MockLambdaContext context = new MockLambdaContext(); private ObjectMapper mapper = new ObjectMapper(); + @BeforeClass + public static void before() { + // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer + // breaking changes in the latest Spring releases have not been supported in it. + // TODO: Update the check to verify any Spring version above 5.2 + assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); + } + @Test public void testMethod_springSecurity_doesNotThrowException() { AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").build(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java index b8d50446..49ba0e00 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java @@ -12,13 +12,17 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import org.junit.BeforeClass; import org.junit.Test; +import org.springframework.core.SpringVersion; import javax.ws.rs.core.HttpHeaders; import java.io.IOException; import java.util.Base64; +import java.util.Objects; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; public class SpringBootSecurityTest { @@ -26,6 +30,14 @@ public class SpringBootSecurityTest { private MockLambdaContext context = new MockLambdaContext(); private ObjectMapper mapper = new ObjectMapper(); + @BeforeClass + public static void before() { + // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer + // breaking changes in the latest Spring releases have not been supported in it. + // TODO: Update the check to verify any Spring version above 5.2 + assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); + } + @Test public void correctUser_springSecurityBasicAuth_requestSucceeds() throws JsonProcessingException { String authValue = Base64.getMimeEncoder().encodeToString((TestSecurityConfig.USERNAME + ":" + TestSecurityConfig.PASSWORD).getBytes()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index b9e31a05..2ae76a6c 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -3,18 +3,30 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; +import org.junit.BeforeClass; import org.junit.Test; import org.springframework.boot.context.embedded.EmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerException; import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.core.SpringVersion; import javax.servlet.*; import java.io.IOException; +import java.util.Objects; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; public class ServerlessServletEmbeddedServerFactoryTest { + @BeforeClass + public static void before() { + // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer + // breaking changes in the latest Spring releases have not been supported in it. + // TODO: Update the check to verify any Spring version above 5.2 + assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); + } + // initialize a container handler to that the embedded factory can grab its instnace private SpringBootLambdaContainerHandler h = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); From 5c655bd904bc96e45449526e0a3e51ba1f65270f Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Sat, 28 Mar 2020 22:52:29 -0700 Subject: [PATCH 0360/1214] docs: Deprecated support for SpringBoot 1.5 --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 4cccb0bf..cb449568 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -38,9 +38,15 @@ * * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). * + * @deprecated Spring officially deprecated + * SpringBoot 1.5.x as of August 2019. We recommend upgrading to SpringBoot 2.1 or above. SpringBoot 2 is supported + * in the + * aws-serverless-java-container-springboot2 module. + * * @param The incoming event type * @param The expected return type */ +@Deprecated public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); From 4380cc05fb96ccc61f8a76ff6f6381bb3ab75260 Mon Sep 17 00:00:00 2001 From: Stefano Buliani <2996317+sapessi@users.noreply.github.com> Date: Wed, 8 Apr 2020 10:57:52 -0700 Subject: [PATCH 0361/1214] Draft pull request for 1.5 release (#331) * Bump spring.version in /aws-serverless-java-container-spring (#319) Bumps `spring.version` from 5.1.9.RELEASE to 5.2.3.RELEASE. Updates `spring-webmvc` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.3.RELEASE) Updates `spring-test` from 5.1.9.RELEASE to 5.2.3.RELEASE - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.3.RELEASE) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump spring-webflux in /aws-serverless-java-container-springboot2 (#318) Bumps [spring-webflux](https://github.com/spring-projects/spring-framework) from 5.1.9.RELEASE to 5.2.0.RELEASE. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v5.1.9.RELEASE...v5.2.0.RELEASE) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ci: Fixing Spring build to use 5.2 as latest * chore(deps): Bump Spring 5.1 path release to address a security vulnerability * chore(deps): Fixing usual spring dependency mess with exlusions out of the spring-security package used in the tests * Fix for issue #317 (#323) * fix issue 317 - use charset from request * update dependencies * update build dependencies, remove spring boot 2.0.x * restoring ci config Co-authored-by: Stefano Buliani <2996317+sapessi@users.noreply.github.com> * test: Fixed Spring security tests for SpringBoot 2, added validation tests and updated servlet tests to use the new servletApplication option * fix: Avoid flushing the response buffer if we are dispatching the request asynchronously. This was causing race conditions in the SpringBoot 2 WebFlux implementation - requests that had to run through security or validation filters took longer and the library flushed an empty request, which caused the status code to default to 200. This fix addresses issues #279, #304, and #306 * chore(deps): Bump spring dependency version and added webmvc optional dependency to truly support Servlet-only server * feat: New application type parameter to SpringBootLambdaContainerHandler that tells the framework whether to start a reactive or servlet-based embedded server. Also added a new servletApplication method to the builder object. * test: Fixed UTF-8 encoding test * ci: Fixed dependencies for CI run on SpringBoot 2 * ci: More Spring dependency convergence issues during CI * fix: Added null-check on getServerName in case the multi-value headers property is null. Unlikely outside of tests but better safe than sorry. This addresses #327 * fix: Changed servlet initialization mechanism so that servlet that requests load on startup are initialized right away, as part of the initialization() method call in LambdaServletContainerHandler. Also centralized the lazy Servlet initialization to the ServletExecutionFilter so that we don't have code scattered all around. This begins to address #287 * feat: Added new 0-parameter constructor for async initializer that uses the actual JVM start time to calculate the timeout milliseconds. Also added the new method to the builder object and deprecated the current method that receives a milliseconds epoch parameter. I'm not deprecating the constructor of the async initializer class that receives the parameter as it may still be useful for tests. This change was suggested in #287 * fix: Updated SpringBoot 1.x handler to use the new servlet initialization mechanism * ci: switch SpringBoot slow integration test to use a custom async time since the JVM is reused for both tests in the and we cannot reuse the actual JVM init time * feat: New models for HTTP API support for #329 * feat: First implementation of HTTP API servlet request, request reader, and security context writer - continuing to address #329 * test: Basic unit tests for the new HTTP API support in core library (#329) * feat: Updated log formatter to support both versions (1 and 2) of the proxy request model (#329) * feat: Further generified request readers to read to a generic HttpServletRequest rather than specific implementations of it. This makes it easier to create container handler implementations that support HTTP API, API Gateway, and ALB (#329) * test: Fixed tests for new logged and generified request readers * feat: Added HTTP API support to Jersey implementation with new getHttpApiV2ProxyHandler method (#329) * feat: Added HTTP API support to Spark implementation (#329) * feat: Added HTTP API support to Spring implementation (#329) * feat: HTTP API support in SpringBoot 2 implementation. bug: Fixed an issue with the implementation of AsyncContext where it wasn't dispatching if the handler wasn't set * feat: First pass of HTTP API support in struts 2 implementation (#329) * fix: Added support for HTTP APIs to the request dispatcher * chore(deps): Dependency bump all around. Rotated Jersey ci versions * fix: Updated stream handling logic to work with reactive applications as suggested in #316 * test: Added unit test to replicate #333 * feat: New configuration parameter to skip exception mapping and allow exception to bubble up from #307 * fix: Fixed spotbugs issue in RuntimeException cast * test: Added tests for more complex content types mentioned in issue #315 * docs: Updated samples to support SAM CLI operations out of the box to address #293 and switched to HTTP API by default * feat: Updated archetypes to work out of the box with the SAM CLI, continuing to address #293 * chore: License header pass on the entire project * fix: Set default value for setDisableException mapper in config to false * fix: Updated default initialization timeout to 20 seconds Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eran Medan --- .../continuous-integration-workflow.yml | 20 +- .gitignore | 4 + .../proxy/AsyncInitializationWrapper.java | 30 +- .../AwsHttpApiV2SecurityContextWriter.java | 26 + .../proxy/InitializationWrapper.java | 12 + .../serverless/proxy/LogFormatter.java | 14 +- .../serverless/proxy/RequestReader.java | 13 + .../internal/LambdaContainerHandler.java | 10 +- .../proxy/internal/SecurityUtils.java | 14 +- .../jaxrs/AwsHttpApiV2SecurityContext.java | 102 ++++ .../ApacheCombinedServletLogFormatter.java | 58 +- .../internal/servlet/AwsAsyncContext.java | 21 +- .../AwsHttpApiV2HttpServletRequestReader.java | 50 ++ .../AwsHttpApiV2ProxyHttpServletRequest.java | 521 ++++++++++++++++++ .../servlet/AwsHttpServletRequest.java | 341 +++++++++++- .../servlet/AwsHttpServletRequestWrapper.java | 12 + .../servlet/AwsHttpServletResponse.java | 8 +- .../internal/servlet/AwsHttpSession.java | 13 +- .../AwsLambdaServletContainerHandler.java | 31 +- .../servlet/AwsProxyHttpServletRequest.java | 394 +------------ .../AwsProxyHttpServletRequestReader.java | 6 +- .../AwsProxyHttpServletResponseWriter.java | 2 +- .../servlet/AwsProxyRequestDispatcher.java | 34 +- .../internal/servlet/AwsServletContext.java | 37 +- .../servlet/AwsServletInputStream.java | 76 +++ .../servlet/AwsServletRegistration.java | 35 +- .../internal/servlet/FilterChainManager.java | 39 +- .../proxy/internal/servlet/FilterHolder.java | 3 + .../ServletLambdaContainerHandlerBuilder.java | 48 ++ .../testutils/AwsProxyRequestBuilder.java | 159 +++++- .../proxy/internal/testutils/Timer.java | 14 +- .../serverless/proxy/model/AlbContext.java | 13 +- .../proxy/model/ContainerConfig.java | 37 +- .../serverless/proxy/model/Headers.java | 12 + .../proxy/model/HttpApiV2AuthorizerMap.java | 84 +++ .../proxy/model/HttpApiV2HttpContext.java | 61 ++ .../proxy/model/HttpApiV2JwtAuthorizer.java | 37 ++ .../proxy/model/HttpApiV2ProxyRequest.java | 121 ++++ .../model/HttpApiV2ProxyRequestContext.java | 117 ++++ .../proxy/model/MultiValuedTreeMap.java | 14 +- .../proxy/AsyncInitializationWrapperTest.java | 28 + .../internal/LambdaContainerHandlerTest.java | 105 ++++ .../jaxrs/HttpApiV2SecurityContextTest.java | 49 ++ ...ApacheCombinedServletLogFormatterTest.java | 9 +- .../internal/servlet/AwsAsyncContextTest.java | 13 +- ...HttpApiV2HttpServletRequestReaderTest.java | 44 ++ .../AwsProxyHttpServletRequestReaderTest.java | 13 +- .../AwsProxyHttpServletRequestTest.java | 155 +++--- .../AwsProxyRequestDispatcherTest.java | 22 +- ...vletLambdaContainerHandlerBuilderTest.java | 9 +- .../model/HttpApiV2ProxyRequestTest.java | 146 +++++ aws-serverless-java-container-jersey/pom.xml | 2 +- .../proxy/jersey/JerseyHandlerFilter.java | 14 +- .../jersey/JerseyLambdaContainerHandler.java | 71 ++- .../proxy/jersey/JerseyAwsProxyTest.java | 236 ++++---- .../proxy/jersey/JerseyParamEncodingTest.java | 104 ++-- .../spark/SparkLambdaContainerHandler.java | 46 +- .../embeddedserver/LambdaEmbeddedServer.java | 12 + .../LambdaEmbeddedServerFactory.java | 12 + .../spark/HelloWorldSparkStreamTest.java | 70 ++- aws-serverless-java-container-spring/pom.xml | 9 + .../SpringBootLambdaContainerHandler.java | 47 +- .../spring/SpringBootProxyHandlerBuilder.java | 38 +- ...SpringBootServletConfigurationSupport.java | 12 + .../spring/SpringLambdaContainerHandler.java | 48 +- .../spring/SpringProxyHandlerBuilder.java | 40 +- ...erverlessServletEmbeddedServerFactory.java | 12 + .../proxy/spring/SpringAwsProxyTest.java | 258 +++++---- .../proxy/spring/SpringBootAppTest.java | 67 ++- .../spring/echoapp/EchoSpringAppConfig.java | 47 -- .../spring/springbootapp/LambdaHandler.java | 50 +- .../springbootslowapp/SBLambdaHandler.java | 4 +- .../spring/springslowapp/LambdaHandler.java | 4 +- .../pom.xml | 138 ++++- .../SpringBootLambdaContainerHandler.java | 89 ++- .../spring/SpringBootProxyHandlerBuilder.java | 48 +- ...sReactiveServletEmbeddedServerFactory.java | 12 + ...erverlessServletEmbeddedServerFactory.java | 13 +- .../proxy/spring/SecurityAppTest.java | 7 - .../proxy/spring/ServletAppTest.java | 92 +++- .../proxy/spring/WebFluxAppTest.java | 40 +- ...rlessServletEmbeddedServerFactoryTest.java | 4 +- .../spring/securityapp/LambdaHandler.java | 3 +- .../spring/securityapp/MessageController.java | 7 +- .../securityapp/SecurityApplication.java | 14 + .../spring/securityapp/SecurityConfig.java | 51 +- .../securityapp/ServletApplication.java | 13 - .../spring/servletapp/LambdaHandler.java | 44 +- .../spring/servletapp/MessageController.java | 32 +- .../proxy/spring/servletapp/MessageData.java | 20 + .../spring/servletapp/ServletApplication.java | 5 +- .../proxy/spring/servletapp/UserData.java | 50 ++ .../proxy/spring/slowapp/LambdaHandler.java | 4 +- .../spring/webfluxapp/LambdaHandler.java | 44 +- .../spring/webfluxapp/MessageController.java | 14 +- .../proxy/spring/webfluxapp/MessageData.java | 20 + .../webfluxapp/WebFluxTestApplication.java | 10 +- .../Struts2LambdaContainerHandler.java | 50 +- .../proxy/struts2/Struts2LambdaHandler.java | 12 + .../proxy/struts2/Struts2AwsProxyTest.java | 155 +++--- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 95 ++-- .../resources/archetype-resources/pom.xml | 4 +- .../{sam.yaml => template.yml} | 4 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 97 ++-- .../archetype-resources/build.gradle | 2 +- .../resources/archetype-resources/pom.xml | 2 +- .../{sam.yaml => template.yml} | 4 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 97 ++-- .../archetype-resources/build.gradle | 6 +- .../resources/archetype-resources/pom.xml | 2 +- .../{sam.yaml => template.yml} | 4 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 97 ++-- .../archetype-resources/build.gradle | 5 +- .../{sam.yaml => template.yml} | 4 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 97 ++-- .../archetype-resources/build.gradle | 5 +- .../resources/archetype-resources/pom.xml | 2 +- .../{sam.yaml => template.yml} | 4 +- .../META-INF/maven/archetype-metadata.xml | 2 +- .../resources/archetype-resources/README.md | 97 ++-- .../archetype-resources/build.gradle | 10 +- .../resources/archetype-resources/pom.xml | 4 +- .../{sam.yaml => template.yml} | 4 +- gha_build.sh | 12 - owasp-suppression.xml | 10 - pom.xml | 9 +- samples/jersey/pet-store/README.md | 68 +-- samples/jersey/pet-store/build.gradle | 6 +- samples/jersey/pet-store/pom.xml | 4 +- .../pet-store/{sam.yaml => template.yml} | 12 +- samples/micronaut/pet-store/build.gradle | 2 +- samples/spark/pet-store/README.md | 68 +-- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- .../pet-store/{sam.yaml => template.yml} | 12 +- samples/spring/pet-store/README.md | 68 +-- samples/spring/pet-store/build.gradle | 6 +- samples/spring/pet-store/pom.xml | 2 +- .../pet-store/{sam.yaml => template.yml} | 12 +- samples/springboot/pet-store/README.md | 68 +-- samples/springboot/pet-store/build.gradle | 5 +- .../pet-store/{sam.yaml => template.yml} | 12 +- samples/springboot2/pet-store/README.md | 68 +-- samples/springboot2/pet-store/build.gradle | 7 +- samples/springboot2/pet-store/pom.xml | 4 +- .../filter/CognitoIdentityFilter.java | 1 + .../pet-store/{sam.yaml => template.yml} | 12 +- samples/struts2/pet-store/README.md | 66 +-- samples/struts2/pet-store/build.gradle | 10 +- samples/struts2/pet-store/pom.xml | 4 +- .../pet-store/{sam.yaml => template.yml} | 12 +- 156 files changed, 4579 insertions(+), 2073 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2HttpContext.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2JwtAuthorizer.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java delete mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java rename aws-serverless-jersey-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (94%) rename aws-serverless-spark-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (94%) rename aws-serverless-spring-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (94%) rename aws-serverless-springboot-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (94%) rename aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (94%) rename aws-serverless-struts2-archetype/src/main/resources/archetype-resources/{sam.yaml => template.yml} (95%) rename samples/jersey/pet-store/{sam.yaml => template.yml} (71%) rename samples/spark/pet-store/{sam.yaml => template.yml} (71%) rename samples/spring/pet-store/{sam.yaml => template.yml} (71%) rename samples/springboot/pet-store/{sam.yaml => template.yml} (72%) rename samples/springboot2/pet-store/{sam.yaml => template.yml} (72%) rename samples/struts2/pet-store/{sam.yaml => template.yml} (72%) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 1dfb971d..02584830 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -22,12 +22,12 @@ jobs: - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh jersey true true - - name: Build Jersey 2.26 - run: ./gha_build.sh jersey false false -Djersey.version=2.26 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 - name: Build Jersey 2.28 run: ./gha_build.sh jersey false false -Djersey.version=2.28 + - name: Build Jersey 2.29 + run: ./gha_build.sh jersey false false -Djersey.version=2.29.1 build_spark: name: Build and test Spark @@ -45,17 +45,15 @@ jobs: steps: - uses: actions/checkout@v2 - name: Build latest - run: ./gha_build.sh spring true true + # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with + # Spring core 5.2 and above. SpringBoot 1.5 is deprecated + run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - name: Build Spring 4.3 run: ./gha_build.sh spring false false -Dspring.version=4.3.25.RELEASE -Dspring-security.version=4.2.13.RELEASE - name: Build Spring 5.0 - run: ./gha_build.sh spring false false -Dspring.version=5.0.15.RELEASE -Dspring-security.version=5.0.13.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.0.16.RELEASE -Dspring-security.version=5.0.14.RELEASE - name: Build Spring 5.1 run: ./gha_build.sh spring false false -Dspring.version=5.1.14.RELEASE -Dspring-security.version=5.1.8.RELEASE - - name: Build Spring 5.2 - # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with - # Spring core 5.2 and above. SpringBoot 1.5 is deprecated - run: ./gha_build.sh spring false false -Dspring.version=5.2.5.RELEASE -Dspring-security.version=5.2.2.RELEASE -Djacoco.minCoverage=0.4 build_springboot2: name: Build and test SpringBoot 2 @@ -65,11 +63,9 @@ jobs: - name: Build latest run: ./gha_build.sh springboot2 true true - name: Build Spring Boot 2.0 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.13.RELEASE -Dspringsecurity.version=5.0.12.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.16.RELEASE -Dspringsecurity.version=5.0.14.RELEASE - name: Build Spring Boot 2.1 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.10.RELEASE -Dspring.version=5.1.11.RELEASE -Dspringsecurity.version=5.1.7.RELEASE - - name: Build Spring Boot 2.2 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.1.RELEASE -Dspring.version=5.2.1.RELEASE -Dspringsecurity.version=5.2.1.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.12.RELEASE -Dspring.version=5.1.13.RELEASE -Dspringsecurity.version=5.1.8.RELEASE build_struts2: name: Build and test Struts 2 diff --git a/.gitignore b/.gitignore index 870a2d42..8f6b9d35 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,7 @@ gradlew* # Exclude maven wrapper !/.mvn/wrapper/maven-wrapper.jar + +# SAM files +samconfig.toml +.aws-sam/ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index 7ef74fc8..813d8178 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -7,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.management.ManagementFactory; import java.time.Instant; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -25,7 +38,7 @@ * seconds has already been used up. */ public class AsyncInitializationWrapper extends InitializationWrapper { - private static final int INIT_GRACE_TIME_MS = 250; + private int INIT_GRACE_TIME_MS = 250; private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; private CountDownLatch initializationLatch; @@ -41,6 +54,15 @@ public AsyncInitializationWrapper(long startTime) { actualStartTime = startTime; } + /** + * Creates a new instance of the async initializer using the actual JVM start time as the starting point to measure + * the 10 seconds timeout. + */ + public AsyncInitializationWrapper() { + actualStartTime = ManagementFactory.getRuntimeMXBean().getStartTime(); + INIT_GRACE_TIME_MS = 150; + } + @Override public void start(LambdaContainerHandler handler) throws ContainerInitializationException { initializationLatch = new CountDownLatch(1); @@ -50,7 +72,7 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization try { long curTime = Instant.now().toEpochMilli(); // account for the time it took to call the various constructors with the actual start time + a grace of 500ms - long awaitTime = LAMBDA_MAX_INIT_TIME_MS - (curTime - actualStartTime) - INIT_GRACE_TIME_MS; + long awaitTime = (actualStartTime + LAMBDA_MAX_INIT_TIME_MS) - curTime - INIT_GRACE_TIME_MS; log.info("Async initialization will wait for " + awaitTime + "ms"); if (!initializationLatch.await(awaitTime, TimeUnit.MILLISECONDS)) { log.info("Initialization took longer than " + LAMBDA_MAX_INIT_TIME_MS + ", setting new CountDownLatch and " + @@ -65,6 +87,10 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization } } + public long getActualStartTimeMs() { + return actualStartTime; + } + @Override public CountDownLatch getInitializationLatch() { return initializationLatch; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java new file mode 100644 index 00000000..05d4ed1a --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java @@ -0,0 +1,26 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy; + +import com.amazonaws.serverless.proxy.internal.jaxrs.AwsHttpApiV2SecurityContext; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; + +import javax.ws.rs.core.SecurityContext; + +public class AwsHttpApiV2SecurityContextWriter implements SecurityContextWriter { + @Override + public SecurityContext writeSecurityContext(HttpApiV2ProxyRequest event, Context lambdaContext) { + return new AwsHttpApiV2SecurityContext(lambdaContext, event); + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java index 188a83bd..f7c96f8f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.ContainerInitializationException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java index cef0514d..dcd524f9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java @@ -1,9 +1,19 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy; - import javax.ws.rs.core.SecurityContext; - /** * Implementations of the log formatter interface are used by {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler} class to log each request * processed in the container. You can set the log formatter using the {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler#setLogFormatter(LogFormatter)} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index 096d49ca..e0203d76 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -65,7 +65,20 @@ public abstract class RequestReader { */ public static final String JAX_SECURITY_CONTEXT_PROPERTY = "com.amazonaws.serverless.jaxrs.securityContext"; + /** + * The key for the HTTP API request context passed by the services + */ + public static final String HTTP_API_CONTEXT_PROPERTY = "com.amazonaws.httpapi.request.context"; + /** + * The key for the HTTP API stage variables + */ + public static final String HTTP_API_STAGE_VARS_PROPERTY = "com.amazonaws.httpapi.stage.variables"; + + /** + * The key for the HTTP API proxy request event + */ + public static final String HTTP_API_EVENT_PROPERTY = "com.amazonaws.httpapi.request"; //------------------------------------------------------------- // Methods - Abstract diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index 3bb401d1..d31ae257 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -223,7 +223,15 @@ public ResponseType proxy(RequestType request, Context context) { // the latch will do nothing latch.countDown(); - return exceptionHandler.handle(e); + if (getContainerConfig().isDisableExceptionMapper()) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } else { + throw new RuntimeException(e); + } + } else { + return exceptionHandler.handle(e); + } } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index 1d39d849..3395b56c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,7 +22,6 @@ import java.util.Locale; import java.util.Set; - /** * This class contains utility methods to address FSB security issues found in the application, such as string sanitization * and file path validation. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java new file mode 100644 index 00000000..6060fb2e --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java @@ -0,0 +1,102 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.internal.jaxrs; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.SecurityContext; +import java.nio.charset.StandardCharsets; +import java.security.Principal; +import java.util.Base64; + +public class AwsHttpApiV2SecurityContext implements SecurityContext { + public static final String AUTH_SCHEME_JWT = "JWT"; + + private static Logger log = LoggerFactory.getLogger(AwsHttpApiV2SecurityContext.class); + + private Context lambdaContext; + private HttpApiV2ProxyRequest event; + + public AwsHttpApiV2SecurityContext(final Context lambdaCtx, final HttpApiV2ProxyRequest request) { + lambdaContext = lambdaCtx; + event = request; + } + + @Override + public Principal getUserPrincipal() { + if (getAuthenticationScheme() == null || !event.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { + return null; + } + + String authValue = event.getHeaders().get(HttpHeaders.AUTHORIZATION); + if (authValue.startsWith("Bearer ")) { + authValue = authValue.replace("Bearer ", ""); + } + String[] parts = authValue.split("\\."); + if (parts.length != 3) { + log.warn("Could not parse JWT token for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId())); + return null; + } + String decodedBody = new String(Base64.getMimeDecoder().decode(parts[1]), StandardCharsets.UTF_8); + try { + JsonNode parsedBody = LambdaContainerHandler.getObjectMapper().readTree(decodedBody); + if (!parsedBody.isObject() && parsedBody.has("sub")) { + log.debug("Could not find \"sub\" field in JWT body for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId())); + return null; + } + String subject = parsedBody.get("sub").asText(); + return (() -> { + return subject; + }); + } catch (JsonProcessingException e) { + log.error("Error while attempting to parse JWT body for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId()), e); + return null; + } + + } + + @Override + public boolean isUserInRole(String s) { + if (getAuthenticationScheme() == null) { + return false; + } + + return event.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().contains(s) || + event.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey(s); + + } + + @Override + public boolean isSecure() { + return getAuthenticationScheme() != null; + } + + @Override + public String getAuthenticationScheme() { + if (event.getRequestContext().getAuthorizer() == null) { + return null; + } + if (event.getRequestContext().getAuthorizer().isJwt()) { + return AUTH_SCHEME_JWT; + } + return null; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index 2105ffae..715e6f8d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -1,10 +1,22 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; - import com.amazonaws.serverless.proxy.LogFormatter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.servlet.http.HttpServletRequest; @@ -16,7 +28,7 @@ import java.time.format.DateTimeFormatterBuilder; import java.util.Locale; -import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.*; import static java.time.temporal.ChronoField.DAY_OF_MONTH; import static java.time.temporal.ChronoField.HOUR_OF_DAY; import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; @@ -24,7 +36,6 @@ import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; import static java.time.temporal.ChronoField.YEAR; - /** * Default implementation of the log formatter. Based on an HttpServletRequest and HttpServletResponse implementations produced * a log line in the Apache combined log format: https://httpd.apache.org/docs/2.4/logs.html @@ -68,45 +79,45 @@ public ApacheCombinedServletLogFormatter() { public String format(ContainerRequestType servletRequest, ContainerResponseType servletResponse, SecurityContext ctx) { //LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined StringBuilder logLineBuilder = new StringBuilder(); - AwsProxyRequest req = (AwsProxyRequest)servletRequest.getAttribute(API_GATEWAY_EVENT_PROPERTY); - AwsProxyRequestContext gatewayContext = req.getRequestContext(); + AwsProxyRequestContext gatewayContext = (AwsProxyRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY); + HttpApiV2ProxyRequestContext httpApiContext = (HttpApiV2ProxyRequestContext)servletRequest.getAttribute(HTTP_API_CONTEXT_PROPERTY); // %h logLineBuilder.append(servletRequest.getRemoteAddr()); logLineBuilder.append(" "); // %l - if (gatewayContext != null && req.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { - if (gatewayContext.getIdentity().getUserArn() != null) { + if (servletRequest.getUserPrincipal() != null) { + logLineBuilder.append(servletRequest.getUserPrincipal().getName()); + } else { + logLineBuilder.append("-"); + } + if (gatewayContext != null && gatewayContext.getIdentity() != null && gatewayContext.getIdentity().getUserArn() != null) { logLineBuilder.append(gatewayContext.getIdentity().getUserArn()); - } else { - logLineBuilder.append("-"); - } } else { logLineBuilder.append("-"); } logLineBuilder.append(" "); // %u - if (ctx != null && ctx.getUserPrincipal().getName() != null) { - logLineBuilder.append(ctx.getUserPrincipal().getName()); - logLineBuilder.append(" "); + if (servletRequest.getUserPrincipal() != null) { + logLineBuilder.append(servletRequest.getUserPrincipal().getName()); } + logLineBuilder.append(" "); // %t + long timeEpoch = ZonedDateTime.now(clock).toEpochSecond(); if (gatewayContext != null && gatewayContext.getRequestTimeEpoch() > 0) { - logLineBuilder.append( - dateFormat.format( - ZonedDateTime.of( - LocalDateTime.ofEpochSecond(gatewayContext.getRequestTimeEpoch() / 1000, 0, ZoneOffset.UTC), - clock.getZone() - ) - ) - ); - } else { - logLineBuilder.append(dateFormat.format(ZonedDateTime.now(clock))); + timeEpoch = gatewayContext.getRequestTimeEpoch() / 1000; + } else if (httpApiContext != null && httpApiContext.getTimeEpoch() > 0) { + timeEpoch = httpApiContext.getTimeEpoch() / 1000; } + logLineBuilder.append( + dateFormat.format(ZonedDateTime.of( + LocalDateTime.ofEpochSecond(timeEpoch, 0, ZoneOffset.UTC), + clock.getZone()) + )); logLineBuilder.append(" "); // %r @@ -155,7 +166,6 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType logLineBuilder.append("combined"); - return logLineBuilder.toString(); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 0b35d7ba..25162454 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; - import com.amazonaws.serverless.proxy.internal.SecurityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,10 +70,12 @@ public boolean hasOriginalRequestAndResponse() { public void dispatch() { try { log.debug("Dispatching request"); - notifyListeners(NotificationType.START_ASYNC, null); - Servlet servlet = ((AwsServletContext)handler.getServletContext()).getServletForPath(req.getPathInfo()); - handler.doFilter(req, res, servlet); + if (dispatched.get()) { + throw new IllegalStateException("Dispatching already started"); + } dispatched.set(true); + notifyListeners(NotificationType.START_ASYNC, null); + handler.doFilter(req, res, ((AwsServletContext)req.getServletContext()).getServletForPath(req.getRequestURI())); } catch (ServletException | IOException e) { notifyListeners(NotificationType.ERROR, e); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java new file mode 100644 index 00000000..bacedbaa --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java @@ -0,0 +1,50 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.SecurityContext; + +public class AwsHttpApiV2HttpServletRequestReader extends RequestReader { + static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid HTTP API v2 proxy request"; + + @Override + public HttpServletRequest readRequest(HttpApiV2ProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException { + if (request.getRequestContext() == null || request.getRequestContext().getHttp().getMethod() == null || request.getRequestContext().getHttp().getMethod().equals("")) { + throw new InvalidRequestEventException(INVALID_REQUEST_ERROR); + } + + // clean out the request path based on the container config + request.setRawPath(stripBasePath(request.getRawPath(), config)); + + AwsHttpApiV2ProxyHttpServletRequest servletRequest = new AwsHttpApiV2ProxyHttpServletRequest(request, lambdaContext, securityContext, config); + servletRequest.setAttribute(HTTP_API_CONTEXT_PROPERTY, request.getRequestContext()); + servletRequest.setAttribute(HTTP_API_STAGE_VARS_PROPERTY, request.getStageVariables()); + servletRequest.setAttribute(HTTP_API_EVENT_PROPERTY, request); + servletRequest.setAttribute(LAMBDA_CONTEXT_PROPERTY, lambdaContext); + servletRequest.setAttribute(JAX_SECURITY_CONTEXT_PROPERTY, securityContext); + + return servletRequest; + } + + @Override + protected Class getRequestClass() { + return HttpApiV2ProxyRequest.class; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java new file mode 100644 index 00000000..e65b506e --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -0,0 +1,521 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.Headers; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.services.lambda.runtime.Context; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.*; +import javax.servlet.http.*; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.SecurityContext; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.security.Principal; +import java.time.Instant; +import java.time.ZonedDateTime; +import java.time.format.DateTimeParseException; +import java.util.*; + +public class AwsHttpApiV2ProxyHttpServletRequest extends AwsHttpServletRequest { + private static Logger log = LoggerFactory.getLogger(AwsHttpApiV2ProxyHttpServletRequest.class); + + private HttpApiV2ProxyRequest request; + private MultiValuedTreeMap queryString; + private Headers headers; + private ContainerConfig config; + private SecurityContext securityContext; + private AwsAsyncContext asyncContext; + + /** + * Protected constructors for implementing classes. This should be called first with the context received from + * AWS Lambda + * + * @param lambdaContext The Lambda function context. This object is used for utility methods such as log + */ + public AwsHttpApiV2ProxyHttpServletRequest(HttpApiV2ProxyRequest req, Context lambdaContext, SecurityContext sc, ContainerConfig cfg) { + super(lambdaContext); + request = req; + config = cfg; + securityContext = sc; + queryString = parseRawQueryString(request.getRawQueryString()); + headers = headersMapToMultiValue(request.getHeaders()); + } + + public HttpApiV2ProxyRequest getRequest() { + return request; + } + + @Override + public String getAuthType() { + // TODO + return null; + } + + @Override + public Cookie[] getCookies() { + if (headers == null || !headers.containsKey(HttpHeaders.COOKIE)) { + return new Cookie[0]; + } + + return parseCookieHeaderValue(headers.getFirst(HttpHeaders.COOKIE)); + } + + @Override + public long getDateHeader(String s) { + if (headers == null) { + return -1L; + } + String dateString = headers.getFirst(s); + if (dateString == null) { + return -1L; + } + try { + return Instant.from(ZonedDateTime.parse(dateString, dateFormatter)).toEpochMilli(); + } catch (DateTimeParseException e) { + log.warn("Invalid date header in request: " + SecurityUtils.crlf(dateString)); + return -1L; + } + } + + @Override + public String getHeader(String s) { + if (headers == null) { + return null; + } + return headers.getFirst(s); + } + + @Override + public Enumeration getHeaders(String s) { + if (headers == null || !headers.containsKey(s)) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(headers.get(s)); + } + + @Override + public Enumeration getHeaderNames() { + if (headers == null) { + return Collections.emptyEnumeration(); + } + return Collections.enumeration(headers.keySet()); + } + + @Override + public int getIntHeader(String s) { + if (headers == null) { + return -1; + } + String headerValue = headers.getFirst(s); + if (headerValue == null || "".equals(headerValue)) { + return -1; + } + + return Integer.parseInt(headerValue); + } + + @Override + public String getMethod() { + return request.getRequestContext().getHttp().getMethod(); + } + + @Override + public String getPathInfo() { + String pathInfo = cleanUri(request.getRawPath()); + return decodeRequestPath(pathInfo, LambdaContainerHandler.getContainerConfig()); + } + + @Override + public String getPathTranslated() { + // Return null because it is an archive on a remote system + return null; + } + + @Override + public String getContextPath() { + return generateContextPath(config, request.getRequestContext().getStage()); + } + + @Override + public String getQueryString() { + return request.getRawQueryString(); + } + + @Override + public String getRemoteUser() { + if (securityContext == null || securityContext.getUserPrincipal() == null) { + return null; + } + return securityContext.getUserPrincipal().getName(); + } + + @Override + public boolean isUserInRole(String s) { + // TODO: Not supported + return false; + } + + @Override + public Principal getUserPrincipal() { + if (securityContext == null) { + return null; + } + return securityContext.getUserPrincipal(); + } + + @Override + public String getRequestURI() { + return cleanUri(getContextPath()) + cleanUri(request.getRawPath()); + } + + @Override + public StringBuffer getRequestURL() { + return generateRequestURL(request.getRawPath()); + } + + + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { + throw new UnsupportedOperationException(); + } + + @Override + public void login(String s, String s1) throws ServletException { + throw new UnsupportedOperationException(); + } + + @Override + public void logout() throws ServletException { + throw new UnsupportedOperationException(); + } + + @Override + public Collection getParts() throws IOException, ServletException { + return getMultipartFormParametersMap().values(); + } + + @Override + public Part getPart(String s) throws IOException, ServletException { + return getMultipartFormParametersMap().get(s); + } + + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + throw new UnsupportedOperationException(); + } + + @Override + public String getCharacterEncoding() { + if (headers == null) { + return config.getDefaultContentCharset(); + } + return parseCharacterEncoding(headers.getFirst(HttpHeaders.CONTENT_TYPE)); + } + + @Override + public void setCharacterEncoding(String s) throws UnsupportedEncodingException { + if (headers == null || !headers.containsKey(HttpHeaders.CONTENT_TYPE)) { + log.debug("Called set character encoding to " + SecurityUtils.crlf(s) + " on a request without a content type. Character encoding will not be set"); + return; + } + String currentContentType = headers.getFirst(HttpHeaders.CONTENT_TYPE); + headers.putSingle(HttpHeaders.CONTENT_TYPE, appendCharacterEncoding(currentContentType, s)); + } + + @Override + public int getContentLength() { + String headerValue = headers.getFirst(HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Integer.parseInt(headerValue); + } + + @Override + public long getContentLengthLong() { + String headerValue = headers.getFirst(HttpHeaders.CONTENT_LENGTH); + if (headerValue == null) { + return -1; + } + return Long.parseLong(headerValue); + } + + @Override + public String getContentType() { + if (headers == null) { + return null; + } + return headers.getFirst(HttpHeaders.CONTENT_TYPE); + } + + @Override + public String getParameter(String s) { + String queryStringParameter = getFirstQueryParamValue(queryString, s, config.isQueryStringCaseSensitive()); + if (queryStringParameter != null) { + return queryStringParameter; + } + + String[] bodyParams = getFormBodyParameterCaseInsensitive(s); + if (bodyParams.length == 0) { + return null; + } else { + return bodyParams[0]; + } + } + + @Override + public Enumeration getParameterNames() { + if (queryString == null) { + return Collections.emptyEnumeration(); + } + + return Collections.enumeration(queryString.keySet()); + } + + @Override + @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params + public String[] getParameterValues(String s) { + List values = new ArrayList<>(Arrays.asList(getQueryParamValues(queryString, s, config.isQueryStringCaseSensitive()))); + + values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); + + if (values.size() == 0) { + return null; + } else { + return values.toArray(new String[0]); + } + } + + @Override + public Map getParameterMap() { + return generateParameterMap(queryString, config); + } + + @Override + public String getProtocol() { + return request.getRequestContext().getHttp().getProtocol(); + } + + @Override + public String getScheme() { + return getSchemeFromHeader(headers); + } + + @Override + public String getServerName() { + // we match the behavior of the v1 proxy request here. Should we? + String region = System.getenv("AWS_REGION"); + if (region == null) { + // this is not a critical failure, we just put a static region in the URI + region = "us-east-1"; + } + + if (headers != null && headers.containsKey(HOST_HEADER_NAME)) { + String hostHeader = headers.getFirst(HOST_HEADER_NAME); + if (SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { + return hostHeader; + } + } + + return request.getRequestContext().getDomainName(); + } + + @Override + public int getServerPort() { + if (headers == null || !headers.containsKey(PORT_HEADER_NAME)) { + return 443; // we default to 443 as HTTP APIs can only be HTTPS + } + String port = headers.getFirst(PORT_HEADER_NAME); + if (SecurityUtils.isValidPort(port)) { + return Integer.parseInt(port); + } + return 443; // default port + } + + @Override + public ServletInputStream getInputStream() throws IOException { + if (requestInputStream == null) { + requestInputStream = new AwsServletInputStream(bodyStringToInputStream(request.getBody(), request.isBase64Encoded())); + } + return requestInputStream; + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new StringReader(request.getBody())); + } + + @Override + public String getRemoteAddr() { + if (request.getRequestContext() == null || request.getRequestContext().getHttp() == null || request.getRequestContext().getHttp().getSourceIp() == null) { + return "127.0.0.1"; + } + return request.getRequestContext().getHttp().getSourceIp(); + } + + @Override + public String getRemoteHost() { + if (headers == null) { + return null; + } + return headers.getFirst(HttpHeaders.HOST); + } + + @Override + public Locale getLocale() { + // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 + List values = this.parseHeaderValue( + headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" + ); + if (values.size() == 0) { + return Locale.getDefault(); + } + return new Locale(values.get(0).getValue()); + } + + @Override + public Enumeration getLocales() { + List values = this.parseHeaderValue( + headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" + ); + + List locales = new ArrayList<>(); + if (values.size() == 0) { + locales.add(Locale.getDefault()); + } else { + for (HeaderValue locale : values) { + locales.add(new Locale(locale.getValue())); + } + } + + return Collections.enumeration(locales); + } + + @Override + public boolean isSecure() { + return securityContext.isSecure(); + } + + @Override + public RequestDispatcher getRequestDispatcher(String s) { + return getServletContext().getRequestDispatcher(s); + } + + @Override + public String getRealPath(String s) { + // we are in an archive on a remote server + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public boolean isAsyncSupported() { + return true; + } + + @Override + public boolean isAsyncStarted() { + if (asyncContext == null) { + return false; + } + if (asyncContext.isCompleted() || asyncContext.isDispatched()) { + return false; + } + return true; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + asyncContext = new AwsAsyncContext(this, response, containerHandler); + setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); + log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); + return asyncContext; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); + log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); + return asyncContext; + } + + @Override + public AsyncContext getAsyncContext() { + if (asyncContext == null) { + throw new IllegalStateException("Request " + SecurityUtils.crlf(request.getRequestContext().getRequestId()) + + " is not in asynchronous mode. Call startAsync before attempting to get the async context."); + } + return asyncContext; + } + + private MultiValuedTreeMap parseRawQueryString(String qs) { + if (qs == null || "".equals(qs.trim())) { + return new MultiValuedTreeMap<>(); + } + + MultiValuedTreeMap qsMap = new MultiValuedTreeMap<>(); + for (String value : qs.split(QUERY_STRING_SEPARATOR)) { + if (!value.contains(QUERY_STRING_KEY_VALUE_SEPARATOR)) { + log.warn("Invalid query string parameter: " + SecurityUtils.crlf(value)); + continue; + } + + String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR); + try { + qsMap.add(URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding()), kv[1]); + } catch (UnsupportedEncodingException e) { + log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(kv[0]), e); + } + } + return qsMap; + } + + private Headers headersMapToMultiValue(Map headers) { + if (headers == null || headers.size() == 0) { + return new Headers(); + } + + Headers h = new Headers(); + for (Map.Entry hkv : headers.entrySet()) { + // Exceptions for known header values that contain commas + if (hkv.getKey().equalsIgnoreCase(HttpHeaders.DATE) || + hkv.getKey().equalsIgnoreCase(HttpHeaders.IF_MODIFIED_SINCE) || + hkv.getKey().toLowerCase(Locale.getDefault()).startsWith("accept-")) { + h.add(hkv.getKey(), hkv.getValue()); + continue; + } + + for (String value : hkv.getValue().split(",")) { + h.add(hkv.getKey(), value); + } + } + return h; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 35773cee..f02cefd1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -13,32 +13,36 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.*; import com.amazonaws.services.lambda.runtime.Context; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.NullInputStream; import org.apache.http.message.BasicHeaderValueParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import javax.servlet.http.*; +import javax.ws.rs.core.MediaType; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -59,6 +63,8 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final DateTimeFormatter dateFormatter = DateTimeFormatter.RFC_1123_DATE_TIME; static final String ENCODING_VALUE_KEY = "charset"; static final String DISPATCHER_TYPE_ATTRIBUTE = "com.amazonaws.serverless.javacontainer.dispatchertype"; + static final String QUERY_STRING_SEPARATOR = "&"; + static final String QUERY_STRING_KEY_VALUE_SEPARATOR = "="; // We need this to pickup the protocol from the CloudFront header since Lambda doesn't receive this // information from anywhere else @@ -78,6 +84,13 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private AwsHttpSession session; private String queryString; private BasicHeaderValueParser headerParser; + private Map multipartFormParameters; + private Map> urlEncodedFormParameters; + + protected AwsHttpServletResponse response; + protected AwsLambdaServletContainerHandler containerHandler; + protected ServletInputStream requestInputStream; + private static Logger log = LoggerFactory.getLogger(AwsHttpServletRequest.class); @@ -98,6 +111,18 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.REQUEST); } + public AwsHttpServletResponse getResponse() { + return response; + } + + public void setResponse(AwsHttpServletResponse response) { + this.response = response; + } + + public void setContainerHandler(AwsLambdaServletContainerHandler containerHandler) { + this.containerHandler = containerHandler; + } + //------------------------------------------------------------- // Implementation - HttpServletRequest @@ -247,6 +272,12 @@ public DispatcherType getDispatcherType() { return DispatcherType.REQUEST; } + @Override + public String getServletPath() { + // we always work on the root path + return ""; + } + //------------------------------------------------------------- // Methods - Getter/Setter @@ -323,6 +354,257 @@ protected String generateQueryString(MultiValuedTreeMap paramete return queryString; } + protected String generateContextPath(ContainerConfig config, String apiStage) { + String contextPath = ""; + if (config.isUseStageAsServletContext() && apiStage != null) { + log.debug("Using stage as context path"); + contextPath = cleanUri(apiStage); + } + if (config.getServiceBasePath() != null) { + contextPath += cleanUri(config.getServiceBasePath()); + } + + return contextPath; + } + + protected StringBuffer generateRequestURL(String requestPath) { + String url = ""; + url += getServerName(); + url += cleanUri(getContextPath()); + url += cleanUri(requestPath); + + return new StringBuffer(getScheme() + "://" + url); + } + + protected String parseCharacterEncoding(String contentTypeHeader) { + // we only look at content-type because content-encoding should only be used for + // "binary" requests such as gzip/deflate. + if (contentTypeHeader == null) { + return null; + } + + String[] contentTypeValues = contentTypeHeader.split(HEADER_VALUE_SEPARATOR); + if (contentTypeValues.length <= 1) { + return null; + } + + for (String contentTypeValue : contentTypeValues) { + if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { + String[] encodingValues = contentTypeValue.split(HEADER_KEY_VALUE_SEPARATOR); + if (encodingValues.length <= 1) { + return null; + } + return encodingValues[1]; + } + } + return null; + } + + protected String appendCharacterEncoding(String currentContentType, String newEncoding) { + if (currentContentType == null || "".equals(currentContentType.trim())) { + return null; + } + + if (currentContentType.contains(HEADER_VALUE_SEPARATOR)) { + String[] contentTypeValues = currentContentType.split(HEADER_VALUE_SEPARATOR); + StringBuilder contentType = new StringBuilder(contentTypeValues[0]); + + for (int i = 1; i < contentTypeValues.length; i++) { + String contentTypeValue = contentTypeValues[i]; + String contentTypeString = HEADER_VALUE_SEPARATOR + " " + contentTypeValue; + if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { + contentTypeString = HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + newEncoding; + } + contentType.append(contentTypeString); + } + + return contentType.toString(); + } else { + return currentContentType + HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + newEncoding; + } + } + + protected ServletInputStream bodyStringToInputStream(String body, boolean isBase64Encoded) throws IOException { + if (body == null) { + return new AwsServletInputStream(new NullInputStream(0, false, false)); + } + byte[] bodyBytes; + if (isBase64Encoded) { + bodyBytes = Base64.getMimeDecoder().decode(body); + } else { + String encoding = getCharacterEncoding(); + if (encoding == null) { + encoding = StandardCharsets.ISO_8859_1.name(); + } + try { + bodyBytes = body.getBytes(encoding); + } catch (Exception e) { + log.error("Could not read request with character encoding: " + SecurityUtils.crlf(encoding), e); + bodyBytes = body.getBytes(StandardCharsets.ISO_8859_1.name()); + } + } + ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); + return new AwsServletInputStream(requestBodyStream); + } + + protected String getFirstQueryParamValue(MultiValuedTreeMap queryString, String key, boolean isCaseSensitive) { + if (queryString != null) { + if (isCaseSensitive) { + return queryString.getFirst(key); + } + + for (String k : queryString.keySet()) { + if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { + return queryString.getFirst(k); + } + } + } + + return null; + } + + protected String[] getFormBodyParameterCaseInsensitive(String key) { + List values = getFormUrlEncodedParametersMap().get(key); + if (values != null) { + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + return valuesArray; + } else { + return new String[0]; + } + } + + + protected Map> getFormUrlEncodedParametersMap() { + if (urlEncodedFormParameters != null) { + return urlEncodedFormParameters; + } + String contentType = getContentType(); + if (contentType == null) { + urlEncodedFormParameters = new HashMap<>(); + return urlEncodedFormParameters; + } + if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase(Locale.ENGLISH).equals("post")) { + urlEncodedFormParameters = new HashMap<>(); + return urlEncodedFormParameters; + } + Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS"); + String rawBodyContent = null; + try { + rawBodyContent = IOUtils.toString(getInputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } + + urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { + String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR); + if (parameterKeyValue.length < 2) { + continue; + } + List values = new ArrayList<>(); + if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) { + values = urlEncodedFormParameters.get(parameterKeyValue[0]); + } + values.add(decodeValueIfEncoded(parameterKeyValue[1])); + urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values); + } + Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS"); + return urlEncodedFormParameters; + } + + @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) + protected Map getMultipartFormParametersMap() { + if (multipartFormParameters != null) { + return multipartFormParameters; + } + if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type + multipartFormParameters = new HashMap<>(); + return multipartFormParameters; + } + Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); + + try { + List items = upload.parseRequest(this); + for (FileItem item : items) { + String fileName = FilenameUtils.getName(item.getName()); + AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); + newPart.setName(item.getFieldName()); + newPart.setSubmittedFileName(fileName); + newPart.setContentType(item.getContentType()); + newPart.setSize(item.getSize()); + item.getHeaders().getHeaderNames().forEachRemaining(h -> { + newPart.addHeader(h, item.getHeaders().getHeader(h)); + }); + + multipartFormParameters.put(item.getFieldName(), newPart); + } + } catch (FileUploadException e) { + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + log.error("Could not read multipart upload file", e); + } + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + return multipartFormParameters; + } + + protected String[] getQueryParamValues(MultiValuedTreeMap qs, String key, boolean isCaseSensitive) { + if (qs != null) { + if (isCaseSensitive) { + return qs.get(key).toArray(new String[0]); + } + + for (String k : qs.keySet()) { + if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { + return qs.get(k).toArray(new String[0]); + } + } + } + + return new String[0]; + } + + protected Map generateParameterMap(MultiValuedTreeMap qs, ContainerConfig config) { + Map output = new HashMap<>(); + + Map> params = getFormUrlEncodedParametersMap(); + params.entrySet().stream().parallel().forEach(e -> { + output.put(e.getKey(), e.getValue().toArray(new String[0])); + }); + + if (qs != null) { + qs.keySet().stream().parallel().forEach(e -> { + List newValues = new ArrayList<>(); + if (output.containsKey(e)) { + String[] values = output.get(e); + newValues.addAll(Arrays.asList(values)); + } + newValues.addAll(Arrays.asList(getQueryParamValues(qs, e, config.isQueryStringCaseSensitive()))); + output.put(e, newValues.toArray(new String[0])); + }); + } + + return output; + } + + protected String getSchemeFromHeader(Headers headers) { + // if we don't have any headers to deduce the value we assume HTTPS - API Gateway's default + if (headers == null) { + return "https"; + } + String cfScheme = headers.getFirst(CF_PROTOCOL_HEADER_NAME); + if (cfScheme != null && SecurityUtils.isValidScheme(cfScheme)) { + return cfScheme; + } + String gwScheme = headers.getFirst(PROTOCOL_HEADER_NAME); + if (gwScheme != null && SecurityUtils.isValidScheme(gwScheme)) { + return gwScheme; + } + // https is our default scheme + return "https"; + } /** * Prases a header value using the default value separator "," and qualifier separator ";". @@ -426,6 +708,39 @@ static String decodeRequestPath(String requestPath, ContainerConfig config) { } + static String cleanUri(String uri) { + String finalUri = (uri == null ? "/" : uri); + if (finalUri.equals("/")) { + return finalUri; + } + + if (!finalUri.startsWith("/")) { + finalUri = "/" + finalUri; + } + + if (finalUri.endsWith("/")) { + finalUri = finalUri.substring(0, finalUri.length() - 1); + } + + finalUri = finalUri.replaceAll("/+", "/"); + + return finalUri; + } + + static String decodeValueIfEncoded(String value) { + if (value == null) { + return null; + } + + try { + return URLDecoder.decode(value, LambdaContainerHandler.getContainerConfig().getUriEncoding()); + } catch (UnsupportedEncodingException e) { + log.warn("Could not decode body content - proceeding as if it was already decoded", e); + return value; + } + } + + /** * Class that represents a header value. */ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java index a8ee1840..e151c03d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index da695c50..153cdb91 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -419,7 +419,13 @@ public void flushBuffer() throws IOException { if (null != writer) { writer.flush(); } - responseBody = new String(bodyOutputStream.toByteArray(), LambdaContainerHandler.getContainerConfig().getDefaultContentCharset()); + String charset = characterEncoding; + + if(charset == null) { + charset = LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(); + } + + responseBody = new String(bodyOutputStream.toByteArray(), charset); log.debug("Response buffer flushed with {} bytes, latch={}", responseBody.length(), writersCountDownLatch.getCount()); isCommitted = true; writersCountDownLatch.countDown(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 1ac0908f..8c3df7f8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; import org.slf4j.Logger; @@ -13,7 +25,6 @@ import java.util.HashMap; import java.util.Map; - /** * This class emulates the behavior of an HTTP session. At the moment a new instance of this class * is created for each request/event. In the future, we may define a session id resolver interface diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 95af74e6..52631da5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.ExceptionHandler; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.RequestReader; @@ -28,7 +29,8 @@ import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** @@ -146,15 +148,38 @@ protected FilterChain getFilterChain(HttpServletRequest req, Servlet servlet) { * @throws ServletException */ protected void doFilter(HttpServletRequest request, HttpServletResponse response, Servlet servlet) throws IOException, ServletException { + if (AwsHttpServletRequest.class.isAssignableFrom(request.getClass())) { + ((AwsHttpServletRequest)request).setContainerHandler(this); + } + FilterChain chain = getFilterChain(request, servlet); chain.doFilter(request, response); - // if for some reason the response wasn't flushed yet, we force it here. - if (!response.isCommitted()) { + // if for some reason the response wasn't flushed yet, we force it here unless it's being processed asynchronously (WebFlux) + if (!response.isCommitted() && request.getDispatcherType() != DispatcherType.ASYNC) { response.flushBuffer(); } } + @Override + public void initialize() throws ContainerInitializationException { + // we expect all servlets to be wrapped in an AwsServletRegistration + ArrayList registrations = new ArrayList<>((Collection)getServletContext().getServletRegistrations().values()); + registrations.sort(AwsServletRegistration::compareTo); + for (AwsServletRegistration r : registrations) { + if (r.getLoadOnStartup() == -1) { // skip Servlets that can be lazily loaded + continue; + } + try { + if (r.getServlet() != null) { + r.getServlet().init(r.getServletConfig()); + } + } catch (ServletException e) { + throw new ContainerInitializationException("Could not initialize servlet " + r.getName(), e); + } + } + } + //------------------------------------------------------------- // Inner Class - //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 8d58850c..97ae055b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -15,52 +15,36 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.*; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.SecurityContext; import java.io.BufferedReader; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.security.Principal; import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Base64; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.TreeMap; /** @@ -77,12 +61,8 @@ public class AwsProxyHttpServletRequest extends AwsHttpServletRequest { private AwsProxyRequest request; private SecurityContext securityContext; private AwsAsyncContext asyncContext; - private Map> urlEncodedFormParameters; - private Map multipartFormParameters; private static Logger log = LoggerFactory.getLogger(AwsProxyHttpServletRequest.class); private ContainerConfig config; - private AwsHttpServletResponse response; - private AwsLambdaServletContainerHandler containerHandler; //------------------------------------------------------------- // Constructors @@ -101,23 +81,10 @@ public AwsProxyHttpServletRequest(AwsProxyRequest awsProxyRequest, Context lambd this.config = config; } - public AwsProxyRequest getAwsProxyRequest() { return this.request; } - public AwsHttpServletResponse getResponse() { - return response; - } - - public void setResponse(AwsHttpServletResponse response) { - this.response = response; - } - - public void setContainerHandler(AwsLambdaServletContainerHandler containerHandler) { - this.containerHandler = containerHandler; - } - //------------------------------------------------------------- // Implementation - HttpServletRequest //------------------------------------------------------------- @@ -224,16 +191,7 @@ public String getPathTranslated() { @Override public String getContextPath() { - String contextPath = ""; - if (config.isUseStageAsServletContext() && request.getRequestContext().getStage() != null) { - log.debug("Using stage as context path"); - contextPath = cleanUri(request.getRequestContext().getStage()); - } - if (config.getServiceBasePath() != null) { - contextPath += cleanUri(config.getServiceBasePath()); - } - - return contextPath; + return generateContextPath(config, request.getRequestContext().getStage()); } @@ -279,19 +237,7 @@ public String getRequestURI() { @Override public StringBuffer getRequestURL() { - String url = ""; - url += getServerName(); - url += cleanUri(getContextPath()); - url += cleanUri(request.getPath()); - - return new StringBuffer(getScheme() + "://" + url); - } - - - @Override - public String getServletPath() { - // we always work on the root path - return ""; + return generateRequestURL(request.getPath()); } @@ -333,7 +279,7 @@ public Part getPart(String s) @Override public T upgrade(Class aClass) throws IOException, ServletException { - return null; + throw new UnsupportedOperationException(); } //------------------------------------------------------------- @@ -343,28 +289,10 @@ public T upgrade(Class aClass) @Override public String getCharacterEncoding() { - // we only look at content-type because content-encoding should only be used for - // "binary" requests such as gzip/deflate. - String contentTypeHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); - if (contentTypeHeader == null) { - return null; - } - - String[] contentTypeValues = contentTypeHeader.split(HEADER_VALUE_SEPARATOR); - if (contentTypeValues.length <= 1) { - return null; - } - - for (String contentTypeValue : contentTypeValues) { - if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { - String[] encodingValues = contentTypeValue.split(HEADER_KEY_VALUE_SEPARATOR); - if (encodingValues.length <= 1) { - return null; - } - return encodingValues[1]; - } + if (request.getMultiValueHeaders() == null) { + return config.getDefaultContentCharset(); } - return null; + return parseCharacterEncoding(request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); } @@ -380,25 +308,7 @@ public void setCharacterEncoding(String s) return; } - if (currentContentType.contains(HEADER_VALUE_SEPARATOR)) { - String[] contentTypeValues = currentContentType.split(HEADER_VALUE_SEPARATOR); - StringBuilder contentType = new StringBuilder(contentTypeValues[0]); - - for (int i = 1; i < contentTypeValues.length; i++) { - String contentTypeValue = contentTypeValues[i]; - String contentTypeString = HEADER_VALUE_SEPARATOR + " " + contentTypeValue; - if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { - contentTypeString = HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s; - } - contentType.append(contentTypeString); - } - - request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, contentType.toString()); - } else { - request.getMultiValueHeaders().putSingle( - HttpHeaders.CONTENT_TYPE, - currentContentType + HEADER_VALUE_SEPARATOR + " " + ENCODING_VALUE_KEY + HEADER_KEY_VALUE_SEPARATOR + s); - } + request.getMultiValueHeaders().putSingle(HttpHeaders.CONTENT_TYPE, appendCharacterEncoding(currentContentType, s)); } @@ -432,37 +342,9 @@ public String getContentType() { return contentTypeHeader; } - - @Override - public ServletInputStream getInputStream() - throws IOException { - if (request.getBody() == null) { - return new AwsServletInputStream(new NullInputStream(0, false, false)); - } - byte[] bodyBytes; - if (request.isBase64Encoded()) { - bodyBytes = Base64.getMimeDecoder().decode(request.getBody()); - } else { - String encoding = getCharacterEncoding(); - if (encoding == null) { - encoding = StandardCharsets.ISO_8859_1.name(); - } - try { - bodyBytes = request.getBody().getBytes(encoding); - } catch (Exception e) { - log.error("Could not read request with character encoding: " + SecurityUtils.crlf(encoding), e); - bodyBytes = request.getBody().getBytes(StandardCharsets.ISO_8859_1.name()); - } - - } - ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); - return new AwsServletInputStream(requestBodyStream); - } - - @Override public String getParameter(String s) { - String queryStringParameter = getFirstQueryParamValue(s, config.isQueryStringCaseSensitive()); + String queryStringParameter = getFirstQueryParamValue(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()); if (queryStringParameter != null) { return queryStringParameter; } @@ -489,7 +371,7 @@ public Enumeration getParameterNames() { @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { - List values = new ArrayList<>(Arrays.asList(getQueryParamValues(s, config.isQueryStringCaseSensitive()))); + List values = new ArrayList<>(Arrays.asList(getQueryParamValues(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()))); values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); @@ -503,26 +385,7 @@ public String[] getParameterValues(String s) { @Override public Map getParameterMap() { - Map output = new HashMap<>(); - - Map> params = getFormUrlEncodedParametersMap(); - params.entrySet().stream().parallel().forEach(e -> { - output.put(e.getKey(), e.getValue().toArray(new String[0])); - }); - - if (request.getMultiValueQueryStringParameters() != null) { - request.getMultiValueQueryStringParameters().keySet().stream().parallel().forEach(e -> { - List newValues = new ArrayList<>(); - if (output.containsKey(e)) { - String[] values = output.get(e); - newValues.addAll(Arrays.asList(values)); - } - newValues.addAll(Arrays.asList(getQueryParamValues(e, config.isQueryStringCaseSensitive()))); - output.put(e, newValues.toArray(new String[0])); - }); - } - - return output; + return generateParameterMap(request.getMultiValueQueryStringParameters(), config); } @@ -534,20 +397,7 @@ public String getProtocol() { @Override public String getScheme() { - // if we don't have any headers to deduce the value we assume HTTPS - API Gateway's default - if (request.getMultiValueHeaders() == null) { - return "https"; - } - String cfScheme = request.getMultiValueHeaders().getFirst(CF_PROTOCOL_HEADER_NAME); - if (cfScheme != null && SecurityUtils.isValidScheme(cfScheme)) { - return cfScheme; - } - String gwScheme = request.getMultiValueHeaders().getFirst(PROTOCOL_HEADER_NAME); - if (gwScheme != null && SecurityUtils.isValidScheme(gwScheme)) { - return gwScheme; - } - // https is our default scheme - return "https"; + return getSchemeFromHeader(request.getMultiValueHeaders()); } @Override @@ -558,9 +408,11 @@ public String getServerName() { region = "us-east-1"; } - String hostHeader = request.getMultiValueHeaders().getFirst(HOST_HEADER_NAME); - if (hostHeader != null && SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { - return hostHeader; + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().containsKey(HOST_HEADER_NAME)) { + String hostHeader = request.getMultiValueHeaders().getFirst(HOST_HEADER_NAME); + if (SecurityUtils.isValidHost(hostHeader, request.getRequestContext().getApiId(), region)) { + return hostHeader; + } } return new StringBuilder().append(request.getRequestContext().getApiId()) @@ -582,6 +434,14 @@ public int getServerPort() { } } + @Override + public ServletInputStream getInputStream() throws IOException { + if (requestInputStream == null) { + requestInputStream = new AwsServletInputStream(bodyStringToInputStream(request.getBody(), request.isBase64Encoded())); + } + return requestInputStream; + } + @Override public BufferedReader getReader() @@ -693,8 +553,8 @@ public AsyncContext startAsync() @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); - setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; } @@ -703,7 +563,7 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se public AsyncContext getAsyncContext() { if (asyncContext == null) { throw new IllegalStateException("Request " + SecurityUtils.crlf(request.getRequestContext().getRequestId()) - + " is not in asynchronous mode. Call startAsync before atttempting to get the async context."); + + " is not in asynchronous mode. Call startAsync before attempting to get the async context."); } return asyncContext; } @@ -712,128 +572,6 @@ public AsyncContext getAsyncContext() { // Methods - Private //------------------------------------------------------------- - private String[] getFormBodyParameterCaseInsensitive(String key) { - List values = getFormUrlEncodedParametersMap().get(key); - if (values != null) { - String[] valuesArray = new String[values.size()]; - valuesArray = values.toArray(valuesArray); - return valuesArray; - } else { - return new String[0]; - } - } - - - @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) - private Map getMultipartFormParametersMap() { - if (multipartFormParameters != null) { - return multipartFormParameters; - } - if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type - multipartFormParameters = new HashMap<>(); - return multipartFormParameters; - } - Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - - ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); - - try { - List items = upload.parseRequest(this); - for (FileItem item : items) { - String fileName = FilenameUtils.getName(item.getName()); - AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(item.getFieldName()); - newPart.setSubmittedFileName(fileName); - newPart.setContentType(item.getContentType()); - newPart.setSize(item.getSize()); - item.getHeaders().getHeaderNames().forEachRemaining(h -> { - newPart.addHeader(h, item.getHeaders().getHeader(h)); - }); - - multipartFormParameters.put(item.getFieldName(), newPart); - } - } catch (FileUploadException e) { - Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - log.error("Could not read multipart upload file", e); - } - Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - return multipartFormParameters; - } - - - static String cleanUri(String uri) { - String finalUri = (uri == null ? "/" : uri); - if (finalUri.equals("/")) { - return finalUri; - } - - if (!finalUri.startsWith("/")) { - finalUri = "/" + finalUri; - } - - if (finalUri.endsWith("/")) { - finalUri = finalUri.substring(0, finalUri.length() - 1); - } - - finalUri = finalUri.replaceAll("/+", "/"); - - return finalUri; - } - - - private Map> getFormUrlEncodedParametersMap() { - if (urlEncodedFormParameters != null) { - return urlEncodedFormParameters; - } - String contentType = getContentType(); - if (contentType == null) { - urlEncodedFormParameters = new HashMap<>(); - return urlEncodedFormParameters; - } - if (!contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED) || !getMethod().toLowerCase(Locale.ENGLISH).equals("post")) { - urlEncodedFormParameters = new HashMap<>(); - return urlEncodedFormParameters; - } - Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS"); - String rawBodyContent = null; - try { - rawBodyContent = IOUtils.toString(getInputStream()); - } catch (IOException e) { - throw new RuntimeException(e); - } - - urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { - String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR); - if (parameterKeyValue.length < 2) { - continue; - } - List values = new ArrayList<>(); - if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) { - values = urlEncodedFormParameters.get(parameterKeyValue[0]); - } - values.add(decodeValueIfEncoded(parameterKeyValue[1])); - urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values); - } - Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS"); - return urlEncodedFormParameters; - } - - - public static String decodeValueIfEncoded(String value) { - if (value == null) { - return null; - } - - try { - return URLDecoder.decode(value, LambdaContainerHandler.getContainerConfig().getUriEncoding()); - } catch (UnsupportedEncodingException e) { - log.warn("Could not decode body content - proceeding as if it was already decoded", e); - return value; - } - } - private List getHeaderValues(String key) { // special cases for referer and user agent headers List values = new ArrayList<>(); @@ -857,84 +595,4 @@ private List getHeaderValues(String key) { } - private String getFirstQueryParamValue(String key, boolean isCaseSensitive) { - if (request.getMultiValueQueryStringParameters() != null) { - if (isCaseSensitive) { - return request.getMultiValueQueryStringParameters().getFirst(key); - } - - for (String k : request.getMultiValueQueryStringParameters().keySet()) { - if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { - return request.getMultiValueQueryStringParameters().getFirst(k); - } - } - } - - return null; - } - - public String[] getQueryParamValues(String key, boolean isCaseSensitive) { - if (request.getMultiValueQueryStringParameters() != null) { - if (isCaseSensitive) { - return request.getMultiValueQueryStringParameters().get(key).toArray(new String[0]); - } - - for (String k : request.getMultiValueQueryStringParameters().keySet()) { - if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) { - return request.getMultiValueQueryStringParameters().get(k).toArray(new String[0]); - } - } - } - - return new String[0]; - } - - - public static class AwsServletInputStream extends ServletInputStream { - - private InputStream bodyStream; - private ReadListener listener; - - public AwsServletInputStream(InputStream body) { - bodyStream = body; - } - - - @Override - public boolean isFinished() { - return true; - } - - - @Override - public boolean isReady() { - return true; - } - - - @Override - public void setReadListener(ReadListener readListener) { - listener = readListener; - try { - listener.onDataAvailable(); - } catch (IOException e) { - log.error("Data not available on input stream", e); - } - } - - - @Override - public int read() - throws IOException { - if (bodyStream == null || bodyStream instanceof NullInputStream) { - return -1; - } - int readByte = bodyStream.read(); - if (bodyStream.available() == 0 && listener != null) { - listener.onAllDataRead(); - } - return readByte; - } - - } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 405ae973..932041db 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -19,6 +19,7 @@ import com.amazonaws.services.lambda.runtime.Context; import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; @@ -26,8 +27,9 @@ * Simple implementation of the RequestReader interface that receives an AwsProxyRequest * object and uses it to initialize a AwsProxyHttpServletRequest object. */ -public class AwsProxyHttpServletRequestReader extends RequestReader { +public class AwsProxyHttpServletRequestReader extends RequestReader { static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer"; + private ServletContext servletContext; //------------------------------------------------------------- // Methods - Implementation @@ -38,7 +40,7 @@ public void setServletContext(ServletContext ctx) { } @Override - public AwsProxyHttpServletRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) + public HttpServletRequest readRequest(AwsProxyRequest request, SecurityContext securityContext, Context lambdaContext, ContainerConfig config) throws InvalidRequestEventException { // Expect the HTTP method and context to be populated. If they are not, we are handling an // unsupported event type. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 32a86f66..ba98eedb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -57,7 +57,7 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, awsProxyResponse.setStatusCode(containerResponse.getStatus()); - if (containerResponse.getAwsProxyRequest().getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + if (containerResponse.getAwsProxyRequest() != null && containerResponse.getAwsProxyRequest().getRequestSource() == AwsProxyRequest.RequestSource.ALB) { awsProxyResponse.setStatusDescription(containerResponse.getStatus() + " " + Response.Status.fromStatusCode(containerResponse.getStatus()).getReasonPhrase()); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 2ffcc97d..27a352eb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -1,8 +1,20 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; - import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,9 +26,9 @@ import java.io.IOException; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; +import static com.amazonaws.serverless.proxy.RequestReader.HTTP_API_EVENT_PROPERTY; import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE; - /** * Default RequestDispatcher implementation for the AwsProxyHttpServletRequest type. A new * instance of this object is created each time a framework gets the RequestDispatcher from a servlet request. Behind @@ -115,12 +127,22 @@ void setRequestPath(ServletRequest req, final String destinationPath) { ((AwsProxyHttpServletRequest) req).getAwsProxyRequest().setPath(dispatchTo); return; } + if (req instanceof AwsHttpApiV2ProxyHttpServletRequest) { + ((AwsHttpApiV2ProxyHttpServletRequest) req).getRequest().setRawPath(destinationPath); + return; + } - log.debug("Request is not an AwsProxyHttpServletRequest, attempting to extract the proxy event type"); - if (req.getAttribute(API_GATEWAY_EVENT_PROPERTY) == null || !(req.getAttribute(API_GATEWAY_EVENT_PROPERTY) instanceof AwsProxyRequest)) { - throw new IllegalStateException("ServletRequest object does not contain API Gateway event"); + log.debug("Request is not an proxy request generated by this library, attempting to extract the proxy event type from the request attributes"); + if (req.getAttribute(API_GATEWAY_EVENT_PROPERTY) != null && req.getAttribute(API_GATEWAY_EVENT_PROPERTY) instanceof AwsProxyRequest) { + ((AwsProxyRequest)req.getAttribute(API_GATEWAY_EVENT_PROPERTY)).setPath(dispatchTo); + return; + } + if (req.getAttribute(HTTP_API_EVENT_PROPERTY) != null && req.getAttribute(HTTP_API_EVENT_PROPERTY) instanceof HttpApiV2ProxyRequest) { + ((HttpApiV2ProxyRequest)req.getAttribute(HTTP_API_EVENT_PROPERTY)).setRawPath(destinationPath); + return; } - ((AwsProxyRequest)req.getAttribute(API_GATEWAY_EVENT_PROPERTY)).setPath(dispatchTo); + + throw new IllegalStateException("Could not set new target path for the given ServletRequest object"); } private Servlet getServlet(HttpServletRequest req) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 97e866e7..cf2e3920 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -185,25 +185,21 @@ public Servlet getServletForPath(String path) { String[] pathParts = path.split("/"); for (AwsServletRegistration reg : servletRegistrations.values()) { for (String p : reg.getMappings()) { - try { - if ("".equals(p) || "/".equals(p) || "/*".equals(p)) { - return reg.getServlet(); - } - // if I have no path and I haven't matched something now I'll just move on to the next - if ("".equals(path) || "/".equals(path)) { - continue; + if ("".equals(p) || "/".equals(p) || "/*".equals(p)) { + return reg.getServlet(); + } + // if I have no path and I haven't matched something now I'll just move on to the next + if ("".equals(path) || "/".equals(path)) { + continue; + } + String[] regParts = p.split("/"); + for (int i = 0; i < regParts.length; i++) { + if (!regParts[i].equals(pathParts[i]) && !"*".equals(regParts[i])) { + break; } - String[] regParts = p.split("/"); - for (int i = 0; i < regParts.length; i++) { - if (!regParts[i].equals(pathParts[i]) && !"*".equals(regParts[i])) { - break; - } - if (i == regParts.length - 1 && (regParts[i].equals(pathParts[i]) || "*".equals(regParts[i]))) { - return reg.getServlet(); - } + if (i == regParts.length - 1 && (regParts[i].equals(pathParts[i]) || "*".equals(regParts[i]))) { + return reg.getServlet(); } - } catch (ServletException e) { - return null; } } } @@ -216,12 +212,7 @@ public Servlet getServletForPath(String path) { public Enumeration getServlets() { return Collections.enumeration(servletRegistrations.entrySet().stream() .map((e) -> { - try { - return e.getValue().getServlet(); - } catch (ServletException ex) { - ex.printStackTrace(); - return null; - } + return e.getValue().getServlet(); } ) .collect(Collectors.toList())); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java new file mode 100644 index 00000000..552e75a8 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java @@ -0,0 +1,76 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.internal.servlet; + +import org.apache.commons.io.input.NullInputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class AwsServletInputStream extends ServletInputStream { + private static Logger log = LoggerFactory.getLogger(AwsServletInputStream.class); + private InputStream bodyStream; + private ReadListener listener; + private boolean finished; + + public AwsServletInputStream(InputStream body) { + bodyStream = body; + finished = false; + } + + @Override + public boolean isFinished() { + return finished; + } + + @Override + public boolean isReady() { + if (finished && listener != null) { + try { + listener.onAllDataRead(); + } catch (IOException e) { + log.error("Could not notify listeners that input stream data is ready", e); + throw new RuntimeException(e); + } + } + return !finished; + } + + @Override + public void setReadListener(ReadListener readListener) { + listener = readListener; + try { + listener.onDataAvailable(); + } catch (IOException e) { + log.error("Could not notify listeners that data is available", e); + throw new RuntimeException(e); + } + } + + @Override + public int read() + throws IOException { + if (bodyStream == null || bodyStream instanceof NullInputStream) { + return -1; + } + int readByte = bodyStream.read(); + if (readByte == -1) { + finished = true; + } + return readByte; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java index e3ce620b..021503c1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java @@ -1,12 +1,26 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import javax.servlet.*; import java.util.*; /** * Stores information about a servlet registered with Serverless Java Container's ServletContext. */ -public class AwsServletRegistration implements ServletRegistration, ServletRegistration.Dynamic { +public class AwsServletRegistration implements ServletRegistration, ServletRegistration.Dynamic, Comparable { private String servletName; private Servlet servlet; private AwsServletContext ctx; @@ -91,10 +105,7 @@ public Map getInitParameters() { return initParameters; } - public Servlet getServlet() throws ServletException { - if (servlet.getServletConfig() == null) { - servlet.init(getServletConfig()); - } + public Servlet getServlet() { return servlet; } @@ -127,6 +138,20 @@ public void setAsyncSupported(boolean b) { asyncSupported = b; } + @Override + public int compareTo(AwsServletRegistration r) { + return Integer.compare(loadOnStartup, r.getLoadOnStartup()); + } + + @Override + @SuppressFBWarnings("HE_EQUALS_USE_HASHCODE") + public boolean equals(Object r) { + if (r == null || !AwsServletRegistration.class.isAssignableFrom(r.getClass())) { + return false; + } + return ((AwsServletRegistration)r).getName().equals(getName()) && ((AwsServletRegistration)r).getServlet() == getServlet(); + } + public boolean isAsyncSupported() { return asyncSupported; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 8da92f1b..92ff55da 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -14,15 +14,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @@ -31,6 +23,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Predicate; /** * This object in in charge of matching a servlet request to a set of filter, creating the filter chain for a request, @@ -104,12 +97,17 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl return getFilterChainCache(type, targetPath, servlet); } + AwsServletRegistration servletRegistration = (AwsServletRegistration)servletContext.getServletRegistrations() + .values().stream() + .filter((Predicate) servletRegistration1 -> ((AwsServletRegistration) servletRegistration1).getServlet().equals(servlet)) + .findFirst().orElse(null); + FilterChainHolder chainHolder = new FilterChainHolder(); Map registrations = getFilterHolders(); if (registrations == null || registrations.size() == 0) { - if (servlet != null) { - chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servlet), servletContext)); + if (servletRegistration != null) { + chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext)); } return chainHolder; } @@ -130,8 +128,8 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl // we assume we only ever have one servlet. } - if (servlet != null) { - chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servlet), servletContext)); + if (servletRegistration != null) { + chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext)); } putFilterChainCache(type, targetPath, chainHolder); @@ -332,23 +330,30 @@ void setDispatcherType(DispatcherType dispatcherType) { private class ServletExecutionFilter implements Filter { private FilterConfig config; - private Servlet handlerServlet; + private AwsServletRegistration handlerServlet; + private boolean initialized; - public ServletExecutionFilter(Servlet handler) { - handlerServlet = handler; + public ServletExecutionFilter(AwsServletRegistration servletReg) { + handlerServlet = servletReg; + initialized = handlerServlet.getServlet().getServletInfo() != null; } @Override public void init(FilterConfig filterConfig) throws ServletException { + if (initialized) { + return; + } config = filterConfig; + handlerServlet.getServlet().init(handlerServlet.getServletConfig()); + initialized = true; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - handlerServlet.service(servletRequest, servletResponse); + handlerServlet.getServlet().service(servletRequest, servletResponse); filterChain.doFilter(servletRequest, servletResponse); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index 893075d2..987dff14 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -83,6 +83,9 @@ public FilterHolder(String name, Filter newFilter, ServletContext context) { * @throws ServletException Propagates any servlet exception thrown by the filter initialization */ public void init() throws ServletException { + if (this.filterInitialized) { + return; + } this.getFilter().init(filterConfig); this.filterInitialized = true; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java index 50743e73..88e59fb6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java @@ -1,9 +1,22 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.*; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; @@ -89,6 +102,23 @@ public Builder defaultProxy() { return self(); } + /** + * Sets all of the required fields in the builder to the default settings for a Servlet-compatible framework that wants + * to support HTTP API's v2 proxy event + * @return A populated builder + */ + public Builder defaultHttpApiV2Proxy() { + initializationWrapper(new InitializationWrapper()) + .requestReader((RequestReader) new AwsHttpApiV2HttpServletRequestReader()) + .responseWriter((ResponseWriter) new AwsProxyHttpServletResponseWriter()) + .securityContextWriter((SecurityContextWriter) new AwsHttpApiV2SecurityContextWriter()) + .exceptionHandler((ExceptionHandler) new AwsProxyExceptionHandler()) + .requestTypeClass((Class) HttpApiV2ProxyRequest.class) + .responseTypeClass((Class) AwsProxyResponse.class); + return self(); + + } + /** * Sets the initialization wrapper to be used by the {@link ServletLambdaContainerHandlerBuilder#buildAndInitialize()} * method to start the framework implementations @@ -132,11 +162,29 @@ public Builder responseTypeClass(Class responseType) { return self(); } + /** + * Uses an async initializer with the given start time to calculate the 10 seconds timeout. + * + * @deprecated As of release 1.5 this method is deprecated in favor of the parameters-less one {@link ServletLambdaContainerHandlerBuilder#asyncInit()}. + * @param actualStartTime An epoch in milliseconds that should be used to calculate the 10 seconds timeout since the start of the application + * @return A builder configured to use the async initializer + */ + @Deprecated public Builder asyncInit(long actualStartTime) { this.initializationWrapper = new AsyncInitializationWrapper(actualStartTime); return self(); } + /** + * Uses a new {@link AsyncInitializationWrapper} with the no-parameter constructor that takes the actual JVM + * start time + * @return A builder configured to use an async initializer + */ + public Builder asyncInit() { + this.initializationWrapper = new AsyncInitializationWrapper(); + return self(); + } + /** * Implementations should implement this method to return their type. All of the builder methods in this abstract * class use this method to return the correct builder type. diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 3260d433..8d4dc63f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -13,15 +13,7 @@ package com.amazonaws.serverless.proxy.internal.testutils; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.model.AlbContext; -import com.amazonaws.serverless.proxy.model.ApiGatewayAuthorizerContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; -import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.serverless.proxy.model.Headers; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; +import com.amazonaws.serverless.proxy.model.*; import com.fasterxml.jackson.core.JsonProcessingException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -42,8 +34,13 @@ import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.UUID; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; +import java.util.stream.Collectors; /** @@ -71,6 +68,10 @@ public AwsProxyRequestBuilder(String path) { this(path, null); } + public AwsProxyRequestBuilder(AwsProxyRequest req) { + request = req; + } + public AwsProxyRequestBuilder(String path, String httpMethod) { this.request = new AwsProxyRequest(); @@ -100,6 +101,25 @@ public AwsProxyRequestBuilder alb() { this.request.getRequestContext().getElb().setTargetGroupArn( "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-target/d6190d154bc908a5" ); + + // ALB does not decode query string parameters so we re-encode them all + if (request.getMultiValueQueryStringParameters() != null) { + MultiValuedTreeMap newQs = new MultiValuedTreeMap<>(); + for (Map.Entry> e : request.getMultiValueQueryStringParameters().entrySet()) { + for (String v : e.getValue()) { + try { + // this is a terrible hack. In our Spring tests we use the comma as a control character for lists + // this is allowed by the HTTP specs although not recommended. + String key = URLEncoder.encode(e.getKey(), "UTF-8").replaceAll("%2C", ","); + String value = URLEncoder.encode(v, "UTF-8").replaceAll("%2C", ","); + newQs.add(key, value); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException("Could not encode query string parameters: " + e.getKey() + "=" + v, ex); + } + } + } + request.setMultiValueQueryStringParameters(newQs); + } return this; } @@ -188,6 +208,16 @@ public AwsProxyRequestBuilder header(String key, String value) { return this; } + public AwsProxyRequestBuilder multiValueHeaders(Headers h) { + this.request.setMultiValueHeaders(h); + return this; + } + + public AwsProxyRequestBuilder multiValueQueryString(MultiValuedTreeMap params) { + this.request.setMultiValueQueryStringParameters(params); + return this; + } + public AwsProxyRequestBuilder queryString(String key, String value) { if (this.request.getMultiValueQueryStringParameters() == null) { @@ -228,7 +258,7 @@ public AwsProxyRequestBuilder nullBody() { } public AwsProxyRequestBuilder body(Object body) { - if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).equals(MediaType.APPLICATION_JSON)) { + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)) { try { return body(LambdaContainerHandler.getObjectMapper().writeValueAsString(body)); } catch (JsonProcessingException e) { @@ -239,6 +269,14 @@ public AwsProxyRequestBuilder body(Object body) { } } + public AwsProxyRequestBuilder apiId(String id) { + if (request.getRequestContext() == null) { + request.setRequestContext(new AwsProxyRequestContext()); + } + request.getRequestContext().setApiId(id); + return this; + } + public AwsProxyRequestBuilder binaryBody(InputStream is) throws IOException { this.request.setIsBase64Encoded(true); @@ -400,4 +438,101 @@ public InputStream buildStream() { return null; } } + + public InputStream toHttpApiV2RequestStream() { + HttpApiV2ProxyRequest req = toHttpApiV2Request(); + try { + String requestJson = LambdaContainerHandler.getObjectMapper().writeValueAsString(req); + return new ByteArrayInputStream(requestJson.getBytes(StandardCharsets.UTF_8)); + } catch (JsonProcessingException e) { + return null; + } + } + + public HttpApiV2ProxyRequest toHttpApiV2Request() { + HttpApiV2ProxyRequest req = new HttpApiV2ProxyRequest(); + req.setRawPath(request.getPath()); + req.setBase64Encoded(request.isBase64Encoded()); + req.setBody(request.getBody()); + if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().containsKey(HttpHeaders.COOKIE)) { + req.setCookies(Arrays.asList(request.getMultiValueHeaders().getFirst(HttpHeaders.COOKIE).split(";"))); + } + req.setHeaders(new HashMap<>()); + if (request.getMultiValueHeaders() != null) { + request.getMultiValueHeaders().forEach((key, value) -> req.getHeaders().put(key, value.get(0))); + } + if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null) { + if (request.getRequestContext().getIdentity().getCaller() != null) { + req.getHeaders().put("Referer", request.getRequestContext().getIdentity().getCaller()); + } + if (request.getRequestContext().getIdentity().getUserAgent() != null) { + req.getHeaders().put(HttpHeaders.USER_AGENT, request.getRequestContext().getIdentity().getUserAgent()); + } + + } + if (request.getMultiValueQueryStringParameters() != null) { + StringBuilder rawQueryString = new StringBuilder(); + request.getMultiValueQueryStringParameters().forEach((k, v) -> { + for (String s : v) { + rawQueryString.append("&"); + rawQueryString.append(k); + rawQueryString.append("="); + try { + // same terrible hack as the alb() method. Because our spring tests use commas as control characters + // we do not encode it + rawQueryString.append(URLEncoder.encode(s, "UTF-8").replaceAll("%2C", ",")); + } catch (UnsupportedEncodingException e) { + System.out.println("Ex!"); + throw new RuntimeException(e); + } + } + }); + String qs = rawQueryString.toString(); + if (qs.length() > 1) { + req.setRawQueryString(qs.substring(1)); + } + } + req.setRouteKey("$default"); + req.setVersion("2.0"); + req.setStageVariables(request.getStageVariables()); + + HttpApiV2ProxyRequestContext ctx = new HttpApiV2ProxyRequestContext(); + HttpApiV2HttpContext httpCtx = new HttpApiV2HttpContext(); + httpCtx.setMethod(request.getHttpMethod()); + httpCtx.setPath(request.getPath()); + httpCtx.setProtocol("HTTP/1.1"); + if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null && request.getRequestContext().getIdentity().getSourceIp() != null) { + httpCtx.setSourceIp(request.getRequestContext().getIdentity().getSourceIp()); + } else { + httpCtx.setSourceIp("127.0.0.1"); + } + if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null && request.getRequestContext().getIdentity().getUserAgent() != null) { + httpCtx.setUserAgent(request.getRequestContext().getIdentity().getUserAgent()); + } + ctx.setHttp(httpCtx); + if (request.getRequestContext() != null) { + ctx.setAccountId(request.getRequestContext().getAccountId()); + ctx.setApiId(request.getRequestContext().getApiId()); + ctx.setDomainName(request.getRequestContext().getApiId() + ".execute-api.us-east-1.apigateway.com"); + ctx.setDomainPrefix(request.getRequestContext().getApiId()); + ctx.setRequestId(request.getRequestContext().getRequestId()); + ctx.setRouteKey("$default"); + ctx.setStage(request.getRequestContext().getStage()); + ctx.setTimeEpoch(request.getRequestContext().getRequestTimeEpoch()); + ctx.setTime(request.getRequestContext().getRequestTime()); + + if (request.getRequestContext().getAuthorizer() != null) { + HttpApiV2AuthorizerMap auth = new HttpApiV2AuthorizerMap(); + HttpApiV2JwtAuthorizer jwt = new HttpApiV2JwtAuthorizer(); + // TODO: Anything we should map here? + jwt.setClaims(new HashMap<>()); + jwt.setScopes(new ArrayList<>()); + auth.putJwtAuthorizer(jwt); + ctx.setAuthorizer(auth); + } + } + req.setRequestContext(ctx); + + return req; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java index b8c332aa..b89ca934 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/Timer.java @@ -1,10 +1,20 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.internal.testutils; - import java.util.LinkedHashMap; import java.util.Map; - public final class Timer { private volatile static Map timers = new LinkedHashMap<>(); private volatile static boolean enabled = false; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java index 1965231b..527fc222 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AlbContext.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.model; - /*** * Context passed by ALB proxy events */ diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index e5c80d63..5edeeebb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.model; - import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import java.util.ArrayList; @@ -8,7 +19,6 @@ import java.util.HashSet; import java.util.List; - /** * Configuration parameters for the framework */ @@ -16,7 +26,7 @@ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1"; private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; - private static final int MAX_INIT_TIMEOUT_MS = 10_000; + private static final int MAX_INIT_TIMEOUT_MS = 20_000; public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); @@ -29,6 +39,7 @@ public static ContainerConfig defaultConfig() { configuration.addBinaryContentTypes("application/octet-stream", "image/jpeg", "image/png", "image/gif"); configuration.setDefaultContentCharset(DEFAULT_CONTENT_CHARSET); configuration.setInitializationTimeout(MAX_INIT_TIMEOUT_MS); + configuration.setDisableExceptionMapper(false); return configuration; } @@ -48,6 +59,7 @@ public static ContainerConfig defaultConfig() { private boolean queryStringCaseSensitive; private final HashSet binaryContentTypes; private int initializationTimeout; + private boolean disableExceptionMapper; public ContainerConfig() { validFilePaths = new ArrayList<>(); @@ -297,4 +309,23 @@ public int getInitializationTimeout() { public void setInitializationTimeout(int initializationTimeout) { this.initializationTimeout = initializationTimeout; } + + /** + * Whether the framework will run exception thrown by the application through the implementation of + * {@link com.amazonaws.serverless.proxy.ExceptionHandler}. When this parameter is set to false the Lambda + * container handler object lets the Exception propagate upwards to the Lambda handler class. + * @return true if exception mapping is disabled, false otherwise. + */ + public boolean isDisableExceptionMapper() { + return disableExceptionMapper; + } + + /** + * This configuration parameter tells the container whether it should skip exception mapping and simply let any + * Exception thrown by the underlying application bubble up to the Lambda handler class. + * @param disable Set this value to true to disable exception mapping, false otherwise. + */ + public void setDisableExceptionMapper(boolean disable) { + this.disableExceptionMapper = disable; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java index 0de0d204..73f9d284 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/Headers.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.model; public class Headers extends MultiValuedTreeMap { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java new file mode 100644 index 00000000..e7017f60 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java @@ -0,0 +1,84 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; +import java.util.HashMap; + +@JsonSerialize(using = HttpApiV2AuthorizerMap.HttpApiV2AuthorizerSerializer.class) +@JsonDeserialize(using = HttpApiV2AuthorizerMap.HttpApiV2AuthorizerDeserializer.class) +public class HttpApiV2AuthorizerMap extends HashMap { + private static final String JWT_KEY = "jwt"; + private static final long serialVersionUID = 42L; + + public HttpApiV2JwtAuthorizer getJwtAuthorizer() { + return (HttpApiV2JwtAuthorizer)get(JWT_KEY); + } + + public boolean isJwt() { + return containsKey(JWT_KEY); + } + + public void putJwtAuthorizer(HttpApiV2JwtAuthorizer jwt) { + put(JWT_KEY, jwt); + } + + public static class HttpApiV2AuthorizerDeserializer extends StdDeserializer { + private static final long serialVersionUID = 42L; + + public HttpApiV2AuthorizerDeserializer() { + super(HttpApiV2AuthorizerMap.class); + } + + @Override + public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + HttpApiV2AuthorizerMap map = new HttpApiV2AuthorizerMap(); + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + if (node.get(JWT_KEY) != null) { + HttpApiV2JwtAuthorizer authorizer = LambdaContainerHandler.getObjectMapper().treeToValue(node.get(JWT_KEY), HttpApiV2JwtAuthorizer.class); + map.putJwtAuthorizer(authorizer); + } + // we ignore other, unknown values + return map; + } + } + + public static class HttpApiV2AuthorizerSerializer extends StdSerializer { + private static final long serialVersionUID = 42L; + + public HttpApiV2AuthorizerSerializer() { + super(HttpApiV2AuthorizerMap.class); + } + + @Override + public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeStartObject(); + if (httpApiV2AuthorizerMap.isJwt()) { + jsonGenerator.writeObjectField(JWT_KEY, httpApiV2AuthorizerMap.getJwtAuthorizer()); + } + jsonGenerator.writeEndObject(); + } + } +} \ No newline at end of file diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2HttpContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2HttpContext.java new file mode 100644 index 00000000..e6eb1287 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2HttpContext.java @@ -0,0 +1,61 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +public class HttpApiV2HttpContext { + private String method; + private String path; + private String protocol; + private String sourceIp; + private String userAgent; + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getProtocol() { + return protocol; + } + + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + public String getSourceIp() { + return sourceIp; + } + + public void setSourceIp(String sourceIp) { + this.sourceIp = sourceIp; + } + + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2JwtAuthorizer.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2JwtAuthorizer.java new file mode 100644 index 00000000..d81a3c77 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2JwtAuthorizer.java @@ -0,0 +1,37 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +import java.util.List; +import java.util.Map; + +public class HttpApiV2JwtAuthorizer { + private Map claims; + private List scopes; + + public Map getClaims() { + return claims; + } + + public void setClaims(Map claims) { + this.claims = claims; + } + + public List getScopes() { + return scopes; + } + + public void setScopes(List scopes) { + this.scopes = scopes; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java new file mode 100644 index 00000000..6eee7dc4 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java @@ -0,0 +1,121 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Map; + +public class HttpApiV2ProxyRequest { + private String version; + private String routeKey; + private String rawPath; + private String rawQueryString; + private List cookies; + private Map headers; + private Map queryStringParameters; + private String body; + private boolean isBase64Encoded; + private Map stageVariables; + private HttpApiV2ProxyRequestContext requestContext; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getRouteKey() { + return routeKey; + } + + public void setRouteKey(String routeKey) { + this.routeKey = routeKey; + } + + public String getRawPath() { + return rawPath; + } + + public void setRawPath(String rawPath) { + this.rawPath = rawPath; + } + + public String getRawQueryString() { + return rawQueryString; + } + + public void setRawQueryString(String rawQueryString) { + this.rawQueryString = rawQueryString; + } + + public List getCookies() { + return cookies; + } + + public void setCookies(List cookies) { + this.cookies = cookies; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + + public Map getQueryStringParameters() { + return queryStringParameters; + } + + public void setQueryStringParameters(Map queryStringParameters) { + this.queryStringParameters = queryStringParameters; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + @JsonProperty("isBase64Encoded") + public boolean isBase64Encoded() { + return isBase64Encoded; + } + + public void setBase64Encoded(boolean base64Encoded) { + isBase64Encoded = base64Encoded; + } + + public Map getStageVariables() { + return stageVariables; + } + + public void setStageVariables(Map stageVariables) { + this.stageVariables = stageVariables; + } + + public HttpApiV2ProxyRequestContext getRequestContext() { + return requestContext; + } + + public void setRequestContext(HttpApiV2ProxyRequestContext requestContext) { + this.requestContext = requestContext; + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java new file mode 100644 index 00000000..55bbe1f8 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java @@ -0,0 +1,117 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +public class HttpApiV2ProxyRequestContext { + private String accountId; + private String apiId; + private String domainName; + private String domainPrefix; + private String requestId; + private String routeKey; + private String stage; + private String time; + private long timeEpoch; + + private HttpApiV2HttpContext http; + private HttpApiV2AuthorizerMap authorizer; + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getApiId() { + return apiId; + } + + public void setApiId(String apiId) { + this.apiId = apiId; + } + + public String getDomainName() { + return domainName; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public String getDomainPrefix() { + return domainPrefix; + } + + public void setDomainPrefix(String domainPrefix) { + this.domainPrefix = domainPrefix; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getRouteKey() { + return routeKey; + } + + public void setRouteKey(String routeKey) { + this.routeKey = routeKey; + } + + public String getStage() { + return stage; + } + + public void setStage(String stage) { + this.stage = stage; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public long getTimeEpoch() { + return timeEpoch; + } + + public void setTimeEpoch(long timeEpoch) { + this.timeEpoch = timeEpoch; + } + + public HttpApiV2HttpContext getHttp() { + return http; + } + + public void setHttp(HttpApiV2HttpContext http) { + this.http = http; + } + + public HttpApiV2AuthorizerMap getAuthorizer() { + return authorizer; + } + + public void setAuthorizer(HttpApiV2AuthorizerMap authorizer) { + this.authorizer = authorizer; + } + +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java index b45463b9..feeab6f2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.model; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import javax.ws.rs.core.MultivaluedMap; @@ -14,7 +25,6 @@ import java.util.Set; import java.util.TreeMap; - /** * Simple implementation of a multi valued tree map to use for case-insensitive headers * diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java new file mode 100644 index 00000000..3b8a7306 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java @@ -0,0 +1,28 @@ +package com.amazonaws.serverless.proxy; + +import org.junit.Test; + +import java.lang.management.ManagementFactory; +import java.time.Clock; +import java.time.Instant; + +import static org.junit.Assert.assertEquals; + +public class AsyncInitializationWrapperTest { + + @Test + public void initCreate_noStartTime_setsCurrentTime() { + AsyncInitializationWrapper init = new AsyncInitializationWrapper(); + long initTime = ManagementFactory.getRuntimeMXBean().getStartTime(); + assertEquals(initTime, init.getActualStartTimeMs()); + } + + @Test + public void initCreate_withStartTime_storesCustomStartTime() throws InterruptedException { + long initTime = Instant.now().toEpochMilli(); + Thread.sleep(500); + AsyncInitializationWrapper init = new AsyncInitializationWrapper(initTime); + + assertEquals(initTime, init.getActualStartTimeMs()); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java new file mode 100644 index 00000000..8b10520c --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java @@ -0,0 +1,105 @@ +package com.amazonaws.serverless.proxy.internal; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; +import org.apache.http.impl.execchain.RequestAbortedException; +import org.junit.Test; + +import javax.servlet.http.HttpServletRequest; +import java.util.concurrent.CountDownLatch; + +import static org.junit.Assert.*; + +public class LambdaContainerHandlerTest { + private boolean isRuntimeException = false; + private boolean throwException = false; + + ExceptionContainerHandlerTest handler = new ExceptionContainerHandlerTest( + AwsProxyRequest.class, AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), new InitializationWrapper() + ); + + @Test + public void throwRuntime_returnsUnwrappedException() { + try { + isRuntimeException = true; + throwException = true; + LambdaContainerHandler.getContainerConfig().setDisableExceptionMapper(true); + handler.proxy(new AwsProxyRequestBuilder("/test", "GET").build(), new MockLambdaContext()); + } catch (Exception e) { + assertNotNull(e); + assertEquals(ExceptionContainerHandlerTest.RUNTIME_MESSAGE, e.getMessage()); + return; + } + fail("Did not throw runtime exception"); + } + + @Test + public void throwNonRuntime_returnsWrappedException() { + try { + isRuntimeException = false; + throwException = true; + LambdaContainerHandler.getContainerConfig().setDisableExceptionMapper(true); + handler.proxy(new AwsProxyRequestBuilder("/test", "GET").build(), new MockLambdaContext()); + } catch (Exception e) { + assertNotNull(e); + assertNotNull(e.getCause()); + assertTrue(e.getCause() instanceof RequestAbortedException); + assertEquals(ExceptionContainerHandlerTest.NON_RUNTIME_MESSAGE, e.getCause().getMessage()); + return; + } + fail("Did not throw exception"); + } + + @Test + public void noException_returnsResponse() { + throwException = false; + LambdaContainerHandler.getContainerConfig().setDisableExceptionMapper(false); + AwsProxyResponse resp = handler.proxy(new AwsProxyRequestBuilder("/test", "GET").build(), new MockLambdaContext()); + assertEquals(200, resp.getStatusCode()); + assertEquals("OK", resp.getBody()); + } + + public class ExceptionContainerHandlerTest extends LambdaContainerHandler { + + public static final String RUNTIME_MESSAGE = "test RuntimeException"; + public static final String NON_RUNTIME_MESSAGE = "test NonRuntimeException"; + + protected ExceptionContainerHandlerTest(Class requestClass, Class responseClass, RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, InitializationWrapper init) { + super(requestClass, responseClass, requestReader, responseWriter, securityContextWriter, exceptionHandler, init); + } + + @Override + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + if (throwException) { + if (isRuntimeException) { + throw new RuntimeException(RUNTIME_MESSAGE); + } else { + throw new RequestAbortedException(NON_RUNTIME_MESSAGE); + } + } + containerResponse.setStatus(200); + containerResponse.getWriter().print("OK"); + containerResponse.flushBuffer(); + } + + @Override + public void initialize() throws ContainerInitializationException { + + } + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java new file mode 100644 index 00000000..ae2dcdb5 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.proxy.internal.jaxrs; + +import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import org.junit.Test; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.SecurityContext; + +import static org.junit.Assert.*; + +public class HttpApiV2SecurityContextTest { + private static final String JWT_SUB_VALUE = "1234567890"; + + HttpApiV2ProxyRequest EMPTY_AUTH = new AwsProxyRequestBuilder("/", "GET").toHttpApiV2Request(); + HttpApiV2ProxyRequest BASIC_AUTH = new AwsProxyRequestBuilder("/", "GET") + .authorizerPrincipal("test").toHttpApiV2Request(); + HttpApiV2ProxyRequest JWT_AUTH = new AwsProxyRequestBuilder("/", "GET") + .authorizerPrincipal("test") + .header(HttpHeaders.AUTHORIZATION, "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c") + .toHttpApiV2Request(); + + AwsHttpApiV2SecurityContextWriter contextWriter = new AwsHttpApiV2SecurityContextWriter(); + + @Test + public void getAuthenticationScheme_nullAuth_nullSchema() { + SecurityContext ctx = contextWriter.writeSecurityContext(EMPTY_AUTH, null); + assertNull(ctx.getAuthenticationScheme()); + assertNull(ctx.getUserPrincipal()); + assertFalse(ctx.isSecure()); + } + + @Test + public void getAuthenticationScheme_jwtAuth_correctSchema() { + SecurityContext ctx = contextWriter.writeSecurityContext(BASIC_AUTH, null); + assertEquals(AwsHttpApiV2SecurityContext.AUTH_SCHEME_JWT, ctx.getAuthenticationScheme()); + assertTrue(ctx.isSecure()); + assertNull(ctx.getUserPrincipal()); + } + + @Test + public void getPrincipal_parseJwt_returnsSub() { + SecurityContext ctx = contextWriter.writeSecurityContext(JWT_AUTH, null); + assertEquals(AwsHttpApiV2SecurityContext.AUTH_SCHEME_JWT, ctx.getAuthenticationScheme()); + assertTrue(ctx.isSecure()); + assertEquals(JWT_SUB_VALUE, ctx.getUserPrincipal().getName()); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java index 1c9527a3..0d12a511 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java @@ -14,6 +14,7 @@ import java.time.Instant; import java.time.ZoneId; +import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; @@ -35,13 +36,13 @@ public void setup() { proxyRequest = new AwsProxyRequest(); Clock fixedClock = Clock.fixed(Instant.ofEpochSecond(665888523L), ZoneId.of("UTC")); mockServletRequest = mock(HttpServletRequest.class); - when(mockServletRequest.getAttribute(eq(API_GATEWAY_EVENT_PROPERTY))) - .thenReturn(proxyRequest); + context = new AwsProxyRequestContext(); + context.setIdentity(new ApiGatewayRequestIdentity()); + when(mockServletRequest.getAttribute(eq(API_GATEWAY_CONTEXT_PROPERTY))) + .thenReturn(context); when(mockServletRequest.getMethod()) .thenReturn("GET"); mockServletResponse = mock(HttpServletResponse.class); - context = new AwsProxyRequestContext(); - context.setIdentity(new ApiGatewayRequestIdentity()); proxyRequest.setRequestContext(context); sut = new ApacheCombinedServletLogFormatter(fixedClock); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index 349a9549..f379ff32 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -1,8 +1,10 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; @@ -25,6 +27,7 @@ public class AwsAsyncContextTest { private MockLambdaContext lambdaCtx = new MockLambdaContext(); private MockContainerHandler handler = new MockContainerHandler(); + private AwsProxyHttpServletRequestReader reader = new AwsProxyHttpServletRequestReader(); private AwsServletContextTest.TestServlet srv1 = new AwsServletContextTest.TestServlet("srv1"); private AwsServletContextTest.TestServlet srv2 = new AwsServletContextTest.TestServlet("srv2"); private AwsServletContext ctx = getCtx(); @@ -56,8 +59,8 @@ public void dispatch_sendsToCorrectServlet() { } @Test - public void dispatchNewPath_sendsToCorrectServlet() { - AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); + public void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { + AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest) reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); req.setServletContext(ctx); req.setContainerHandler(handler); @@ -83,7 +86,7 @@ private AwsServletContext getCtx() { return ctx; } - public static class MockContainerHandler extends AwsLambdaServletContainerHandler { + public static class MockContainerHandler extends AwsLambdaServletContainerHandler { private int desiredStatus; private HttpServletResponse response; private Servlet selectedServlet; @@ -94,7 +97,7 @@ public MockContainerHandler() { } @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @@ -115,7 +118,7 @@ protected void doFilter(HttpServletRequest request, HttpServletResponse response } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java new file mode 100644 index 00000000..004d4d48 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -0,0 +1,44 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.exceptions.InvalidRequestEventException; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; +import org.junit.Test; + +import javax.servlet.http.HttpServletRequest; + +import static org.junit.Assert.*; + +public class AwsHttpApiV2HttpServletRequestReaderTest { + private AwsHttpApiV2HttpServletRequestReader reader = new AwsHttpApiV2HttpServletRequestReader(); + + @Test + public void reflection_getRequestClass_returnsCorrectType() { + assertSame(HttpApiV2ProxyRequest.class, reader.getRequestClass()); + } + + @Test + public void baseRequest_read_populatesSuccessfully() { + HttpApiV2ProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET") + .referer("localhost") + .queryString("param1", "value1") + .header("custom", "value") + .apiId("test").toHttpApiV2Request(); + AwsHttpApiV2HttpServletRequestReader reader = new AwsHttpApiV2HttpServletRequestReader(); + try { + HttpServletRequest servletRequest = reader.readRequest(req, null, null, LambdaContainerHandler.getContainerConfig()); + assertEquals("/hello", servletRequest.getPathInfo()); + assertEquals("value1", servletRequest.getParameter("param1")); + assertEquals("value", servletRequest.getHeader("CUSTOM")); + + assertNotNull(servletRequest.getAttribute(AwsHttpApiV2HttpServletRequestReader.HTTP_API_CONTEXT_PROPERTY)); + assertEquals("test", + ((HttpApiV2ProxyRequestContext)servletRequest.getAttribute(AwsHttpApiV2HttpServletRequestReader.HTTP_API_CONTEXT_PROPERTY)).getApiId()); + } catch (InvalidRequestEventException e) { + e.printStackTrace(); + fail("Could not read request"); + } + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index de246bc0..166bfb47 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -25,13 +25,6 @@ public class AwsProxyHttpServletRequestReaderTest { private static final String ENCODED_REQUEST_PATH = "/foo/bar/Some%20Thing"; private static final String DECODED_REQUEST_PATH = "/foo/bar/Some Thing"; - @Test - public void readRequest_reflection_returnType() throws NoSuchMethodException { - Method readRequestMethod = AwsProxyHttpServletRequestReader.class.getMethod("readRequest", AwsProxyRequest.class, SecurityContext.class, Context.class, ContainerConfig.class); - - assertTrue(readRequestMethod.getReturnType() == AwsProxyHttpServletRequest.class); - } - @Test public void readRequest_validAwsProxy_populatedRequest() { AwsProxyRequest request = new AwsProxyRequestBuilder("/path", "GET").header(TEST_HEADER_KEY, TEST_HEADER_VALUE).build(); @@ -114,7 +107,7 @@ public void readRequest_contentCharset_appendsCharsetToComplextContentType() { public void readRequest_validEventEmptyPath_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder(null, "GET").build(); - AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); + HttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); assertNotNull(servletReq); } catch (InvalidRequestEventException e) { e.printStackTrace(); @@ -150,7 +143,7 @@ public void readRequest_nullHeaders_expectSuccess() { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); req.setMultiValueHeaders(null); try { - AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); + HttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); String headerValue = servletReq.getHeader(HttpHeaders.CONTENT_TYPE); assertNull(headerValue); } catch (InvalidRequestEventException e) { @@ -163,7 +156,7 @@ public void readRequest_nullHeaders_expectSuccess() { public void readRequest_emptyHeaders_expectSuccess() { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); try { - AwsProxyHttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); + HttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); String headerValue = servletReq.getHeader(HttpHeaders.CONTENT_TYPE); assertNull(headerValue); } catch (InvalidRequestEventException e) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index c73e64ab..732c3f69 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -23,10 +23,11 @@ import java.util.*; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; @RunWith(Parameterized.class) public class AwsProxyHttpServletRequestTest { - private boolean isWrapped; + private String requestType; private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "Custom-Header-Value"; @@ -39,58 +40,65 @@ public class AwsProxyHttpServletRequestTest { private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; private static ZonedDateTime REQUEST_DATE = ZonedDateTime.now(); - private static final AwsProxyRequest REQUEST_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "POST") - .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_INVALID_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "GET") - .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_FORM_URLENCODED_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST") + private static final AwsProxyRequestBuilder REQUEST_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "POST") + .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_INVALID_FORM_URLENCODED = new AwsProxyRequestBuilder("/hello", "GET") + .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_FORM_URLENCODED_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST") .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE) - .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_SINGLE_COOKIE = new AwsProxyRequestBuilder("/hello", "GET") - .cookie(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_MULTIPLE_COOKIES = new AwsProxyRequestBuilder("/hello", "GET") + .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_SINGLE_COOKIE = new AwsProxyRequestBuilder("/hello", "GET") + .cookie(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_MULTIPLE_COOKIES = new AwsProxyRequestBuilder("/hello", "GET") .cookie(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE) - .cookie(FORM_PARAM_TEST, FORM_PARAM_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_MALFORMED_COOKIE = new AwsProxyRequestBuilder("/hello", "GET") - .header(HttpHeaders.COOKIE, QUERY_STRING_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_MULTIPLE_FORM_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST") + .cookie(FORM_PARAM_TEST, FORM_PARAM_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_MALFORMED_COOKIE = new AwsProxyRequestBuilder("/hello", "GET") + .header(HttpHeaders.COOKIE, QUERY_STRING_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_MULTIPLE_FORM_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST") .form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE) - .queryString(FORM_PARAM_TEST, QUERY_STRING_NAME_VALUE).build(); - private static final AwsProxyRequest REQUEST_USER_AGENT_REFERER = new AwsProxyRequestBuilder("/hello", "POST") + .queryString(FORM_PARAM_TEST, QUERY_STRING_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_USER_AGENT_REFERER = new AwsProxyRequestBuilder("/hello", "POST") .userAgent(USER_AGENT) - .referer(REFERER).build(); - private static final AwsProxyRequest REQUEST_WITH_DATE = new AwsProxyRequestBuilder("/hello", "GET") - .header(HttpHeaders.DATE, AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE)) - .build(); - private static final AwsProxyRequest REQUEST_WITH_LOWERCASE_HEADER = new AwsProxyRequestBuilder("/hello", "POST") - .header(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), MediaType.APPLICATION_JSON).build(); - - private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING; + .referer(REFERER); + private static final AwsProxyRequestBuilder REQUEST_WITH_DATE = new AwsProxyRequestBuilder("/hello", "GET") + .header(HttpHeaders.DATE, AwsHttpServletRequest.dateFormatter.format(REQUEST_DATE)); + private static final AwsProxyRequestBuilder REQUEST_WITH_LOWERCASE_HEADER = new AwsProxyRequestBuilder("/hello", "POST") + .header(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), MediaType.APPLICATION_JSON); + + private static final AwsProxyRequestBuilder REQUEST_NULL_QUERY_STRING; static { AwsProxyRequest awsProxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); awsProxyRequest.setMultiValueQueryStringParameters(null); - REQUEST_NULL_QUERY_STRING = awsProxyRequest; + REQUEST_NULL_QUERY_STRING = new AwsProxyRequestBuilder(awsProxyRequest); } - private static final AwsProxyRequest REQUEST_QUERY = new AwsProxyRequestBuilder("/hello", "POST") - .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE).build(); + private static final AwsProxyRequestBuilder REQUEST_QUERY = new AwsProxyRequestBuilder("/hello", "POST") + .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE); - public AwsProxyHttpServletRequestTest(boolean wrap) { - isWrapped = wrap; + public AwsProxyHttpServletRequestTest(String type) { + requestType = type; } @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { false, true }); - } - - private HttpServletRequest getRequest(AwsProxyRequest req, Context lambdaCtx, SecurityContext securityCtx) { - HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req, lambdaCtx, securityCtx); - if (isWrapped) { - servletRequest = new AwsHttpServletRequestWrapper(servletRequest, req.getPath()); + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API", "WRAP" }); + } + + private HttpServletRequest getRequest(AwsProxyRequestBuilder req, Context lambdaCtx, SecurityContext securityCtx) { + switch (requestType) { + case "API_GW": + return new AwsProxyHttpServletRequest(req.build(), lambdaCtx, securityCtx); + case "ALB": + return new AwsProxyHttpServletRequest(req.alb().build(), lambdaCtx, securityCtx); + case "HTTP_API": + return new AwsHttpApiV2ProxyHttpServletRequest(req.toHttpApiV2Request(), lambdaCtx, securityCtx, LambdaContainerHandler.getContainerConfig()); + case "WRAP": + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(req.build(), lambdaCtx, securityCtx); + return new AwsHttpServletRequestWrapper(servletRequest, req.build().getPath()); + default: + throw new RuntimeException("Unknown test variant: " + requestType); } - return servletRequest; } @@ -104,6 +112,7 @@ public void headers_getHeader_validRequest() { @Test public void headers_getRefererAndUserAgent_returnsContextValues() { + assumeFalse("ALB".equals(requestType)); HttpServletRequest request = getRequest(REQUEST_USER_AGENT_REFERER, null, null); assertNotNull(request.getHeader("Referer")); assertEquals(REFERER, request.getHeader("Referer")); @@ -344,7 +353,7 @@ public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { @Test public void contentType_duplicateCase_expectSingleContentTypeHeader() { - AwsProxyRequest proxyRequest = getRequestWithHeaders(); + AwsProxyRequestBuilder proxyRequest = getRequestWithHeaders(); HttpServletRequest request = getRequest(proxyRequest, null, null); try { @@ -359,8 +368,9 @@ public void contentType_duplicateCase_expectSingleContentTypeHeader() { @Test public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { - AwsProxyRequest req = getRequestWithHeaders(); - req.getRequestContext().setApiId("test-id"); + assumeFalse("ALB".equals(requestType)); + AwsProxyRequestBuilder req = getRequestWithHeaders(); + req.apiId("test-id"); LambdaContainerHandler.getContainerConfig().enableLocalhost(); HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); @@ -369,7 +379,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { assertTrue(requestUrl.endsWith(".com/hello")); // set localhost - req.getMultiValueHeaders().putSingle("Host", "localhost"); + req.header("Host", "localhost"); servletRequest = getRequest(req, null, null); requestUrl = servletRequest.getRequestURL().toString(); assertTrue(requestUrl.contains("http://localhost")); @@ -379,7 +389,7 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { @Test public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { - AwsProxyRequest req = getRequestWithHeaders(); + AwsProxyRequestBuilder req = getRequestWithHeaders(); LambdaContainerHandler.getContainerConfig().setServiceBasePath("test"); HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); @@ -389,18 +399,20 @@ public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { @Test public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { - AwsProxyRequest req = getRequestWithHeaders(); - req.getRequestContext().setStage("test-stage"); + assumeFalse("ALB".equals(requestType)); + AwsProxyRequestBuilder req = getRequestWithHeaders(); + req.stage("test-stage"); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); + System.out.println(requestUrl); assertTrue(requestUrl.contains("/test-stage/")); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } @Test public void getLocales_emptyAcceptHeader_expectDefaultLocale() { - AwsProxyRequest req = getRequestWithHeaders(); + AwsProxyRequestBuilder req = getRequestWithHeaders(); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); int localesNo = 0; @@ -414,8 +426,8 @@ public void getLocales_emptyAcceptHeader_expectDefaultLocale() { @Test public void getLocales_validAcceptHeader_expectSingleLocale() { - AwsProxyRequest req = getRequestWithHeaders(); - req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); + AwsProxyRequestBuilder req = getRequestWithHeaders(); + req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); int localesNo = 0; @@ -429,8 +441,8 @@ public void getLocales_validAcceptHeader_expectSingleLocale() { @Test public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { - AwsProxyRequest req = getRequestWithHeaders(); - req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); + AwsProxyRequestBuilder req = getRequestWithHeaders(); + req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -450,8 +462,8 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { @Test public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered() { - AwsProxyRequest req = getRequestWithHeaders(); - req.getMultiValueHeaders().putSingle(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); + AwsProxyRequestBuilder req = getRequestWithHeaders(); + req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -468,7 +480,7 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrde @Test public void nullQueryString_expectNoExceptions() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); HttpServletRequest servletReq = getRequest(req, null, null); assertNull(servletReq.getQueryString()); assertEquals(0, servletReq.getParameterMap().size()); @@ -479,13 +491,13 @@ public void nullQueryString_expectNoExceptions() { @Test public void inputStream_emptyBody_expectNullInputStream() { - AwsProxyRequest proxyReq = getRequestWithHeaders(); - assertNull(proxyReq.getBody()); + AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); + assertNull(proxyReq.build().getBody()); HttpServletRequest req = getRequest(proxyReq, null, null); try { InputStream is = req.getInputStream(); - assertTrue(is.getClass() == AwsProxyHttpServletRequest.AwsServletInputStream.class); + assertTrue(is.getClass() == AwsServletInputStream.class); assertEquals(0, is.available()); } catch (IOException e) { fail("Could not get input stream"); @@ -494,7 +506,7 @@ public void inputStream_emptyBody_expectNullInputStream() { @Test public void getHeaders_emptyHeaders_expectEmptyEnumeration() { - AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/hello", "GET"); HttpServletRequest req = getRequest(proxyReq, null, null); assertFalse(req.getHeaders("param").hasMoreElements()); } @@ -507,26 +519,43 @@ public void getServerPort_defaultPort_expect443() { @Test public void getServerPort_customPortFromHeader_expectCustomPort() { - AwsProxyRequest proxyReq = getRequestWithHeaders(); - proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); + AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); + proxyReq.header(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(80, req.getServerPort()); } @Test public void getServerPort_invalidCustomPortFromHeader_expectDefaultPort() { - AwsProxyRequest proxyReq = getRequestWithHeaders(); - proxyReq.getMultiValueHeaders().putSingle(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); + AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); + proxyReq.header(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(443, req.getServerPort()); } + @Test + public void serverName_emptyHeaders_doesNotThrowNullPointer() { + AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/test", "GET"); + proxyReq.multiValueHeaders(null); + HttpServletRequest servletReq = getRequest(proxyReq, null, null); + String serverName = servletReq.getServerName(); + assertTrue(serverName.startsWith("null.execute-api")); + } + + @Test + public void serverName_hostHeader_returnsHostHeaderOnly() { + AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/test", "GET") + .header(HttpHeaders.HOST, "testapi.com"); + LambdaContainerHandler.getContainerConfig().addCustomDomain("testapi.com"); + HttpServletRequest servletReq = getRequest(proxyReq, null, null); + String serverName = servletReq.getServerName(); + assertEquals("testapi.com", serverName); + } - private AwsProxyRequest getRequestWithHeaders() { + private AwsProxyRequestBuilder getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP) - .build(); + .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java index 898f251b..d061a111 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java @@ -33,7 +33,7 @@ public class AwsProxyRequestDispatcherTest { @Test public void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); dispatcher.setRequestPath(servletRequest, FORWARD_PATH); @@ -43,7 +43,7 @@ public void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProx @Test public void setPathForWrappedRequest_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); SecurityContextHolderAwareRequestWrapper springSecurityRequest = new SecurityContextHolderAwareRequestWrapper(servletRequest, "ADMIN"); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); @@ -70,7 +70,7 @@ public void setPathForWrappedRequestWithoutGatewayEvent_forwardByPath_throwsExce @Test public void forwardRequest_nullHandler_throwsIllegalStateException() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); try { dispatcher.forward(servletRequest, new AwsHttpServletResponse(servletRequest, new CountDownLatch(1))); @@ -88,7 +88,7 @@ public void forwardRequest_nullHandler_throwsIllegalStateException() throws Inva @Test public void forwardRequest_committedResponse_throwsIllegalStateException() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); @@ -109,7 +109,7 @@ public void forwardRequest_committedResponse_throwsIllegalStateException() throw @Test public void forwardRequest_partiallyWrittenResponse_resetsBuffer() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyHttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); @@ -174,8 +174,8 @@ private interface RequestHandler { } - private AwsLambdaServletContainerHandler mockLambdaHandler(RequestHandler h) { - return new AwsLambdaServletContainerHandler( + private AwsLambdaServletContainerHandler mockLambdaHandler(RequestHandler h) { + return new AwsLambdaServletContainerHandler( AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), @@ -192,18 +192,18 @@ protected void doFilter(HttpServletRequest request, HttpServletResponse response } @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { if (h != null) { setServletContext(new AwsServletContext(this)); - containerRequest.setServletContext(getServletContext()); + ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); - h.handleRequest(containerRequest, containerResponse); + h.handleRequest((AwsProxyHttpServletRequest)containerRequest, containerResponse); } containerResponse.flushBuffer(); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java index a9fef9b1..1481afc7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java @@ -8,6 +8,7 @@ import com.amazonaws.services.lambda.runtime.Context; import org.junit.Test; +import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; import static org.junit.Assert.*; @@ -44,18 +45,18 @@ public void defaultProxy_setsValuesCorrectly() { assertEquals("test", test.name); } - public static final class TestHandler extends AwsLambdaServletContainerHandler { + public static final class TestHandler extends AwsLambdaServletContainerHandler { public TestHandler() { super(AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), new AwsProxyHttpServletResponseWriter(), new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler()); } @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return null; } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { } @@ -69,7 +70,7 @@ public static final class TestBuilder extends ServletLambdaContainerHandlerBuilder< AwsProxyRequest, AwsProxyResponse, - AwsProxyHttpServletRequest, + HttpServletRequest, TestHandler, TestBuilder> { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java new file mode 100644 index 00000000..42084330 --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -0,0 +1,146 @@ +package com.amazonaws.serverless.proxy.model; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Test; + +import java.util.ArrayList; + +import static org.junit.Assert.*; + +public class HttpApiV2ProxyRequestTest { + + private static final String BASE_PROXY_REQUEST = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [ \"cookie1\", \"cookie2\" ],\n" + + " \"headers\": {\n" + + " \"Header1\": \"value1\",\n" + + " \"Header2\": \"value2\"\n" + + " },\n" + + " \"queryStringParameters\": { \"parameter1\": \"value1,value2\", \"parameter2\": \"value\" },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authorizer\": { \"jwt\": {\n" + + " \"claims\": {\"claim1\": \"value1\", \"claim2\": \"value2\"},\n" + + " \"scopes\": [\"scope1\", \"scope2\"]\n" + + " }\n" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + + " }\n"; + private static final String NO_AUTH_PROXY = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [ \"cookie1\", \"cookie2\" ],\n" + + " \"headers\": {\n" + + " \"Header1\": \"value1\",\n" + + " \"Header2\": \"value2\"\n" + + " },\n" + + " \"queryStringParameters\": { \"parameter1\": \"value1,value2\", \"parameter2\": \"value\" },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authorizer\": {\n " + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"isBase64Encoded\": true,\n" + + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + + " }\n"; + + @Test + public void deserialize_fromJsonString_authorizerPopulatedCorrectly() { + try { + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); + assertTrue(req.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey("claim1")); + assertEquals(2, req.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().size()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while parsing request" + e.getMessage()); + } + } + + @Test + public void deserialize_fromJsonString_authorizerEmptyMap() { + try { + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); + assertNotNull(req.getRequestContext().getAuthorizer()); + assertFalse(req.getRequestContext().getAuthorizer().isJwt()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while parsing request" + e.getMessage()); + } + } + + @Test + public void deserialize_fromJsonString_isBase64EncodedPopulates() { + try { + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); + assertFalse(req.isBase64Encoded()); + req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); + assertTrue(req.isBase64Encoded()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while parsing request" + e.getMessage()); + } + } + + @Test + public void serialize_toJsonString_authorizerPopulatesCorrectly() { + HttpApiV2ProxyRequest req = new HttpApiV2ProxyRequest(); + req.setBase64Encoded(false); + req.setRequestContext(new HttpApiV2ProxyRequestContext()); + req.getRequestContext().setAuthorizer(new HttpApiV2AuthorizerMap()); + req.getRequestContext().getAuthorizer().putJwtAuthorizer(new HttpApiV2JwtAuthorizer()); + ArrayList scopes = new ArrayList<>(); + scopes.add("first"); + scopes.add("second"); + req.getRequestContext().getAuthorizer().getJwtAuthorizer().setScopes(scopes); + + try { + String reqString = LambdaContainerHandler.getObjectMapper().writeValueAsString(req); + assertTrue(reqString.contains("\"scopes\":[\"first\",\"second\"]")); + assertTrue(reqString.contains("\"authorizer\":{\"jwt\":{")); + assertTrue(reqString.contains("\"isBase64Encoded\":false")); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while serializing request" + e.getMessage()); + } + } +} diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 28edd3c9..b1c9b031 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.29.1 + 2.30.1 diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index cd6aa3e9..27e3157f 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.jersey; - import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier; @@ -40,7 +51,6 @@ import static com.amazonaws.serverless.proxy.RequestReader.JAX_SECURITY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.LAMBDA_CONTEXT_PROPERTY; - /** * Servlet filter class that calls Jersey's ApplicationHandler. Given a Jax RS Application object, this class * initializes a Jersey {@link ApplicationHandler} and calls its handle method. Requests are transformed diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index 83c01a33..bb9d9509 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -13,17 +13,8 @@ package com.amazonaws.serverless.proxy.jersey; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletContextSupplier; import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier; @@ -31,6 +22,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import org.glassfish.jersey.internal.inject.AbstractBinder; @@ -42,6 +34,7 @@ import javax.servlet.FilterRegistration; import javax.servlet.Servlet; import javax.servlet.ServletContext; +import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Application; @@ -74,7 +67,7 @@ * @param The type for the incoming Lambda event * @param The type for Lambda's return value */ -public class JerseyLambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class JerseyLambdaContainerHandler extends AwsLambdaServletContainerHandler { //------------------------------------------------------------- // Variables - Private @@ -97,13 +90,36 @@ public class JerseyLambdaContainerHandler extends Aws * @return A JerseyLambdaContainerHandler object */ public static JerseyLambdaContainerHandler getAwsProxyHandler(Application jaxRsApplication) { - JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - jaxRsApplication); + JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + jaxRsApplication); + newHandler.initialize(); + return newHandler; + } + + /** + * Returns an initialized JerseyLambdaContainerHandler that includes RequestReader and + * ResponseWriter objects for the HttpApiV2ProxyRequest and AwsProxyResponse + * objects. + * + * @param jaxRsApplication A configured Jax-Rs application object. For Jersey apps this can be the default + * ResourceConfig object + * @return A JerseyLambdaContainerHandler object + */ + public static JerseyLambdaContainerHandler getHttpApiV2ProxyHandler(Application jaxRsApplication) { + JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>( + HttpApiV2ProxyRequest.class, + AwsProxyResponse.class, + new AwsHttpApiV2HttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsHttpApiV2SecurityContextWriter(), + new AwsProxyExceptionHandler(), + jaxRsApplication); newHandler.initialize(); return newHandler; } @@ -126,7 +142,7 @@ public static JerseyLambdaContainerHandler ge */ public JerseyLambdaContainerHandler(Class requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, @@ -167,12 +183,7 @@ protected void configure() { //------------------------------------------------------------- @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { - return new AwsHttpServletResponse(request, latch); - } - - @Override - protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) + protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { // we retain the initialized property for backward compatibility if (!initialized) { @@ -180,12 +191,18 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH } Timer.start("JERSEY_HANDLE_REQUEST"); - httpServletRequest.setServletContext(getServletContext()); + if (AwsHttpServletRequest.class.isAssignableFrom(httpServletRequest.getClass())) { + ((AwsHttpServletRequest)httpServletRequest).setServletContext(getServletContext()); + } doFilter(httpServletRequest, httpServletResponse, null); Timer.stop("JERSEY_HANDLE_REQUEST"); } + @Override + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } @Override public void initialize() { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index be89c3a0..dbcaac40 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -22,6 +22,7 @@ import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -45,6 +46,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; /** * Unit test class for the Jersey AWS_PROXY default implementation @@ -66,6 +68,13 @@ public class JerseyAwsProxyTest { .register(new ResourceBinder()) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + private static ResourceConfig httpApiApp = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") + .register(LoggingFeature.class) + .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + private static ResourceConfig appWithoutRegisteredDependencies = new ResourceConfig() .packages("com.amazonaws.serverless.proxy.jersey") .register(LoggingFeature.class) @@ -73,55 +82,71 @@ public class JerseyAwsProxyTest { .register(MultiPartFeature.class) .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); - private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + private static JerseyLambdaContainerHandler handler; + private static JerseyLambdaContainerHandler httpApiHandler; private static JerseyLambdaContainerHandler handlerWithoutRegisteredDependencies = JerseyLambdaContainerHandler.getAwsProxyHandler(appWithoutRegisteredDependencies); private static Context lambdaContext = new MockLambdaContext(); - private boolean isAlb; + private String type; - public JerseyAwsProxyTest(boolean alb) { - isAlb = alb; + public JerseyAwsProxyTest(String reqType) { + type = reqType; } @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { false, true }); + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); } private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { - AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(path, method); - if (isAlb) builder.alb(); - return builder; + return new AwsProxyRequestBuilder(path, method); } - @Test - public void alb_basicRequest_expectSuccess() { - AwsProxyRequest request = getRequestBuilder("/echo/headers", "GET") - .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .alb() - .build(); - - AwsProxyResponse output = handler.proxy(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); - assertNotNull(output.getStatusDescription()); + private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { + switch (type) { + case "API_GW": + if (handler == null) { + handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + } + return handler.proxy(requestBuilder.build(), lambdaContext); + case "ALB": + if (handler == null) { + handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + } + return handler.proxy(requestBuilder.alb().build(), lambdaContext); + case "HTTP_API": + if (httpApiHandler == null) { + httpApiHandler = JerseyLambdaContainerHandler.getHttpApiV2ProxyHandler(httpApiApp); + } + return httpApiHandler.proxy(requestBuilder.toHttpApiV2Request(), lambdaContext); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } - validateMapResponseModel(output); + private JerseyLambdaContainerHandler getHandler() { + switch (type) { + case "API_GW": + case "ALB": + return handler; + case "HTTP_API": + return httpApiHandler; + default: + throw new RuntimeException("Unknown request type: " + type); + } } @Test public void headers_getHeaders_echo() { - AwsProxyRequest request = getRequestBuilder("/echo/headers", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/headers", "GET") .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -130,12 +155,11 @@ public void headers_getHeaders_echo() { @Test public void headers_servletRequest_echo() { - AwsProxyRequest request = getRequestBuilder("/echo/servlet-headers", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-headers", "GET") .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -144,6 +168,7 @@ public void headers_servletRequest_echo() { @Test public void headers_servletRequest_failedDependencyInjection_expectInternalServerError() { + assumeTrue("API_GW".equals(type)); AwsProxyRequest request = getRequestBuilder("/echo/servlet-headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) @@ -156,19 +181,18 @@ public void headers_servletRequest_failedDependencyInjection_expectInternalServe @Test public void context_servletResponse_setCustomHeader() { - AwsProxyRequest request = getRequestBuilder("/echo/servlet-response", "GET") - .json() - .build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-response", "GET") + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertTrue(output.getMultiValueHeaders().containsKey(EchoJerseyResource.SERVLET_RESP_HEADER_KEY)); } @Test public void context_serverInfo_correctContext() { - AwsProxyRequest request = getRequestBuilder("/echo/servlet-context", "GET").build(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-context", "GET"); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -177,11 +201,10 @@ public void context_serverInfo_correctContext() { @Test public void requestScheme_valid_expectHttps() { - AwsProxyRequest request = getRequestBuilder("/echo/scheme", "GET") - .json() - .build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/scheme", "GET") + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -190,11 +213,10 @@ public void requestScheme_valid_expectHttps() { @Test public void requestFilter_injectsServletRequest_expectCustomAttribute() { - AwsProxyRequest request = getRequestBuilder("/echo/filter-attribute", "GET") - .json() - .build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/filter-attribute", "GET") + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -203,31 +225,27 @@ public void requestFilter_injectsServletRequest_expectCustomAttribute() { @Test public void authorizer_securityContext_customPrincipalSuccess() { - AwsProxyRequest request = getRequestBuilder("/echo/authorizer-principal", "GET") + assumeTrue("API_GW".equals(type)); // TODO: We should figure out a way to run this for HTTP_API too + AwsProxyRequestBuilder request = getRequestBuilder("/echo/authorizer-principal", "GET") .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) - .build(); - - AwsProxyResponse output = handler.proxy(request, lambdaContext); - if (!isAlb) { - assertEquals(200, output.getStatusCode()); - assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); - validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); - } - + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); + AwsProxyResponse output = executeRequest(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); + validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } @Test public void authorizer_securityContext_customAuthorizerContextSuccess() { - AwsProxyRequest request = getRequestBuilder("/echo/authorizer-context", "GET") + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/authorizer-context", "GET") .json() .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) .authorizerContextValue(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .queryString("key", CUSTOM_HEADER_KEY) - .build(); + .queryString("key", CUSTOM_HEADER_KEY); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -236,31 +254,29 @@ public void authorizer_securityContext_customAuthorizerContextSuccess() { @Test public void errors_unknownRoute_expect404() { - AwsProxyRequest request = getRequestBuilder("/echo/test33", "GET").build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/test33", "GET"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } @Test public void error_contentType_invalidContentType() { - AwsProxyRequest request = getRequestBuilder("/echo/json-body", "POST") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/json-body", "POST") .header("Content-Type", "application/octet-stream") - .body("asdasdasd") - .build(); + .body("asdasdasd"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(415, output.getStatusCode()); } @Test public void error_statusCode_methodNotAllowed() { - AwsProxyRequest request = getRequestBuilder("/echo/status-code", "POST") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/status-code", "POST") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(405, output.getStatusCode()); } @@ -268,12 +284,11 @@ public void error_statusCode_methodNotAllowed() { public void responseBody_responseWriter_validBody() throws JsonProcessingException { SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); - AwsProxyRequest request = getRequestBuilder("/echo/json-body", "POST") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/json-body", "POST") .json() - .body(objectMapper.writeValueAsString(singleValueModel)) - .build(); + .body(objectMapper.writeValueAsString(singleValueModel)); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertNotNull(output.getBody()); @@ -282,29 +297,28 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti @Test public void statusCode_responseStatusCode_customStatusCode() { - AwsProxyRequest request = getRequestBuilder("/echo/status-code", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/status-code", "GET") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); } @Test public void base64_binaryResponse_base64Encoding() { - AwsProxyRequest request = getRequestBuilder("/echo/binary", "GET").build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/binary", "GET"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertTrue(Base64.isBase64(response.getBody())); } @Test public void exception_mapException_mapToNotImplemented() { - AwsProxyRequest request = getRequestBuilder("/echo/exception", "GET").build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/exception", "GET"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertEquals(EchoJerseyResource.EXCEPTION_MESSAGE, response.getBody()); assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); @@ -312,60 +326,58 @@ public void exception_mapException_mapToNotImplemented() { @Test public void stripBasePath_route_shouldRouteCorrectly() { - AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") .json() - .queryString("status", "201") - .build(); - handler.stripBasePath("/custompath"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + .queryString("status", "201"); + getHandler().stripBasePath("/custompath"); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); - handler.stripBasePath(""); + getHandler().stripBasePath(""); } @Test public void stripBasePath_route_shouldReturn404WithStageAsContext() { - AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") + assumeTrue(!"ALB".equals(type)); + AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") .stage("prod") .json() - .queryString("status", "201") - .build(); - handler.stripBasePath("/custompath"); + .queryString("status", "201"); + getHandler().stripBasePath("/custompath"); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); - handler.stripBasePath(""); + getHandler().stripBasePath(""); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } @Test public void stripBasePath_route_shouldReturn404() { - AwsProxyRequest request = getRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") .json() - .queryString("status", "201") - .build(); - handler.stripBasePath("/custom"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + .queryString("status", "201"); + getHandler().stripBasePath("/custom"); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); - handler.stripBasePath(""); + getHandler().stripBasePath(""); } @Test public void securityContext_injectPrincipal_expectPrincipalName() { - AwsProxyRequest request = getRequestBuilder("/echo/security-context", "GET") - .authorizerPrincipal(USER_PRINCIPAL).build(); + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/security-context", "GET") + .authorizerPrincipal(USER_PRINCIPAL); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, USER_PRINCIPAL); } @Test public void emptyStream_putNullBody_expectPutToSucceed() { - AwsProxyRequest request = getRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") .nullBody() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, CUSTOM_HEADER_KEY); } @@ -373,26 +385,24 @@ public void emptyStream_putNullBody_expectPutToSucceed() { @Test public void refererHeader_headerParam_expectCorrectInjection() { String refererValue = "test-referer"; - AwsProxyRequest request = getRequestBuilder("/echo/referer-header", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/referer-header", "GET") .nullBody() .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header("Referer", refererValue) - .build(); + .header("Referer", refererValue); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, refererValue); } @Test public void textPlainContent_plain_responseHonorsContentType() { - AwsProxyRequest req = getRequestBuilder("/echo/plain", "GET") + AwsProxyRequestBuilder req = getRequestBuilder("/echo/plain", "GET") .nullBody() .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) - .build(); + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); - AwsProxyResponse resp = handler.proxy(req, lambdaContext); + AwsProxyResponse resp = executeRequest(req, lambdaContext); assertEquals(200, resp.getStatusCode()); assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); assertEquals(MediaType.TEXT_PLAIN, resp.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).get(0)); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index d3b951ae..e736cbc1 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -8,6 +8,7 @@ import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; @@ -67,37 +68,62 @@ public class JerseyParamEncodingTest { .register(new ResourceBinder()) .property("jersey.config.server.tracing.type", "ALL") .property("jersey.config.server.tracing.threshold", "VERBOSE"); - private static JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + private static JerseyLambdaContainerHandler handler; + + private static ResourceConfig httpApiApp = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property("jersey.config.server.tracing.type", "ALL") + .property("jersey.config.server.tracing.threshold", "VERBOSE"); + private static JerseyLambdaContainerHandler httpApiHandler; private static Context lambdaContext = new MockLambdaContext(); - private boolean isAlb; + private String type; - public JerseyParamEncodingTest(boolean alb) { - isAlb = alb; + public JerseyParamEncodingTest(String reqType) { + type = reqType; LambdaContainerHandler.getContainerConfig().addBinaryContentTypes(MediaType.MULTIPART_FORM_DATA); } @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { false, true }); + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); } private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { - AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(path, method); - if (isAlb) builder.alb(); + return new AwsProxyRequestBuilder(path, method); + } - return builder; + private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { + switch (type) { + case "API_GW": + if (handler == null) { + handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + } + return handler.proxy(requestBuilder.build(), lambdaContext); + case "ALB": + if (handler == null) { + handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app); + } + return handler.proxy(requestBuilder.alb().build(), lambdaContext); + case "HTTP_API": + if (httpApiHandler == null) { + httpApiHandler = JerseyLambdaContainerHandler.getHttpApiV2ProxyHandler(httpApiApp); + } + return httpApiHandler.proxy(requestBuilder.toHttpApiV2Request(), lambdaContext); + default: + throw new RuntimeException("Unknown request type: " + type); + } } @Test public void queryString_uriInfo_echo() { - AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) - .build(); + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -106,12 +132,11 @@ public void queryString_uriInfo_echo() { @Test public void queryString_notEncoded_echo() { - AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE) - .build(); + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -121,12 +146,11 @@ public void queryString_notEncoded_echo() { @Test @Ignore("We expect to only receive decoded values from API Gateway") public void queryString_encoded_echo() { - AwsProxyRequest request = getRequestBuilder("/echo/query-string", "GET") + AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) - .build(); + .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); @@ -135,46 +159,46 @@ public void queryString_encoded_echo() { @Test public void simpleQueryParam_encoding_expectDecodedParam() { - AwsProxyRequest request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, SIMPLE_ENCODED_PARAM); } @Test public void jsonQueryParam_encoding_expectDecodedParam() { - AwsProxyRequest request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, JSON_ENCODED_PARAM); } @Test public void simpleQueryParam_encoding_expectEncodedParam() { - AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM).build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM); String encodedVal = ""; try { encodedVal = URLEncoder.encode(SIMPLE_ENCODED_PARAM, "UTF-8"); } catch (UnsupportedEncodingException e) { fail("Could not encode parameter value"); } - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, encodedVal); } @Test public void jsonQueryParam_encoding_expectEncodedParam() { - AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM).build(); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM); String encodedVal = ""; try { encodedVal = URLEncoder.encode(JSON_ENCODED_PARAM, "UTF-8"); } catch (UnsupportedEncodingException e) { fail("Could not encode parameter value"); } - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, encodedVal); } @@ -182,8 +206,8 @@ public void jsonQueryParam_encoding_expectEncodedParam() { @Test public void queryParam_encoding_expectFullyEncodedUrl() { String paramValue = "/+="; - AwsProxyRequest request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue).build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); validateSingleValueModel(resp, "%2F%2B%3D"); @@ -193,8 +217,8 @@ public void queryParam_encoding_expectFullyEncodedUrl() { public void pathParam_encoded_routesToCorrectPath() { String encodedParam = "http%3A%2F%2Fhelloresource.com"; String path = "/echo/encoded-path/" + encodedParam; - AwsProxyRequest request = getRequestBuilder(path, "GET").build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder(path, "GET"); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); validateSingleValueModel(resp, encodedParam); @@ -204,8 +228,8 @@ public void pathParam_encoded_routesToCorrectPath() { public void pathParam_encoded_returns404() { String encodedParam = "http://helloresource.com"; String path = "/echo/encoded-path/" + encodedParam; - AwsProxyRequest request = getRequestBuilder(path, "GET").build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder(path, "GET"); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 404); } @@ -213,8 +237,8 @@ public void pathParam_encoded_returns404() { @Test @Ignore public void queryParam_listOfString_expectCorrectLength() { - AwsProxyRequest request = getRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3").build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3"); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(resp.getStatusCode(), 200); validateSingleValueModel(resp, "3"); @@ -223,11 +247,9 @@ public void queryParam_listOfString_expectCorrectLength() { @Test public void multipart_getFileSize_expectCorrectLength() throws IOException { - AwsProxyRequest request = getRequestBuilder("/echo/file-size", "POST") - .formFilePart("file", "myfile.jpg", FILE_CONTENTS) - //.formFieldPart("name", QUERY_STRING_ENCODED_VALUE) - .build(); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyRequestBuilder request = getRequestBuilder("/echo/file-size", "POST") + .formFilePart("file", "myfile.jpg", FILE_CONTENTS); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, "" + FILE_CONTENTS.length); diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 368a5e81..2c16eaa9 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -14,16 +14,12 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; @@ -38,6 +34,7 @@ import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.Servlet; +import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -75,7 +72,7 @@ * @param The response object produced by the ResponseWriter implementation in the constructor */ public class SparkLambdaContainerHandler - extends AwsLambdaServletContainerHandler { + extends AwsLambdaServletContainerHandler { //------------------------------------------------------------- // Constants @@ -121,6 +118,31 @@ public static SparkLambdaContainerHandler get return newHandler; } + /** + * Returns a new instance of an SparkLambdaContainerHandler initialized to work with HttpApiV2ProxyRequest + * and AwsProxyResponse objects. + * + * @return a new instance of SparkLambdaContainerHandler + * + * @throws ContainerInitializationException Throws this exception if we fail to initialize the Spark container. + * This could be caused by the introspection used to insert the library as the default embedded container + */ + public static SparkLambdaContainerHandler getHttpApiV2ProxyHandler() + throws ContainerInitializationException { + SparkLambdaContainerHandler newHandler = new SparkLambdaContainerHandler<>(HttpApiV2ProxyRequest.class, + AwsProxyResponse.class, + new AwsHttpApiV2HttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsHttpApiV2SecurityContextWriter(), + new AwsProxyExceptionHandler(), + new LambdaEmbeddedServerFactory()); + + // For Spark we cannot call initialize here. It needs to be called manually after the routes are set + //newHandler.initialize(); + + return newHandler; + } + //------------------------------------------------------------- // Constructors //------------------------------------------------------------- @@ -128,7 +150,7 @@ public static SparkLambdaContainerHandler get public SparkLambdaContainerHandler(Class requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, @@ -177,13 +199,13 @@ public SparkLambdaContainerHandler(Class requestTypeClass, @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @Override - protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) + protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { Timer.start("SPARK_HANDLE_REQUEST"); @@ -191,7 +213,9 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, AwsH initialize(); } - httpServletRequest.setServletContext(getServletContext()); + if (AwsHttpServletRequest.class.isAssignableFrom(httpServletRequest.getClass())) { + ((AwsHttpServletRequest)httpServletRequest).setServletContext(getServletContext()); + } doFilter(httpServletRequest, httpServletResponse, null); Timer.stop("SPARK_HANDLE_REQUEST"); diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index f4f227c4..4be5d856 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spark.embeddedserver; import com.amazonaws.serverless.exceptions.ContainerInitializationException; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java index 3455170f..9074e5dd 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spark.embeddedserver; import com.amazonaws.serverless.proxy.internal.testutils.Timer; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index 74cd5504..0c41f91f 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -8,8 +8,9 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -19,7 +20,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.util.Arrays; import java.util.Collection; @@ -43,36 +43,58 @@ public class HelloWorldSparkStreamTest { private static final String COOKIE_PATH = "/"; private static SparkLambdaContainerHandler handler; + private static SparkLambdaContainerHandler httpApiHandler; - private boolean isAlb; + private String type; - public HelloWorldSparkStreamTest(boolean alb) { - isAlb = alb; + public HelloWorldSparkStreamTest(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + break; + case "HTTP_API": + httpApiHandler = SparkLambdaContainerHandler.getHttpApiV2ProxyHandler(); + break; + default: + throw new RuntimeException("Unknown request type: " + type); + } + + configureRoutes(); + Spark.awaitInitialization(); + } catch (RuntimeException | ContainerInitializationException e) { + e.printStackTrace(); + fail(); + } } @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { false, true }); + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); } private AwsProxyRequestBuilder getRequestBuilder() { - AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(); - if (isAlb) builder.alb(); - - return builder; + return new AwsProxyRequestBuilder(); } - @BeforeClass - public static void initializeServer() { - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - - configureRoutes(); - Spark.awaitInitialization(); - } catch (RuntimeException | ContainerInitializationException e) { - e.printStackTrace(); - fail(); + private ByteArrayOutputStream executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) throws IOException { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + switch (type) { + case "API_GW": + handler.proxyStream(requestBuilder.buildStream(), os, lambdaContext); + break; + case "ALB": + handler.proxyStream(requestBuilder.alb().buildStream(), os, lambdaContext); + break; + case "HTTP_API": + httpApiHandler.proxyStream(requestBuilder.toHttpApiV2RequestStream(), os, lambdaContext); + break; + default: + throw new RuntimeException("Unknown request type: " + type); } + return os; } @AfterClass @@ -82,10 +104,8 @@ public static void stopSpark() { @Test public void helloRequest_basicStream_populatesOutputSuccessfully() { - InputStream req = getRequestBuilder().method("GET").path("/hello").buildStream(); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { - handler.proxyStream(req, outputStream, new MockLambdaContext()); + ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path("/hello"), new MockLambdaContext()); AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); assertEquals(200, response.getStatusCode()); @@ -100,10 +120,8 @@ public void helloRequest_basicStream_populatesOutputSuccessfully() { @Test public void nullPathRequest_doesntFail_expectA404() { - InputStream req = getRequestBuilder().method("GET").path(null).buildStream(); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { - handler.proxyStream(req, outputStream, new MockLambdaContext()); + ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path(null), new MockLambdaContext()); AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); assertEquals(404, response.getStatusCode()); diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5b6117cb..6065d464 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -60,6 +60,15 @@ test + + + javax.activation + activation + 1.1.1 + test + + + org.hibernate hibernate-validator diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index cb449568..98841ed4 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -18,16 +18,20 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ConfigurableWebApplicationContext; import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; @@ -47,7 +51,9 @@ * @param The expected return type */ @Deprecated -public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { + private static final String DISPATCHER_SERVLET_REGISTRATION_NAME = "dispatcherServlet"; + private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); private String[] springProfiles = null; @@ -78,7 +84,7 @@ public static SpringBootLambdaContainerHandler getInstance() { */ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() + return new SpringBootProxyHandlerBuilder() .defaultProxy() .initializationWrapper(new InitializationWrapper()) .springBootApplication(springBootInitializer) @@ -86,6 +92,23 @@ public static SpringBootLambdaContainerHandler getHttpApiV2ProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + return new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); + } + /** * Creates a new container handler with the given reader and writer objects * @@ -99,7 +122,7 @@ public static SpringBootLambdaContainerHandler requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, @@ -130,12 +153,12 @@ public void activateSpringProfiles(String... profiles) { } @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { // this method of the AwsLambdaServletContainerHandler sets the servlet context Timer.start("SPRINGBOOT_HANDLE_REQUEST"); @@ -144,11 +167,13 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt initialize(); } - containerRequest.setServletContext(getServletContext()); + if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { + ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); + ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); + } // process filters & invoke servlet Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - containerRequest.setResponse(containerResponse); doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); } @@ -169,8 +194,14 @@ public void initialize() springEnv.setActiveProfiles(springProfiles); app.setEnvironment(springEnv); } - app.run(); + ConfigurableApplicationContext applicationContext = app.run(); + ((ConfigurableWebApplicationContext)applicationContext).setServletContext(getServletContext()); + AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); + if (reg != null) { + reg.setLoadOnStartup(1); + } + super.initialize(); initialized = true; Timer.stop("SPRINGBOOT_COLD_START"); } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java index 4ead5bc4..2f06e73e 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -7,38 +19,40 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import org.springframework.web.WebApplicationInitializer; -public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< - AwsProxyRequest, +import javax.servlet.http.HttpServletRequest; + +public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + RequestType, AwsProxyResponse, - AwsProxyHttpServletRequest, - SpringBootLambdaContainerHandler, - SpringBootProxyHandlerBuilder> { + HttpServletRequest, + SpringBootLambdaContainerHandler, + SpringBootProxyHandlerBuilder> { private Class springBootInitializer; private String[] profiles; @Override - protected SpringBootProxyHandlerBuilder self() { + protected SpringBootProxyHandlerBuilder self() { return this; } - public SpringBootProxyHandlerBuilder springBootApplication(Class app) { + public SpringBootProxyHandlerBuilder springBootApplication(Class app) { springBootInitializer = app; return self(); } - public SpringBootProxyHandlerBuilder profiles(String... profiles) { + public SpringBootProxyHandlerBuilder profiles(String... profiles) { this.profiles = profiles; return self(); } @Override - public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { + public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { validate(); if (springBootInitializer == null) { throw new ContainerInitializationException("Missing spring boot application class in builder", null); } - SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( + SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( requestTypeClass, responseTypeClass, requestReader, @@ -55,8 +69,8 @@ public SpringBootLambdaContainerHandler build } @Override - public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { - SpringBootLambdaContainerHandler handler = build(); + public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringBootLambdaContainerHandler handler = build(); initializationWrapper.start(handler); return handler; } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java index d975bd20..9857c962 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring; import org.springframework.boot.context.embedded.WebApplicationContextServletContextAwareProcessor; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 5168fa96..862df3bd 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -18,13 +18,14 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.Servlet; import javax.servlet.ServletRegistration; +import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; @@ -35,7 +36,7 @@ * @param The incoming event type * @param The expected return type */ -public class SpringLambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class SpringLambdaContainerHandler extends AwsLambdaServletContainerHandler { private ConfigurableWebApplicationContext appContext; private String[] profiles; @@ -46,10 +47,10 @@ public class SpringLambdaContainerHandler extends Aws * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects * @param config A set of classes annotated with the Spring @Configuration annotation * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException + * @throws ContainerInitializationException When the Spring framework fails to start. */ - public static SpringLambdaContainerHandler getAwsProxyHandler(Class... config) throws ContainerInitializationException { - return new SpringProxyHandlerBuilder() + public static SpringLambdaContainerHandler getAwsProxyHandler(Class... config) throws ContainerInitializationException { + return new SpringProxyHandlerBuilder() .defaultProxy() .initializationWrapper(new InitializationWrapper()) .configurationClasses(config) @@ -61,11 +62,11 @@ public static SpringLambdaContainerHandler ge * @param applicationContext A custom ConfigurableWebApplicationContext to be used * @param profiles The spring profiles to activate * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException + * @throws ContainerInitializationException When the Spring framework fails to start. */ public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext, String... profiles) throws ContainerInitializationException { - return new SpringProxyHandlerBuilder() + return new SpringProxyHandlerBuilder() .defaultProxy() .initializationWrapper(new InitializationWrapper()) .springApplicationContext(applicationContext) @@ -73,6 +74,20 @@ public static SpringLambdaContainerHandler ge .buildAndInitialize(); } + /** + * Creates a default SpringLambdaContainerHandler initialized with the `HttpApiV2ProxyRequest` and `AwsProxyResponse` objects + * @param config A set of classes annotated with the Spring @Configuration annotation + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException When the Spring framework fails to start. + */ + public static SpringLambdaContainerHandler getHttpApiV2ProxyHandler(Class... config) throws ContainerInitializationException { + return new SpringProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .configurationClasses(config) + .buildAndInitialize(); + } + /** * Creates a new container handler with the given reader and writer objects * @@ -81,17 +96,15 @@ public static SpringLambdaContainerHandler ge * @param responseWriter An implementation of `ResponseWriter` * @param securityContextWriter An implementation of `SecurityContextWriter` * @param exceptionHandler An implementation of `ExceptionHandler` - * @throws ContainerInitializationException */ public SpringLambdaContainerHandler(Class requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, ConfigurableWebApplicationContext applicationContext, - InitializationWrapper init) - throws ContainerInitializationException { + InitializationWrapper init) { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRING_CONTAINER_HANDLER_CONSTRUCTOR"); appContext = applicationContext; @@ -111,7 +124,7 @@ public void setRefreshContext(boolean refresh) { @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @@ -131,7 +144,7 @@ public void activateSpringProfiles(String... p) throws ContainerInitializationEx } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { Timer.start("SPRING_HANDLE_REQUEST"); if (refreshContext) { @@ -139,11 +152,13 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt refreshContext = false; } - containerRequest.setServletContext(getServletContext()); + if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { + ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); + ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); + } // process filters Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - containerRequest.setResponse(containerResponse); doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRING_HANDLE_REQUEST"); } @@ -160,6 +175,9 @@ public void initialize() DispatcherServlet dispatcher = new DispatcherServlet(appContext); ServletRegistration.Dynamic reg = getServletContext().addServlet("dispatcherServlet", dispatcher); reg.addMapping("/"); + reg.setLoadOnStartup(1); + // call initialize on AwsLambdaServletContainerHandler to initialize servlets that are set to load on startup + super.initialize(); Timer.stop("SPRING_COLD_START"); } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java index 9bfbf3cb..689b6de2 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -9,39 +21,41 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -public final class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< - AwsProxyRequest, +import javax.servlet.http.HttpServletRequest; + +public final class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + RequestType, AwsProxyResponse, - AwsProxyHttpServletRequest, - SpringLambdaContainerHandler, - SpringProxyHandlerBuilder> { + HttpServletRequest, + SpringLambdaContainerHandler, + SpringProxyHandlerBuilder> { private ConfigurableWebApplicationContext springContext; private Class[] configurationClasses; private String[] profiles; @Override - protected SpringProxyHandlerBuilder self() { + protected SpringProxyHandlerBuilder self() { return this; } - public SpringProxyHandlerBuilder springApplicationContext(ConfigurableWebApplicationContext app) { + public SpringProxyHandlerBuilder springApplicationContext(ConfigurableWebApplicationContext app) { springContext = app; return self(); } - public SpringProxyHandlerBuilder configurationClasses(Class... config) { + public SpringProxyHandlerBuilder configurationClasses(Class... config) { configurationClasses = config; return self(); } - public SpringProxyHandlerBuilder profiles(String... profiles) { + public SpringProxyHandlerBuilder profiles(String... profiles) { this.profiles = profiles; return self(); } @Override - public SpringLambdaContainerHandler build() throws ContainerInitializationException { + public SpringLambdaContainerHandler build() throws ContainerInitializationException { validate(); if (springContext == null && (configurationClasses == null || configurationClasses.length == 0)) { throw new ContainerInitializationException("Missing both configuration classes and application context, at least" + @@ -55,7 +69,7 @@ public SpringLambdaContainerHandler build() t } } - SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler<>( + SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler( requestTypeClass, responseTypeClass, requestReader, @@ -72,8 +86,8 @@ public SpringLambdaContainerHandler build() t } @Override - public SpringLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { - SpringLambdaContainerHandler handler = build(); + public SpringLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringLambdaContainerHandler handler = build(); initializationWrapper.start(handler); return handler; } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java index 4e9a8836..bd567ed7 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring.embedded; import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index b9cb728d..c1365a5b 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -1,8 +1,10 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; +import com.amazonaws.serverless.proxy.model.*; import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; @@ -12,12 +14,14 @@ import com.amazonaws.serverless.proxy.spring.echoapp.UnauthenticatedFilter; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; +import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -25,35 +29,88 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.web.servlet.DispatcherServlet; +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.Collection; +import java.util.EnumSet; import java.util.UUID; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {EchoSpringAppConfig.class}) -@WebAppConfiguration -@TestExecutionListeners(inheritListeners = false, listeners = {DependencyInjectionTestExecutionListener.class}) -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) +@RunWith(Parameterized.class) public class SpringAwsProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); + private static final String UNICODE_VALUE = "שלום לכולם"; - @Autowired - private ObjectMapper objectMapper; + private ObjectMapper objectMapper = new ObjectMapper(); + private MockLambdaContext lambdaContext = new MockLambdaContext(); + private static SpringLambdaContainerHandler handler; + private static SpringLambdaContainerHandler httpApiHandler; - @Autowired - private MockLambdaContext lambdaContext; + private AwsLambdaServletContainerHandler.StartupHandler h = (c -> { + FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); + // update the registration to map to a path + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*"); + // servlet name mappings are disabled and will throw an exception - @Autowired - private SpringLambdaContainerHandler handler; + //handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); + ((DispatcherServlet)((AwsServletRegistration)c.getServletRegistration("dispatcherServlet")).getServlet()).setThrowExceptionIfNoHandlerFound(true); + }); + + private String type; + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + } + + public SpringAwsProxyTest(String reqType) { + type = reqType; + } + + private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { + try { + switch (type) { + case "API_GW": + if (handler == null) { + handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); + handler.onStartup(h); + } + return handler.proxy(requestBuilder.build(), lambdaContext); + case "ALB": + if (handler == null) { + handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); + handler.onStartup(h); + } + return handler.proxy(requestBuilder.alb().build(), lambdaContext); + case "HTTP_API": + if (httpApiHandler == null) { + httpApiHandler = SpringLambdaContainerHandler.getHttpApiV2ProxyHandler(EchoSpringAppConfig.class); + httpApiHandler.onStartup(h); + } + return httpApiHandler.proxy(requestBuilder.toHttpApiV2Request(), lambdaContext); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail("Could not execute request"); + throw new RuntimeException(e); + } + } @Before public void clearServletContextCache() { @@ -62,12 +119,11 @@ public void clearServletContextCache() { @Test public void controllerAdvice_invalidPath_returnAdvice() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo2", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo2", "GET") .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertNotNull(output); assertEquals(404, output.getStatusCode()); validateSingleValueModel(output, RestControllerAdvice.ERROR_MESSAGE); @@ -76,12 +132,11 @@ public void controllerAdvice_invalidPath_returnAdvice() { @Test public void headers_getHeaders_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/headers", "GET") .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); @@ -90,12 +145,11 @@ public void headers_getHeaders_echo() { @Test public void headers_servletRequest_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-headers", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/servlet-headers", "GET") .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); @@ -104,12 +158,11 @@ public void headers_servletRequest_echo() { @Test public void queryString_uriInfo_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/query-string", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/query-string", "GET") .json() - .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); @@ -118,12 +171,11 @@ public void queryString_uriInfo_echo() { @Test public void queryString_listParameter_expectCorrectLength() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET") .json() - .queryString("list", "v1,v2,v3") - .build(); + .queryString("list", "v1,v2,v3"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); validateSingleValueModel(output, "3"); @@ -132,13 +184,12 @@ public void queryString_listParameter_expectCorrectLength() { @Test public void queryString_multiParam_expectCorrectValueCount() throws IOException { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/multivalue-query-string", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/multivalue-query-string", "GET") .json() .queryString("multiple", "first") - .queryString("multiple", "second") - .build(); + .queryString("multiple", "second"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); @@ -149,42 +200,40 @@ public void queryString_multiParam_expectCorrectValueCount() @Test public void dateHeader_notModified_expect304() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") .json() .header( HttpHeaders.IF_MODIFIED_SINCE, DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(1, ChronoUnit.SECONDS)) - ) - .build(); + ); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(304, output.getStatusCode()); assertEquals("", output.getBody()); } @Test public void dateHeader_notModified_expect200() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") .json() .header( HttpHeaders.IF_MODIFIED_SINCE, DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(5, ChronoUnit.DAYS)) - ) - .build(); + ); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(EchoResource.STRING_BODY, output.getBody()); } @Test public void authorizer_securityContext_customPrincipalSuccess() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) - .build(); + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type").split(";")[0]); @@ -193,43 +242,40 @@ public void authorizer_securityContext_customPrincipalSuccess() { @Test public void errors_unknownRoute_expect404() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/test33", "GET").build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/test33", "GET"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } @Test public void error_contentType_invalidContentType() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/json-body", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") .header("Content-Type", "application/octet-stream") - .body("asdasdasd") - .build(); + .body("asdasdasd"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(415, output.getStatusCode()); } @Test public void error_statusCode_methodNotAllowed() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "POST") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(405, output.getStatusCode()); } @Test public void error_unauthenticatedCall_filterStepsRequest() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "GET") .header(UnauthenticatedFilter.HEADER_NAME, "1") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(401, output.getStatusCode()); } @@ -237,46 +283,58 @@ public void error_unauthenticatedCall_filterStepsRequest() { public void responseBody_responseWriter_validBody() throws JsonProcessingException { SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/json-body", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") .json() .header("Content-Type", "application/json") - .body(objectMapper.writeValueAsString(singleValueModel)) - .build(); + .body(objectMapper.writeValueAsString(singleValueModel)); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertNotNull(output.getBody()); validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } + @Test + public void responseBody_responseWriter_validBody_UTF() throws JsonProcessingException { + SingleValueModel singleValueModel = new SingleValueModel(); + singleValueModel.setValue(UNICODE_VALUE); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") + .header("Content-Type", "application/json; charset=UTF-8") + .body(objectMapper.writeValueAsString(singleValueModel)); + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); + AwsProxyResponse output = executeRequest(request, lambdaContext); + assertEquals(200, output.getStatusCode()); + assertNotNull(output.getBody()); + validateSingleValueModel(output, UNICODE_VALUE); + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + } + @Test public void statusCode_responseStatusCode_customStatusCode() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/status-code", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "GET") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); } @Test public void base64_binaryResponse_base64Encoding() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/binary", "GET").build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/binary", "GET"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertTrue(Base64.isBase64(response.getBody())); } @Test public void injectBody_populatedResponse_noException() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-body", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-body", "POST") .header(HttpHeaders.CONTENT_TYPE, "text/plain") - .body("This is a populated body") - .build(); + .body("This is a populated body"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertEquals(200, response.getStatusCode()); try { @@ -287,9 +345,8 @@ public void injectBody_populatedResponse_noException() { fail(); } - AwsProxyRequest emptyReq = new AwsProxyRequestBuilder("/echo/request-body", "POST") - .build(); - AwsProxyResponse emptyResp = handler.proxy(emptyReq, lambdaContext); + AwsProxyRequestBuilder emptyReq = new AwsProxyRequestBuilder("/echo/request-body", "POST"); + AwsProxyResponse emptyResp = executeRequest(emptyReq, lambdaContext); try { SingleValueModel output = objectMapper.readValue(emptyResp.getBody(), SingleValueModel.class); assertEquals(null, output.getValue()); @@ -303,28 +360,26 @@ public void injectBody_populatedResponse_noException() { public void servletRequestEncoding_acceptEncoding_okStatusCode() { SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); - AwsProxyRequest request = null; + AwsProxyRequestBuilder request = null; try { request = new AwsProxyRequestBuilder("/echo/json-body", "POST") .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) .header(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate") .queryString("status", "200") - .body(objectMapper.writeValueAsString(singleValueModel)) - .build(); + .body(objectMapper.writeValueAsString(singleValueModel)); } catch (JsonProcessingException e) { fail("Could not serialize object to JSON"); } - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); } @Test public void request_requestURI() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-URI", "GET") - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-URI", "GET"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); validateSingleValueModel(output, "/echo/request-URI"); @@ -332,13 +387,12 @@ public void request_requestURI() { @Test public void request_requestURL() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/request-url", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-url", "GET") .scheme("https") .serverName("api.myserver.com") - .stage("prod") - .build(); + .stage("prod"); handler.stripBasePath(""); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); validateSingleValueModel(output, "https://api.myserver.com/echo/request-url"); @@ -346,13 +400,12 @@ public void request_requestURL() { @Test public void request_encodedPath_returnsDecodedPath() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/encoded-request-uri/Some%20Thing", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/encoded-request-uri/Some%20Thing", "GET") .scheme("https") .serverName("api.myserver.com") - .stage("prod") - .build(); + .stage("prod"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); validateSingleValueModel(output, "Some Thing"); @@ -361,15 +414,15 @@ public void request_encodedPath_returnsDecodedPath() { @Test public void contextPath_generateLink_returnsCorrectPath() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/generate-uri", "GET") + assumeFalse("ALB".equals(type)); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/generate-uri", "GET") .scheme("https") .serverName("api.myserver.com") - .stage("prod") - .build(); + .stage("prod"); LambdaContainerHandler.getContainerConfig().addCustomDomain("api.myserver.com"); SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); String expectedUri = "https://api.myserver.com/prod/echo/encoded-request-uri/" + EchoResource.TEST_GENERATE_URI; @@ -382,11 +435,10 @@ public void contextPath_generateLink_returnsCorrectPath() { @Test public void multipart_getFileName_returnsCorrectFileName() throws IOException { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/attachment", "POST") - .formFilePart("testFile", "myFile.txt", "hello".getBytes()) - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/attachment", "POST") + .formFilePart("testFile", "myFile.txt", "hello".getBytes()); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals("testFile", output.getBody()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java index d453dfe4..2a345b6f 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java @@ -15,10 +15,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.springframework.core.SpringVersion; import javax.ws.rs.core.HttpHeaders; import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; import java.util.Objects; import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_HEADER_NAME; @@ -27,11 +31,19 @@ import static org.junit.Assume.assumeFalse; +@RunWith(Parameterized.class) public class SpringBootAppTest { - private LambdaHandler handler = new LambdaHandler(); + private LambdaHandler handler; private MockLambdaContext context = new MockLambdaContext(); private ObjectMapper mapper = new ObjectMapper(); + private String type; + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + } + @BeforeClass public static void before() { // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer @@ -40,9 +52,14 @@ public static void before() { assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); } + public SpringBootAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + @Test public void testMethod_springSecurity_doesNotThrowException() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test", "GET"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); @@ -51,7 +68,7 @@ public void testMethod_springSecurity_doesNotThrowException() { @Test public void testMethod_testRequestFromString_doesNotThrowNpe() throws IOException { - AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString("{\n" + + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder().fromJsonString("{\n" + " \"resource\": \"/missing-params\",\n" + " \"path\": \"/missing-params\",\n" + " \"httpMethod\": \"GET\",\n" + @@ -81,25 +98,25 @@ public void testMethod_testRequestFromString_doesNotThrowNpe() throws IOExceptio " },\n" + " \"body\": \"{ \\\"Key1\\\": \\\"Value1\\\", \\\"Key2\\\": \\\"Value2\\\", \\\"Key3\\\": \\\"Vaue3\\\" }\",\n" + " \"isBase64Encoded\": \"false\"\n" + - "}").build(); + "}"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); // Spring identifies the missing header assertEquals(400, resp.getStatusCode()); - req.setMultiValueHeaders(new Headers()); - req.getMultiValueHeaders().add(CUSTOM_HEADER_NAME, "val"); + req.multiValueHeaders(new Headers()); + req.header(CUSTOM_HEADER_NAME, "val"); resp = handler.handleRequest(req, context); assertEquals(400, resp.getStatusCode()); - req.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); - req.getMultiValueQueryStringParameters().add(CUSTOM_QS_NAME, "val"); + req.multiValueQueryString(new MultiValuedTreeMap<>()); + req.queryString(CUSTOM_QS_NAME, "val"); resp = handler.handleRequest(req, context); assertEquals(200, resp.getStatusCode()); } @Test public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/test2", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test2", "GET"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); assertEquals(404, resp.getStatusCode()); @@ -108,7 +125,7 @@ public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { @Test public void requestUri_dotInPathParam_expectRoutingToMethod() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/test/testdomain.com", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/testdomain.com", "GET"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); @@ -118,8 +135,8 @@ public void requestUri_dotInPathParam_expectRoutingToMethod() { @Test public void queryString_commaSeparatedList_expectUnmarshalAsList() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/test/query-string", "GET") - .queryString("list", "v1,v2,v3").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/query-string", "GET") + .queryString("list", "v1,v2,v3"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); @@ -128,8 +145,8 @@ public void queryString_commaSeparatedList_expectUnmarshalAsList() { @Test public void queryString_multipleParamsWithSameName_expectUnmarshalAsList() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/test/query-string", "GET") - .queryString("list", "v1").queryString("list", "v2").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/query-string", "GET") + .queryString("list", "v1").queryString("list", "v2"); AwsProxyResponse resp = handler.handleRequest(req, context); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); @@ -138,11 +155,10 @@ public void queryString_multipleParamsWithSameName_expectUnmarshalAsList() { @Test public void staticContent_getHtmlFile_returnsHtmlContent() { - LambdaContainerHandler.getContainerConfig().addValidFilePath("/Users/bulianis/workspace/aws-serverless-java-container/aws-serverless-java-container-spring"); - AwsProxyRequest request = new AwsProxyRequestBuilder("/static.html", "GET") + LambdaContainerHandler.getContainerConfig().addValidFilePath(System.getProperty("user.dir")); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/static.html", "GET") .header(HttpHeaders.ACCEPT, "text/html") - .header(HttpHeaders.CONTENT_TYPE, "text/plain") - .build(); + .header(HttpHeaders.CONTENT_TYPE, "text/plain"); AwsProxyResponse output = handler.handleRequest(request, context); assertEquals(200, output.getStatusCode()); assertTrue(output.getBody().contains("

Static

")); @@ -151,8 +167,19 @@ public void staticContent_getHtmlFile_returnsHtmlContent() { @Test public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharset() { LambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); - AwsProxyRequest request = new AwsProxyRequestBuilder("/test/utf8", "GET") - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/test/utf8", "GET"); + AwsProxyResponse output = handler.handleRequest(request, context); + validateSingleValueModel(output, TestController.UTF8_TEST_STRING); + assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains(";")); + assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains("charset=UTF-8")); + } + + @Test + public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharsetNoDefault() { + + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/test/utf8", "GET") + .header("Content-Type", "application/json; charset=UTF-8"); AwsProxyResponse output = handler.handleRequest(request, context); validateSingleValueModel(output, TestController.UTF8_TEST_STRING); assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index c32935c7..a4d5f069 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -1,65 +1,18 @@ package com.amazonaws.serverless.proxy.spring.echoapp; -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringProxyHandlerBuilder; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.context.annotation.PropertySource; -import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.servlet.ServletException; - -import java.util.EnumSet; @Configuration @ComponentScan("com.amazonaws.serverless.proxy.spring.echoapp") @PropertySource("classpath:application.properties") public class EchoSpringAppConfig { - - @Autowired - private ConfigurableWebApplicationContext applicationContext; - - @Bean - public SpringLambdaContainerHandler springLambdaContainerHandler() throws ContainerInitializationException { - SpringLambdaContainerHandler handler = new SpringProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .springApplicationContext(applicationContext) - .buildAndInitialize(); - handler.onStartup(c -> { - FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); - // update the registration to map to a path - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*"); - // servlet name mappings are disabled and will throw an exception - - //handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); - try { - ((DispatcherServlet)((AwsServletRegistration)c.getServletRegistration("dispatcherServlet")).getServlet()).setThrowExceptionIfNoHandlerFound(true); - } catch (ServletException e) { - e.printStackTrace(); - } - }); - return handler; - } - @Bean public ObjectMapper objectMapper() { return new ObjectMapper(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java index 4ca9c4b2..aee0bd03 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java @@ -2,8 +2,10 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; import com.amazonaws.services.lambda.runtime.Context; @@ -11,24 +13,46 @@ public class LambdaHandler - implements RequestHandler + implements RequestHandler { SpringBootLambdaContainerHandler handler; - boolean isinitialized = false; + SpringBootLambdaContainerHandler httpApiHandler; + private String type; - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) + public LambdaHandler(String reqType) { + type = reqType; + switch (type) { + case "API_GW": + case "ALB": + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + break; + case "HTTP_API": + try { + httpApiHandler = SpringBootLambdaContainerHandler.getHttpApiV2ProxyHandler(TestApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { - if (!isinitialized) { - isinitialized = true; - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - return null; - } + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); } - AwsProxyResponse res = handler.proxy(awsProxyRequest, context); - return res; } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java index 64a399a2..157b6c43 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java @@ -20,9 +20,9 @@ public class SBLambdaHandler public SBLambdaHandler() throws ContainerInitializationException { long startTime = Instant.now().toEpochMilli(); - handler = new SpringBootProxyHandlerBuilder() + handler = new SpringBootProxyHandlerBuilder() .defaultProxy() - .asyncInit(startTime) + .asyncInit(Instant.now().toEpochMilli()) .springBootApplication(TestApplication.class) .buildAndInitialize(); constructorTime = Instant.now().toEpochMilli() - startTime; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java index b61a7191..935954d0 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springslowapp/LambdaHandler.java @@ -16,9 +16,9 @@ public class LambdaHandler implements RequestHandler() .defaultProxy() - .asyncInit(startTime) + .asyncInit() .configurationClasses(SlowAppConfig.class) .buildAndInitialize(); constructorTime = Instant.now().toEpochMilli() - startTime; diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 90c98f00..10d995fe 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -1,5 +1,6 @@ - + aws-serverless-java-container com.amazonaws.serverless @@ -15,10 +16,9 @@ 1.5-SNAPSHOT - 5.1.9.RELEASE - 5.1.6.RELEASE - 2.1.8.RELEASE - + 5.2.5.RELEASE + 2.2.6.RELEASE + 5.2.2.RELEASE 1.8 1.8 @@ -42,6 +42,16 @@ spring-boot ${springboot.version} true + + + org.springframework + spring-context + + + org.springframework + spring-core + + org.springframework.boot @@ -49,16 +59,105 @@ ${springboot.version} true + + org.springframework + spring-core + ${spring.version} + true + + + org.springframework + spring-context + ${spring.version} + true + + + org.springframework + spring-webmvc + ${spring.version} + true + + + org.springframework + spring-aop + + + org.springframework + spring-expression + + + + org.springframework.security spring-security-config ${springsecurity.version} + + + org.springframework + spring-context + + + org.springframework + spring-beans + + + org.springframework + spring-core + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + test org.springframework.security spring-security-web ${springsecurity.version} + + + org.springframework + spring-core + + + org.springframework + spring-web + + + org.springframework + spring-beans + + + org.springframework + spring-context + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + test + + + javax.validation + validation-api + 2.0.1.Final + test + + + org.hibernate + hibernate-validator + 6.1.2.Final test @@ -67,6 +166,13 @@ 17.0.0 compile + + + javax.activation + activation + 1.1.1 + test + @@ -101,16 +207,18 @@ true - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - ${jacoco.minCoverage} - - - + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 5b56e58b..0eaf58f9 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -14,20 +14,30 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.StandardEnvironment; +import org.springframework.web.context.ConfigurableWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.Servlet; +import javax.servlet.ServletRegistration; +import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; /** @@ -40,10 +50,14 @@ * @param The incoming event type * @param The expected return type */ -public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { + private static final String DISPATCHER_SERVLET_REGISTRATION_NAME = "dispatcherServlet"; + private final Class springBootInitializer; private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); private String[] springProfiles = null; + private WebApplicationType springWebApplicationType; + private ConfigurableApplicationContext applicationContext; private static SpringBootLambdaContainerHandler instance; @@ -71,7 +85,7 @@ public static SpringBootLambdaContainerHandler getInstance() { */ public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() + return new SpringBootProxyHandlerBuilder() .defaultProxy() .initializationWrapper(new InitializationWrapper()) .springBootApplication(springBootInitializer) @@ -79,6 +93,23 @@ public static SpringBootLambdaContainerHandler getHttpApiV2ProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + return new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); + } + /** * Creates a new container handler with the given reader and writer objects * @@ -90,19 +121,22 @@ public static SpringBootLambdaContainerHandler requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler, Class springBootInitializer, - InitializationWrapper init) { + InitializationWrapper init, + WebApplicationType applicationType) { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); Timer.start("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); initialized = false; this.springBootInitializer = springBootInitializer; + springWebApplicationType = applicationType; setInitializationWrapper(init); SpringBootLambdaContainerHandler.setInstance(this); @@ -123,12 +157,12 @@ public void activateSpringProfiles(String... profiles) { } @Override - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @Override - protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { // this method of the AwsLambdaServletContainerHandler sets the servlet context Timer.start("SPRINGBOOT2_HANDLE_REQUEST"); @@ -139,7 +173,10 @@ protected void handleRequest(AwsProxyHttpServletRequest containerRequest, AwsHtt // process filters & invoke servlet Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - containerRequest.setResponse(containerResponse); + if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { + ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); + ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); + } doFilter(containerRequest, containerResponse, reqServlet); Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } @@ -150,27 +187,37 @@ public void initialize() throws ContainerInitializationException { Timer.start("SPRINGBOOT2_COLD_START"); - SpringApplication app = new SpringApplication(getEmbeddedContainerClasses()); - if (springProfiles != null && springProfiles.length > 0) { - ConfigurableEnvironment springEnv = new StandardEnvironment(); - springEnv.setActiveProfiles(springProfiles); - app.setEnvironment(springEnv); + SpringApplicationBuilder builder = new SpringApplicationBuilder(getEmbeddedContainerClasses()) + .web(springWebApplicationType); // .REACTIVE, .SERVLET + if (springProfiles != null) { + builder.profiles(springProfiles); } - - app.run(); - + applicationContext = builder.run(); + if (springWebApplicationType == WebApplicationType.SERVLET) { + ((AnnotationConfigServletWebServerApplicationContext)applicationContext).setServletContext(getServletContext()); + AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); + if (reg != null) { + reg.setLoadOnStartup(1); + } + } + super.initialize(); initialized = true; Timer.stop("SPRINGBOOT2_COLD_START"); } private Class[] getEmbeddedContainerClasses() { Class[] classes = new Class[2]; - try { - // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. - this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); - log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); - classes[0] = ServerlessReactiveServletEmbeddedServerFactory.class; - } catch (ClassNotFoundException e) { + if (springWebApplicationType == WebApplicationType.REACTIVE) { + try { + // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. + this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); + log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); + classes[0] = ServerlessReactiveServletEmbeddedServerFactory.class; + } catch (ClassNotFoundException e) { + springWebApplicationType = WebApplicationType.SERVLET; + classes[0] = ServerlessServletEmbeddedServerFactory.class; + } + } else { classes[0] = ServerlessServletEmbeddedServerFactory.class; } diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java index 943cc69f..b9894834 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -5,39 +17,48 @@ import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.boot.WebApplicationType; -public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< - AwsProxyRequest, +import javax.servlet.http.HttpServletRequest; + +public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + RequestType, AwsProxyResponse, - AwsProxyHttpServletRequest, - SpringBootLambdaContainerHandler, - SpringBootProxyHandlerBuilder> { + HttpServletRequest, + SpringBootLambdaContainerHandler, + SpringBootProxyHandlerBuilder> { private Class springBootInitializer; private String[] profiles; + private WebApplicationType applicationType = WebApplicationType.REACTIVE; @Override - protected SpringBootProxyHandlerBuilder self() { + protected SpringBootProxyHandlerBuilder self() { return this; } - public SpringBootProxyHandlerBuilder springBootApplication(Class app) { + public SpringBootProxyHandlerBuilder springBootApplication(Class app) { springBootInitializer = app; return self(); } - public SpringBootProxyHandlerBuilder profiles(String... profiles) { + public SpringBootProxyHandlerBuilder profiles(String... profiles) { this.profiles = profiles; return self(); } + public SpringBootProxyHandlerBuilder servletApplication() { + this.applicationType = WebApplicationType.SERVLET; + return self(); + } + @Override - public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { + public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { validate(); if (springBootInitializer == null) { throw new ContainerInitializationException("Missing spring boot application class in builder", null); } - SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( + SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( requestTypeClass, responseTypeClass, requestReader, @@ -45,7 +66,8 @@ public SpringBootLambdaContainerHandler build securityContextWriter, exceptionHandler, springBootInitializer, - initializationWrapper + initializationWrapper, + applicationType ); if (profiles != null) { handler.activateSpringProfiles(profiles); @@ -54,8 +76,8 @@ public SpringBootLambdaContainerHandler build } @Override - public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { - SpringBootLambdaContainerHandler handler = build(); + public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringBootLambdaContainerHandler handler = build(); initializationWrapper.start(handler); return handler; } diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java index 7fa366dd..9b2c0494 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring.embedded; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java index b47b081c..ad228f7d 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -1,6 +1,17 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.spring.embedded; -import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import org.springframework.boot.autoconfigure.AutoConfigureOrder; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java index 34a593fd..e9682d4c 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java @@ -1,14 +1,11 @@ package com.amazonaws.serverless.proxy.spring; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.securityapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.securityapp.MessageController; import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; -import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Test; import javax.ws.rs.core.HttpHeaders; @@ -39,8 +36,4 @@ public void helloRequest_withAuth_respondsWithSingleMessage() { resp = handler.handleRequest(req, lambdaContext); assertEquals(200, resp.getStatusCode()); } - - public void helloRequest_withoutAuith_respondsWithError() { - - } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index 4d5797e5..88cf735d 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -1,25 +1,111 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.servletapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.servletapp.MessageController; +import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; +import com.amazonaws.serverless.proxy.spring.servletapp.UserData; +import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; + +import java.util.Arrays; +import java.util.Collection; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +@RunWith(Parameterized.class) public class ServletAppTest { - LambdaHandler handler = new LambdaHandler(); + LambdaHandler handler; MockLambdaContext lambdaContext = new MockLambdaContext(); + private String type; + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + } + + public ServletAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + @Test public void helloRequest_respondsWithSingleMessage() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } + + @Test + public void validateRequest_invalidData_respondsWith400() { + UserData ud = new UserData(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/validate", "POST") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .body(ud); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + try { + System.out.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(resp)); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + assertEquals("3", resp.getBody()); + assertEquals(400, resp.getStatusCode()); + + UserData ud2 = new UserData(); + ud2.setFirstName("Test"); + ud2.setLastName("Test"); + ud2.setEmail("Test"); + req = new AwsProxyRequestBuilder("/validate", "POST") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .body(ud2); + resp = handler.handleRequest(req, lambdaContext); + assertEquals("1", resp.getBody()); + assertEquals(400, resp.getStatusCode()); + } + + @Test + public void messageObject_parsesObject_returnsCorrectMessage() { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .json() + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } + + @Test + public void messageObject_propertiesInContentType_returnsCorrectMessage() { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") + .header(HttpHeaders.ACCEPT, "application/json;v=1") + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } + + @Test + public void echoMessage_fileNameLikeParameter_returnsMessage() { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/echo/test.test.test", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test.test.test", resp.getBody()); + } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java index 7148e3b6..811a1ab5 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java @@ -1,33 +1,67 @@ package com.amazonaws.serverless.proxy.spring; +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.webfluxapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageController; +import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageData; +import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +@RunWith(Parameterized.class) public class WebFluxAppTest { - LambdaHandler handler = new LambdaHandler(); + LambdaHandler handler; MockLambdaContext lambdaContext = new MockLambdaContext(); + private String type; + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + } + + public WebFluxAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + @Test public void helloRequest_respondsWithSingleMessage() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/single", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/single", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + System.out.println(resp.getBody()); Assert.assertEquals(MessageController.MESSAGE, resp.getBody()); } @Test public void helloDoubleRequest_respondsWithDoubleMessage() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/double", "GET").build(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/double", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertEquals(MessageController.MESSAGE + MessageController.MESSAGE, resp.getBody()); } + + @Test + public void messageObject_parsesObject_returnsCorrectMessage() throws JsonProcessingException { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .json() + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index 010bcbdc..11779420 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -10,6 +10,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; import org.junit.Test; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.web.servlet.ServletContextInitializer; import javax.servlet.ServletContext; @@ -26,7 +27,8 @@ public class ServerlessServletEmbeddedServerFactoryTest { new AwsProxySecurityContextWriter(), new AwsProxyExceptionHandler(), null, - new InitializationWrapper() + new InitializationWrapper(), + WebApplicationType.REACTIVE ); public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java index 75dc158a..ae8ba21a 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java @@ -1,7 +1,6 @@ package com.amazonaws.serverless.proxy.spring.securityapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; @@ -13,7 +12,7 @@ public class LambdaHandler implements RequestHandler hello() { + return Mono.just(HELLO_MESSAGE); } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java new file mode 100644 index 00000000..cafcd400 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java @@ -0,0 +1,14 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.web.reactive.config.EnableWebFlux; + +@SpringBootApplication +@EnableWebFluxSecurity +@EnableWebFlux +@Import(SecurityConfig.class) +public class SecurityApplication { +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java index 128ae3dd..d83b81db 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java @@ -1,7 +1,5 @@ package com.amazonaws.serverless.proxy.spring.securityapp; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.security.SecurityProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; @@ -10,52 +8,37 @@ import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.server.SecurityWebFilterChain; @Configuration @EnableWebFluxSecurity -public class SecurityConfig { - public static final String USERNAME = "user"; - public static String PASSWORD = "testPassword"; - public static BCryptPasswordEncoder pEncoder = new BCryptPasswordEncoder(); +public class SecurityConfig +{ + public static final String USERNAME = "admin"; + public static final String PASSWORD = "{noop}password"; + private static BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); @Bean public SecurityWebFilterChain securitygWebFilterChain( ServerHttpSecurity http) { return http.authorizeExchange() - .anyExchange().authenticated() - .and().httpBasic() + .anyExchange().authenticated().and().csrf().disable() + .httpBasic() .and().build(); } @Bean - public MapReactiveUserDetailsService reactiveUserDetailsService(SecurityProperties properties, ObjectProvider passwordEncoder) { - return new MapReactiveUserDetailsService(getUser()); - } - - private UserDetails getUser() { - return User.builder().username(USERNAME).password(passwordEncoder().encode(PASSWORD)).authorities("USER").build(); + public static BCryptPasswordEncoder passwordEncoder() { + return passwordEncoder; } @Bean - public PasswordEncoder passwordEncoder() { - return pEncoder; + public MapReactiveUserDetailsService userDetailsService() { + UserDetails user = User + .withUsername(USERNAME) + .password(passwordEncoder.encode(PASSWORD)) + .roles("USER") + .build(); + return new MapReactiveUserDetailsService(user); } - - /*@Autowired - public void configureGlobal(AuthenticationManagerBuilder authentication) - throws Exception - { - authentication.inMemoryAuthentication() - .withUser(USERNAME) - .password(passwordEncoder().encode(PASSWORD)) - .authorities("ROLE_USER"); - if (userService != null) { - if (userService.loadUserByUsername("user") != null) { - System.out.println("Setting password in configureGlobal"); - PASSWORD = userService.loadUserByUsername("user").getPassword().replace("{noop}", ""); - } - } - }*/ -} +} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java deleted file mode 100644 index 2f1def12..00000000 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/ServletApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.securityapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration; -import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; - -@SpringBootApplication() -public class ServletApplication { -} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java index 7faf9b1b..88441988 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java @@ -1,26 +1,60 @@ package com.amazonaws.serverless.proxy.spring.servletapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -public class LambdaHandler implements RequestHandler { +public class LambdaHandler implements RequestHandler { private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; - static { + public LambdaHandler(String reqType) { + type = reqType; try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(ServletApplication.class); + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + } } catch (ContainerInitializationException e) { e.printStackTrace(); } } @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - return handler.proxy(awsProxyRequest, context); + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index 937b2432..d46806b6 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -1,15 +1,39 @@ package com.amazonaws.serverless.proxy.spring.servletapp; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.Errors; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; @RestController public class MessageController { public static final String HELLO_MESSAGE = "Hello"; + public static final String VALID_MESSAGE = "VALID"; - @RequestMapping(path="/hello", method= RequestMethod.GET) + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) public String hello() { return HELLO_MESSAGE; } + + @RequestMapping(path="/validate", method=RequestMethod.POST, produces = {"text/plain"}) + public ResponseEntity validateBody(@RequestBody @Valid UserData userData, Errors errors) { + if (errors != null && errors.hasErrors()) { + return ResponseEntity.badRequest().body(errors.getErrorCount() + ""); + } + return ResponseEntity.ok(VALID_MESSAGE); + } + + @RequestMapping(path="/message", method = RequestMethod.POST) + public String returnMessage(@RequestBody MessageData data) { + if (data == null) { + throw new RuntimeException("No message data"); + } + return data.getMessage(); + } + + @RequestMapping(path="/echo/{message}", method=RequestMethod.GET) + public String returnPathMessage(@PathVariable(value="message") String message) { + return message; + } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java new file mode 100644 index 00000000..129101cb --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +public class MessageData { + private String message; + + public MessageData() { + } + + public MessageData(String m) { + setMessage(m); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java index 927dd6ce..07ddbab4 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -2,6 +2,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; @SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, @@ -9,5 +11,6 @@ org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) -public class ServletApplication extends SpringBootServletInitializer { +@Import(MessageController.class) +public class ServletApplication { } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java new file mode 100644 index 00000000..e180c173 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +public class UserData { + @NotBlank + private String firstName; + @NotBlank + private String lastName; + @NotNull @Email + private String email; + private String error; + + public UserData() { + + } + + public UserData(String err) { + error = err; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getError() { return error; } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java index bd696a99..ec6993a7 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java @@ -19,9 +19,9 @@ public LambdaHandler() { try { long startTime = Instant.now().toEpochMilli(); System.out.println("startCall: " + startTime); - handler = new SpringBootProxyHandlerBuilder() + handler = new SpringBootProxyHandlerBuilder() .defaultProxy() - .asyncInit(startTime) + .asyncInit() .springBootApplication(SlowTestApplication.class) .buildAndInitialize(); constructorTime = Instant.now().toEpochMilli() - startTime; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java index 913da5bb..0eb52a7b 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java @@ -1,26 +1,58 @@ package com.amazonaws.serverless.proxy.spring.webfluxapp; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; -public class LambdaHandler implements RequestHandler { +public class LambdaHandler implements RequestHandler { private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; - static { + private String type; + + public LambdaHandler(String reqType) { + type = reqType; try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(WebFluxTestApplication.class); + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(WebFluxTestApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(WebFluxTestApplication.class) + .buildAndInitialize(); + break; + } } catch (ContainerInitializationException e) { e.printStackTrace(); } } @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - return handler.proxy(awsProxyRequest, context); + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java index 65ce0786..a0460461 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java @@ -1,26 +1,36 @@ package com.amazonaws.serverless.proxy.spring.webfluxapp; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import reactor.core.publisher.Flux; @RestController public class MessageController { public static final String MESSAGE = "Hello"; - @RequestMapping(path="/single", method= RequestMethod.GET) + @RequestMapping(path="/single", method= RequestMethod.GET, produces = {"text/plain"}) Flux singleMessage(){ return Flux.just( MESSAGE ); } - @RequestMapping(path="/double", method= RequestMethod.GET) + @RequestMapping(path="/double", method= RequestMethod.GET, produces={"text/plain"}) Flux doubleMessage(){ return Flux.just( MESSAGE, MESSAGE ); } + + @RequestMapping(path="/message", method = RequestMethod.POST, produces={"text/plain"}, consumes = {"application/json"}) + public Flux returnMessage(@RequestBody MessageData data) { + if (data == null) { + throw new RuntimeException("No message data"); + } + return Flux.just(data.getMessage()); + } } \ No newline at end of file diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java new file mode 100644 index 00000000..2be6b4f2 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.proxy.spring.webfluxapp; + +public class MessageData { + private String message; + + public MessageData() { + } + + public MessageData(String m) { + setMessage(m); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java index 04d48ff3..70e0c993 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -1,12 +1,20 @@ package com.amazonaws.serverless.proxy.spring.webfluxapp; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; @SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) public class WebFluxTestApplication { + } diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java index 25a2f7f9..3a536c9b 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java @@ -1,20 +1,24 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.struts2; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter; import org.slf4j.Logger; @@ -23,6 +27,7 @@ import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.Servlet; +import javax.servlet.http.HttpServletRequest; import java.util.EnumSet; import java.util.concurrent.CountDownLatch; @@ -32,7 +37,7 @@ * @param request type * @param response type */ -public class Struts2LambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class Struts2LambdaContainerHandler extends AwsLambdaServletContainerHandler { private static final Logger log = LoggerFactory.getLogger(Struts2LambdaContainerHandler.class); @@ -55,9 +60,19 @@ public static Struts2LambdaContainerHandler g new AwsProxyExceptionHandler()); } + public static Struts2LambdaContainerHandler getHttpApiV2ProxyHandler() { + return new Struts2LambdaContainerHandler( + HttpApiV2ProxyRequest.class, + AwsProxyResponse.class, + new AwsHttpApiV2HttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsHttpApiV2SecurityContextWriter(), + new AwsProxyExceptionHandler()); + } + public Struts2LambdaContainerHandler(Class requestTypeClass, Class responseTypeClass, - RequestReader requestReader, + RequestReader requestReader, ResponseWriter responseWriter, SecurityContextWriter securityContextWriter, ExceptionHandler exceptionHandler) { @@ -68,12 +83,13 @@ public Struts2LambdaContainerHandler(Class requestTypeClass, Timer.stop(TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR); } - protected AwsHttpServletResponse getContainerResponse(AwsProxyHttpServletRequest request, CountDownLatch latch) { + @Override + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { return new AwsHttpServletResponse(request, latch); } @Override - protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, + protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { Timer.start(TIMER_STRUTS_2_HANDLE_REQUEST); @@ -81,7 +97,9 @@ protected void handleRequest(AwsProxyHttpServletRequest httpServletRequest, initialize(); } - httpServletRequest.setServletContext(this.getServletContext()); + if (AwsHttpServletRequest.class.isAssignableFrom(httpServletRequest.getClass())) { + ((AwsHttpServletRequest)httpServletRequest).setServletContext(this.getServletContext()); + } this.doFilter(httpServletRequest, httpServletResponse, null); String responseStatusCode = httpServletResponse.getHeader(HEADER_STRUTS_STATUS_CODE); if (responseStatusCode != null) { diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java index 1e63daf9..26a01bd9 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java @@ -1,3 +1,15 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ package com.amazonaws.serverless.proxy.struts2; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java index 45e14ccd..447b907b 100644 --- a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -17,6 +17,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.struts2.echoapp.EchoAction; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonProcessingException; @@ -25,23 +26,25 @@ import org.apache.commons.codec.binary.Base64; import org.apache.struts2.StrutsJUnit4TestCase; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import javax.ws.rs.core.Response; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.junit.Assume.assumeTrue; /** * Unit test class for the Struts2 AWS_PROXY default implementation */ +@RunWith(Parameterized.class) public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; @@ -55,17 +58,42 @@ public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { private static ObjectMapper objectMapper = new ObjectMapper(); private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler .getAwsProxyHandler(); + private final Struts2LambdaContainerHandler httpApiHandler = Struts2LambdaContainerHandler + .getHttpApiV2ProxyHandler(); private static Context lambdaContext = new MockLambdaContext(); + private String type; + + public Struts2AwsProxyTest(String reqType) { + type = reqType; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + } + + private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { + switch (type) { + case "API_GW": + return handler.proxy(requestBuilder.build(), lambdaContext); + case "ALB": + return handler.proxy(requestBuilder.alb().build(), lambdaContext); + case "HTTP_API": + return httpApiHandler.proxy(requestBuilder.toHttpApiV2Request(), lambdaContext); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } + @Test public void headers_getHeaders_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "headers") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); @@ -74,24 +102,23 @@ public void headers_getHeaders_echo() { @Test public void context_servletResponse_setCustomHeader() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET") .queryString("customHeader", "true") - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertTrue(output.getMultiValueHeaders().containsKey("XX")); } @Test public void context_serverInfo_correctContext() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET") + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET") .queryString(QUERY_STRING_KEY, "Hello Struts2") .header("Content-Type", "application/json") - .queryString("contentType", "true") - .build(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + .queryString("contentType", "true"); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); @@ -100,14 +127,13 @@ public void context_serverInfo_correctContext() { @Test public void queryString_uriInfo_echo() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "query-string") .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); @@ -116,13 +142,12 @@ public void queryString_uriInfo_echo() { @Test public void requestScheme_valid_expectHttps() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "scheme") .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); @@ -131,13 +156,13 @@ public void requestScheme_valid_expectHttps() { @Test public void authorizer_securityContext_customPrincipalSuccess() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "principal") .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) - .build(); + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); @@ -146,32 +171,30 @@ public void authorizer_securityContext_customPrincipalSuccess() { @Test public void errors_unknownRoute_expect404() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/unknown", "GET").build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", "GET"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } @Test public void error_contentType_invalidContentType() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") .queryString("mode", "content-type") .header("Content-Type", "application/octet-stream") - .body("asdasdasd") - .build(); + .body("asdasdasd"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(415, output.getStatusCode()); } @Test public void error_statusCode_methodNotAllowed() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") .queryString("mode", "not-allowed") - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(405, output.getStatusCode()); } @@ -180,12 +203,11 @@ public void error_statusCode_methodNotAllowed() { public void responseBody_responseWriter_validBody() throws JsonProcessingException { Map value = new HashMap<>(); value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE); - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "POST") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "POST") .json() - .body(objectMapper.writeValueAsString(value)) - .build(); + .body(objectMapper.writeValueAsString(value)); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertNotNull(output.getBody()); @@ -194,32 +216,30 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti @Test public void statusCode_responseStatusCode_customStatusCode() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "custom-status-code") .queryString("status", "201") - .json() - .build(); + .json(); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); } @Test public void base64_binaryResponse_base64Encoding() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertTrue(Base64.isBase64(response.getBody())); } @Test public void exception_mapException_mapToNotImplemented() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString("mode", "not-implemented") - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") + .queryString("mode", "not-implemented"); - AwsProxyResponse response = handler.proxy(request, lambdaContext); + AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); assertEquals("null", response.getBody()); assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); @@ -227,12 +247,11 @@ public void exception_mapException_mapToNotImplemented() { @Test public void stripBasePath_route_shouldRouteCorrectly() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", "GET") .json() - .queryString(QUERY_STRING_KEY, "stripped") - .build(); + .queryString(QUERY_STRING_KEY, "stripped"); handler.stripBasePath("/custompath"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); validateSingleValueModel(output, "stripped"); handler.stripBasePath(""); @@ -240,29 +259,30 @@ public void stripBasePath_route_shouldRouteCorrectly() { @Test public void stripBasePath_route_shouldReturn404() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") .json() - .queryString("status", "201") - .build(); + .queryString("status", "201"); handler.stripBasePath("/custom"); - AwsProxyResponse output = handler.proxy(request, lambdaContext); + AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); handler.stripBasePath(""); } @Test public void securityContext_injectPrincipal_expectPrincipalName() { - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo-request-info", "GET") + assumeTrue("API_GW".equals(type)); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") .queryString("mode", "principal") - .authorizerPrincipal(USER_PRINCIPAL).build(); + .authorizerPrincipal(USER_PRINCIPAL); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, USER_PRINCIPAL); } @Test public void queryParam_encoding_expectUnencodedParam() { + assumeTrue("API_GW".equals(type)); String paramValue = "p%2Fz%2B3"; String decodedParam = ""; try { @@ -271,21 +291,20 @@ public void queryParam_encoding_expectUnencodedParam() { e.printStackTrace(); fail("Could not decode parameter"); } - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, decodedParam) - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, decodedParam); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, decodedParam); } @Test public void queryParam_encoding_expectEncodedParam() { + assumeTrue("API_GW".equals(type)); String paramValue = "p%2Fz%2B3"; - AwsProxyRequest request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, paramValue) - .build(); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, paramValue); - AwsProxyResponse resp = handler.proxy(request, lambdaContext); + AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, paramValue); } diff --git a/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index b934c4a4..dc8cb620 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -24,7 +24,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md index de5f4671..1dc39a0a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash $ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessJerseyApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessJerseyApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessJerseyApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessJerseyApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Jersey API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessJerseyApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 3282eb25..9fe13543 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,8 +14,8 @@ 1.8 1.8 - 2.29.1 - 2.9.10 + 2.30.1 + 2.10.3 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml similarity index 94% rename from aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml index 9df80ae8..db6ecbaf 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 45dc2c1a..2ea9dca1 100644 --- a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -24,7 +24,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md index 82a59465..1dc39a0a 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spark-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSparkApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSparkApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessSparkApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSparkApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Spark API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessSparkApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index f4e280ce..e915d451 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.sparkjava:spark-core:2.9.1', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 055fc432..579d1060 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.9.10 + 2.10.3 2.9.1 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml similarity index 94% rename from aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml index 674c769a..d9e83ceb 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 9295c645..e279efa5 100644 --- a/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-spring-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -30,7 +30,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md index 1bb92991..1dc39a0a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-spring-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessSpringApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index e67eb52e..e7318593 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,13 +7,13 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.1.9.RELEASE', - 'org.springframework:spring-context:5.1.9.RELEASE', + 'org.springframework:spring-webmvc:5.2.5.RELEASE', + 'org.springframework:spring-context:5.2.5.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index a6a574c8..a41ddd6e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.1.9.RELEASE + 5.2.5.RELEASE 4.12 2.8.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml similarity index 94% rename from aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml index 374dfe59..292d87a9 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 15 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index ec02bb6a..5379692b 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -30,7 +30,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md index 43a3683f..1dc39a0a 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessSpringApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle index 53c675de..2a95fdaf 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle @@ -1,6 +1,3 @@ -plugins { - id 'org.springframework.boot' version '1.5.22.RELEASE' -} apply plugin: 'java' repositories { @@ -11,7 +8,7 @@ repositories { dependencies { compile ( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-web:1.5.22.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml similarity index 94% rename from aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml index 3fbd348b..832028a2 100644 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index ec02bb6a..5379692b 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -30,7 +30,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md index 3f99b344..1dc39a0a 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-springboot2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessSpringApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index e85ac40d..66ba6d9a 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -1,6 +1,3 @@ -plugins { - id 'org.springframework.boot' version '2.1.1.RELEASE' -} apply plugin: 'java' repositories { @@ -11,7 +8,7 @@ repositories { dependencies { compile ( - 'org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE', + 'org.springframework.boot:spring-boot-starter-web:2.2.6.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 3dfaa123..e2591648 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.8.RELEASE + 2.2.6.RELEASE diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml similarity index 94% rename from aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml index 970025c4..ae2adf28 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 91a53e56..ad8b8624 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -31,7 +31,7 @@ - sam.yaml + template.yml README.md build.gradle diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md index 7be30668..1dc39a0a 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md @@ -20,37 +20,40 @@ The \${artifactId} project, created with [`aws-serverless-java-container`](https The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. -The project folder also includes a `sam.yaml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with [SAM Local](https://github.com/awslabs/aws-sam-local). +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). -## Building the project -Using [Maven](https://maven.apache.org/), you can create an AWS Lambda-compatible zip file simply by running the maven package command from the project folder. +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project ```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-struts2-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false $ cd \${artifactId} -$ mvn clean package - -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 6.546 s -[INFO] Finished at: 2018-02-15T08:39:33-08:00 -[INFO] Final Memory: XXM/XXXM -[INFO] ------------------------------------------------------------------------ -``` +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts -## Testing locally with SAM local -You can use [AWS SAM Local](https://github.com/awslabs/aws-sam-local) to start your project. +Build Succeeded -First, install SAM local: +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml -```bash -$ npm install -g aws-sam-local +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided ``` -Next, from the project root folder - where the `sam.yaml` file is located - start the API with the SAM Local CLI. +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. ```bash -$ sam local start-api --template sam.yaml +$ sam local start-api ... Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] @@ -67,54 +70,22 @@ $ curl -s http://127.0.0.1:3000/ping | python -m json.tool } ``` -## Deploying to AWS -You can use the [AWS CLI](https://aws.amazon.com/cli/) to quickly deploy your application to AWS Lambda and Amazon API Gateway with your SAM template. - -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the project's root folder - where the `sam.yaml` file is located: - -``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name -``` +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - ``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringApi --capabilities CAPABILITY_IAM +$ sam deploy --guided ``` -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `ServerlessSpringApi` key of the `Outputs` property: +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringApi -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/ServerlessSpringApi/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "AWS Serverless Spring API - ${groupId}::${artifactId}", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "ExportName": "\${resourceName}Api", - "OutputKey": "\${resourceName}Api", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "ServerlessSpringApi", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} - +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- ``` Copy the `OutputValue` into a browser or use curl to test your first request: diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index ee08f5d4..9e4b4ab1 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,13 +8,13 @@ repositories { dependencies { compile ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.20', - 'org.apache.struts:struts2-rest-plugin:2.5.20', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.20', - 'org.apache.struts:struts2-junit-plugin:2.5.20', + 'org.apache.struts:struts2-convention-plugin:2.5.22', + 'org.apache.struts:struts2-rest-plugin:2.5.22', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.22', + 'org.apache.struts:struts2-junit-plugin:2.5.22', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 3e224f4a..935c0e9f 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,8 +15,8 @@ 1.8 1.8 - 2.5.20 - 2.9.9 + 2.5.22 + 2.10.3 4.12 2.11.1 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml similarity index 95% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml rename to aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml index 023266fc..11e06d07 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/sam.yaml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml @@ -33,12 +33,12 @@ Resources: Properties: Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest Runtime: java8 - CodeUri: target/${artifactId}-${version}-lambda.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: - GetResource: + ProxyResource: Type: Api Properties: Path: /{proxy+} diff --git a/gha_build.sh b/gha_build.sh index d4d2d723..9867bf50 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -80,18 +80,6 @@ function sample { if [[ "$?" -ne 0 ]]; then exit 1 fi - - SAM_FILE=${SAMPLE_FOLDER}/sam.yaml - if [[ -f "$SAM_FILE" ]]; then - TARGET_ZIP=$(cat ${SAM_FILE} | grep CodeUri | sed -e 's/^.*:\ //g') - if [[ ! -f "${SAMPLE_FOLDER}/${TARGET_ZIP}" ]]; then - echo "COULD NOT FIND TARGET ZIP FILE $TARGET_ZIP FOR $1 SAMPLE" - exit 1 - fi - else - echo "COULD NOT FIND SAM FILE: '${SAM_FILE}'" - exit 1 - fi } # set up the master pom otherwise we won't be able to find new dependencies diff --git a/owasp-suppression.xml b/owasp-suppression.xml index fe70f749..0997df5c 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -27,14 +27,4 @@ cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ - - - - - - cpe:/a:slf4j:slf4j:1.8.0 - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 298bdc8b..e61b9b73 100644 --- a/pom.xml +++ b/pom.xml @@ -45,8 +45,9 @@ 0.7 - 5.2.2 - 2.10.1 + 5.3.2 + 2.10.3 + 1.8.0-beta4 @@ -62,14 +63,14 @@ org.slf4j slf4j-api - 1.8.0-beta2 + ${slf4j.version} org.slf4j slf4j-simple - 1.8.0-beta2 + ${slf4j.version} test diff --git a/samples/jersey/pet-store/README.md b/samples/jersey/pet-store/README.md index bfb44164..d85d5628 100644 --- a/samples/jersey/pet-store/README.md +++ b/samples/jersey/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Jersey example -A basic pet store written with the [Jersey framework](https://jersey.java.net/). The `LambdaHandler` object is the main entry point for Lambda. +A basic pet store written with the [Jersey framework](https://jersey.java.net/). The `StreamLambdaHandler` object is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-jersey-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessJerseySample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `JerseyPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessJerseySample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written in jersey with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "JerseyPetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "JerseySample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. \ No newline at end of file +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 064fdf37..88e34767 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,17 +9,17 @@ dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'io.symphonia:lambda-logging:1.0.1' ) - compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.10.1") { + compile("org.glassfish.jersey.media:jersey-media-json-jackson:2.30.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - compile("org.glassfish.jersey.inject:jersey-hk2:2.29.1") { + compile("org.glassfish.jersey.inject:jersey-hk2:2.30.1") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 6761c621..bacdbe04 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,8 +26,8 @@ 1.8 1.8 - 2.29.1 - 2.10.1 + 2.30.1 + 2.10.3 diff --git a/samples/jersey/pet-store/sam.yaml b/samples/jersey/pet-store/template.yml similarity index 71% rename from samples/jersey/pet-store/sam.yaml rename to samples/jersey/pet-store/template.yml index 7ca060da..ababb78a 100644 --- a/samples/jersey/pet-store/sam.yaml +++ b/samples/jersey/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.jersey.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-jersey-example-1.0-SNAPSHOT-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 20 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: JerseyPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: JerseyPetStoreApi diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle index 94f3d1b5..8ed45b3d 100644 --- a/samples/micronaut/pet-store/build.gradle +++ b/samples/micronaut/pet-store/build.gradle @@ -3,7 +3,7 @@ plugins { id "com.github.johnrengelman.shadow" version "5.0.0" id "application" id "net.ltgt.apt-eclipse" version "0.21" - id "org.springframework.boot" version "2.1.8.RELEASE" + id "org.springframework.boot" version "2.1.12.RELEASE" id "io.spring.dependency-management" version "1.0.6.RELEASE" } diff --git a/samples/spark/pet-store/README.md b/samples/spark/pet-store/README.md index 5d3e34d5..2bfec99d 100644 --- a/samples/spark/pet-store/README.md +++ b/samples/spark/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Spark example -A basic pet store written with the [Spark framework](http://sparkjava.com/). The `LambdaHandler` object is the main entry point for Lambda. +A basic pet store written with the [Spark framework](http://sparkjava.com/). The `StreamLambdaHandler` object is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-spark-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSparkSample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SparkPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessSparkSample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/SparkSample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "PetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "SparkSample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 00ac4797..01605a97 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { compile ( 'com.sparkjava:spark-core:2.9.1', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.10.1', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'io.symphonia:lambda-logging:1.0.1' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 4bdd9095..26a2f256 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.10.1 + 2.10.3 2.9.1 diff --git a/samples/spark/pet-store/sam.yaml b/samples/spark/pet-store/template.yml similarity index 71% rename from samples/spark/pet-store/sam.yaml rename to samples/spark/pet-store/template.yml index b1608653..26e0a653 100644 --- a/samples/spark/pet-store/sam.yaml +++ b/samples/spark/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.spark.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spark-example-1.0-SNAPSHOT-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 20 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: SparkPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: SparkPetStoreApi diff --git a/samples/spring/pet-store/README.md b/samples/spring/pet-store/README.md index 17592941..5637b6b6 100644 --- a/samples/spring/pet-store/README.md +++ b/samples/spring/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Spring example -A basic pet store written with the [Spring framework](https://projects.spring.io/spring-framework/). The `LambdaHandler` object is the main entry point for Lambda. +A basic pet store written with the [Spring framework](https://projects.spring.io/spring-framework/). The `StreamLambdaHandler` object is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-spring-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringSample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SparkPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringSample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "PetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "JerseySample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 7d7a74c4..433f5741 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,13 +7,13 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.1.9.RELEASE', - 'org.springframework:spring-context:5.1.9.RELEASE', + 'org.springframework:spring-webmvc:5.2.5.RELEASE', + 'org.springframework:spring-context:5.2.5.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 86d26471..2798eafa 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.2.3.RELEASE + 5.2.5.RELEASE 4.12 2.8.2 diff --git a/samples/spring/pet-store/sam.yaml b/samples/spring/pet-store/template.yml similarity index 71% rename from samples/spring/pet-store/sam.yaml rename to samples/spring/pet-store/template.yml index 6a6f07e4..8c3dec02 100644 --- a/samples/spring/pet-store/sam.yaml +++ b/samples/spring/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.spring.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spring-example-1.0-SNAPSHOT-lambda-package.zip + CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: SpringPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: SpringPetStoreApi diff --git a/samples/springboot/pet-store/README.md b/samples/springboot/pet-store/README.md index ae9100cb..4462f159 100644 --- a/samples/springboot/pet-store/README.md +++ b/samples/springboot/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Spring Boot example -A basic pet store written with the [Spring Boot framework](https://projects.spring.io/spring-boot/). The `LambdaHandler` object is the main entry point for Lambda. +A basic pet store written with the [Spring Boot framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-spring-boot-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringBootSample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SpringBootPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringBootSample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "SpringBootPetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "JerseySample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/springboot/pet-store/build.gradle b/samples/springboot/pet-store/build.gradle index 53295266..caaeea89 100644 --- a/samples/springboot/pet-store/build.gradle +++ b/samples/springboot/pet-store/build.gradle @@ -1,6 +1,3 @@ -plugins { - id 'org.springframework.boot' version '1.5.22.RELEASE' -} apply plugin: 'java' repositories { @@ -11,7 +8,7 @@ repositories { dependencies { compile ( - 'org.springframework.boot:spring-boot-starter-web', + 'org.springframework.boot:spring-boot-starter-web:1.5.22.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/samples/springboot/pet-store/sam.yaml b/samples/springboot/pet-store/template.yml similarity index 72% rename from samples/springboot/pet-store/sam.yaml rename to samples/springboot/pet-store/template.yml index 23e143a9..de08aa74 100644 --- a/samples/springboot/pet-store/sam.yaml +++ b/samples/springboot/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-spring-boot-example-1.0-SNAPSHOT-lambda-package.zip + CodeUri: . MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: SpringBootPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: SpringBootPetStoreApi diff --git a/samples/springboot2/pet-store/README.md b/samples/springboot2/pet-store/README.md index 5f8edb68..8e15b377 100644 --- a/samples/springboot2/pet-store/README.md +++ b/samples/springboot2/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Spring Boot 2 example -A basic pet store written with the [Spring Boot 2 framework](https://projects.spring.io/spring-boot/). The `LambdaHandler` object is the main entry point for Lambda. +A basic pet store written with the [Spring Boot 2 framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-spring-boot-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the jar file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringBootSample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SpringBootPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringBootSample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written with spark with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "SpringBootPetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "JerseySample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 65826e90..365f3ac2 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -1,6 +1,3 @@ -plugins { - id 'org.springframework.boot' version '2.1.8.RELEASE' -} apply plugin: 'java' repositories { @@ -11,10 +8,10 @@ repositories { dependencies { compile ( - implementation('org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE') { + implementation('org.springframework.boot:spring-boot-starter-web:2.2.6.RELEASE') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, - 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', 'io.symphonia:lambda-logging:1.0.1' ) testCompile("junit:junit") diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 547a7ead..f9444cbf 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.8.RELEASE + 2.2.6.RELEASE @@ -33,7 +33,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot2 - [0.1,) + [1.4,) diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java index 3097bb80..5c3482e4 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java @@ -41,6 +41,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo if (apiGwContext == null) { log.warn("API Gateway context is null"); filterChain.doFilter(servletRequest, servletResponse); + return; } if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { log.warn("API Gateway context object is not of valid type"); diff --git a/samples/springboot2/pet-store/sam.yaml b/samples/springboot2/pet-store/template.yml similarity index 72% rename from samples/springboot2/pet-store/sam.yaml rename to samples/springboot2/pet-store/template.yml index c00d45c3..a8297479 100644 --- a/samples/springboot2/pet-store/sam.yaml +++ b/samples/springboot2/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-springboot2-example-1.0-SNAPSHOT-lambda-package.zip + CodeUri: . MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: SpringBootPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: SpringBootPetStoreApi diff --git a/samples/struts2/pet-store/README.md b/samples/struts2/pet-store/README.md index 9203dd89..89cc1676 100644 --- a/samples/struts2/pet-store/README.md +++ b/samples/struts2/pet-store/README.md @@ -1,62 +1,36 @@ # Serverless Struts2 example A basic pet store written with the [Apache Struts framework](https://struts.apache.org). The `Struts2LambdaHandler` object provided by the `aws-serverless-java-container-struts2` is the main entry point for Lambda. -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `sam.yaml` file in the root folder contains the application definition +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition -## Installation -To build and install the sample application you will need [Maven](https://maven.apache.org/) and the [AWS CLI](https://aws.amazon.com/cli/) installed on your computer. +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) -In a shell, navigate to the sample's folder and use maven to build a deployable jar. +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ mvn package +$ sam build ``` -This command should generate a `serverless-struts-example-1.0-SNAPSHOT.jar` in the `target` folder. Now that we have generated the zip file, we can use the AWS CLI to package the template for deployment. +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. -You will need an S3 bucket to store the artifacts for deployment. Once you have created the S3 bucket, run the following command from the sample's folder: +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen ``` -$ aws cloudformation package --template-file sam.yaml --output-template-file output-sam.yaml --s3-bucket -Uploading to xxxxxxxxxxxxxxxxxxxxxxxxxx 6464692 / 6464692.0 (100.00%) -Successfully packaged artifacts and wrote output template to file output-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /your/path/output-sam.yaml --stack-name +$ sam deploy --guided ``` -As the command output suggests, you can now use the cli to deploy the application. Choose a stack name and run the `aws cloudformation deploy` command from the output of the package command. - -``` -$ aws cloudformation deploy --template-file output-sam.yaml --stack-name ServerlessSpringSample --capabilities CAPABILITY_IAM -``` - -Once the application is deployed, you can describe the stack to show the API endpoint that was created. The endpoint should be the `SparkPetStoreApi` key of the `Outputs` property: - -``` -$ aws cloudformation describe-stacks --stack-name ServerlessSpringSample -{ - "Stacks": [ - { - "StackId": "arn:aws:cloudformation:us-west-2:xxxxxxxx:stack/JerseySample/xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", - "Description": "Example Pet Store API written with Apache Struts with the aws-serverless-java-container library", - "Tags": [], - "Outputs": [ - { - "Description": "URL for application", - "OutputKey": "PetStoreApi", - "OutputValue": "https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets" - } - ], - "CreationTime": "2016-12-13T22:59:31.552Z", - "Capabilities": [ - "CAPABILITY_IAM" - ], - "StackName": "StrutsSample", - "NotificationARNs": [], - "StackStatus": "UPDATE_COMPLETE" - } - ] -} +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL ``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- -Copy the `OutputValue` into a browser to test a first request. +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 2d7e4250..24f01897 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -8,13 +8,13 @@ repositories { dependencies { compile ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.20', - 'org.apache.struts:struts2-rest-plugin:2.5.20', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.20', - 'org.apache.struts:struts2-junit-plugin:2.5.20', + 'org.apache.struts:struts2-convention-plugin:2.5.22', + 'org.apache.struts:struts2-rest-plugin:2.5.22', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.22', + 'org.apache.struts:struts2-junit-plugin:2.5.22', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.1.0', 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.10.1', + 'com.fasterxml.jackson.core:jackson-databind:2.10.3', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 9689fc6a..b761207d 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,8 +26,8 @@ 1.8 1.8 - 2.5.20 - 2.10.1 + 2.5.22 + 2.10.3 4.12 2.11.1 diff --git a/samples/struts2/pet-store/sam.yaml b/samples/struts2/pet-store/template.yml similarity index 72% rename from samples/struts2/pet-store/sam.yaml rename to samples/struts2/pet-store/template.yml index c44aa320..72128dd5 100644 --- a/samples/struts2/pet-store/sam.yaml +++ b/samples/struts2/pet-store/template.yml @@ -13,20 +13,20 @@ Resources: Properties: Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest Runtime: java8 - CodeUri: target/serverless-struts-example-1.0-SNAPSHOT-lambda.zip + CodeUri: . MemorySize: 256 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: - GetResource: - Type: Api + HttpApiEvent: + Type: HttpApi Properties: - Path: /{proxy+} - Method: any + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' Outputs: SpringPetStoreApi: Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: Name: Struts2PetStoreApi From 588e2c722d7dc298a12ec2add98d4b06b2b8a7b2 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 12:01:46 -0700 Subject: [PATCH 0362/1214] chore: Preparing for release 1.5 to new AWS sonatype instance --- pom.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index e61b9b73..bbc7eb55 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,6 @@ 1.5-SNAPSHOT AWS Serverless Java container - - - org.sonatype.oss - oss-parent - 7 - - aws-serverless-java-container-core aws-serverless-java-container-jersey @@ -35,6 +28,14 @@ scm:git:git@github.com:awslabs/aws-serverless-java-container.git + + + aws-oss-sonatype-staging + AWS Sonatype staging + https://aws.oss.sonatype.org + + + The Apache Software License, Version 2.0 From 5948b6e777a4a74bc879cd5fd798429726c77ba1 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 13:01:48 -0700 Subject: [PATCH 0363/1214] fix: Fixed version of release plugin to the same used by sonatype parent project --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index bbc7eb55..3b1f4fb0 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,7 @@ org.apache.maven.plugins maven-release-plugin + 2.1 clean verify install false From 57730cf73ef5f388eef0bf86eb1ec4107cbf8d24 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 13:07:41 -0700 Subject: [PATCH 0364/1214] Revert "fix: Fixed version of release plugin to the same used by sonatype parent project" This reverts commit 5948b6e777a4a74bc879cd5fd798429726c77ba1. --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3b1f4fb0..bbc7eb55 100644 --- a/pom.xml +++ b/pom.xml @@ -132,7 +132,6 @@ org.apache.maven.plugins maven-release-plugin - 2.1 clean verify install false From c8e8f414a94cb910c4e612369f17ac5aead89b0e Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 14:21:22 -0700 Subject: [PATCH 0365/1214] chore: Added project description, url, and developer information --- pom.xml | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index bbc7eb55..e7a04b40 100644 --- a/pom.xml +++ b/pom.xml @@ -6,6 +6,23 @@ pom 1.5-SNAPSHOT AWS Serverless Java container + A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda + https://github.com/awslabs/aws-serverless-java-container + + GitHub Issues + https://github.com/awslabs/aws-serverless-java-container/issues + + + + + amazonwebservices + Amazon Web Services + https://aws.amazon.com + + developer + + + aws-serverless-java-container-core @@ -28,11 +45,30 @@ scm:git:git@github.com:awslabs/aws-serverless-java-container.git + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://aws.oss.sonatype.org/content/repositories/snapshots + + false + + + true + + + + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://aws.oss.sonatype.org/content/repositories/snapshots/ + - aws-oss-sonatype-staging - AWS Sonatype staging - https://aws.oss.sonatype.org + sonatype-nexus-staging + Nexus Release Repository + https://aws.oss.sonatype.org/service/local/staging/deploy/maven2/ From 5008e6ae7f98f9ca5056903c3b5784996dfefbea Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 14:42:22 -0700 Subject: [PATCH 0366/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.5 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 9 ++++----- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 7 ++++--- aws-serverless-spark-archetype/pom.xml | 7 ++++--- aws-serverless-spring-archetype/pom.xml | 7 ++++--- aws-serverless-springboot-archetype/pom.xml | 7 ++++--- aws-serverless-springboot2-archetype/pom.xml | 7 ++++--- aws-serverless-struts2-archetype/pom.xml | 7 ++++--- pom.xml | 5 +++-- 13 files changed, 45 insertions(+), 39 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7145733e..432abb52 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b1c9b031..8bd505fe 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5-SNAPSHOT + 1.5 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index e5200e3f..7d77d154 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5-SNAPSHOT + 1.5 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 6065d464..f6d4747d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5-SNAPSHOT + 1.5 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 10d995fe..e844df72 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -1,10 +1,9 @@ - + aws-serverless-java-container com.amazonaws.serverless - 1.5-SNAPSHOT + 1.5 4.0.0 @@ -13,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 5.2.5.RELEASE @@ -28,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5-SNAPSHOT + 1.5 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 7e456c85..53d69ad2 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5-SNAPSHOT + 1.5 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 5b2aa801..64366271 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 0118ea5c..6bedd48b 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 128a51bf..1178013b 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index a8f66909..afe5e804 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 41a98455..3ca90846 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index e309fdd8..c866f59c 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5-SNAPSHOT + 1.5 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.5-SNAPSHOT + 1.5 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + diff --git a/pom.xml b/pom.xml index e7a04b40..0606e5ac 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.5-SNAPSHOT + 1.5 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,8 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.5 + From 452f84f21175500dfd4e127015ae3ca4704b0a7f Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 8 Apr 2020 14:42:24 -0700 Subject: [PATCH 0367/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 432abb52..200108b2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 8bd505fe..e9d4dbf4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5 + 1.6-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7d77d154..bbbb53b4 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f6d4747d..f0a7c984 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index e844df72..e485b890 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.5 + 1.6-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT 5.2.5.RELEASE @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 53d69ad2..40ab552e 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5 + 1.6-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 64366271..93f18286 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 6bedd48b..ccd50e99 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 1178013b..e53803fc 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index afe5e804..6a9727d7 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 3ca90846..76a3c52d 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index c866f59c..1ac7fc09 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.5 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD diff --git a/pom.xml b/pom.xml index 0606e5ac..8d322c7d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.5 + 1.6-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5 + HEAD From 253910f3fb414844db30d22f346783d5ec48a43c Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Mon, 20 Apr 2020 22:42:55 -0700 Subject: [PATCH 0368/1214] fix: Updated sample maven build files to still produce a jar so that SAM CLI's sam build command with maven (clean install) can work to address (#336) --- samples/jersey/pet-store/pom.xml | 12 ------------ samples/spark/pet-store/pom.xml | 12 ------------ samples/spring/pet-store/pom.xml | 12 ------------ samples/springboot/pet-store/pom.xml | 12 ------------ samples/springboot2/pet-store/pom.xml | 12 ------------ 5 files changed, 60 deletions(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index bacdbe04..0a7e4d2c 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -121,18 +121,6 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - org.apache.maven.plugins diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 26a2f256..ab5745a3 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -105,18 +105,6 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - org.apache.maven.plugins diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 2798eafa..927db267 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -144,18 +144,6 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - org.apache.maven.plugins diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml index 639b927a..95170476 100644 --- a/samples/springboot/pet-store/pom.xml +++ b/samples/springboot/pet-store/pom.xml @@ -76,18 +76,6 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - org.apache.maven.plugins diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index f9444cbf..0532ec63 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -82,18 +82,6 @@ - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - org.apache.maven.plugins From 0d189cdb9bef5b4bbd6b3db34b75b66315dbbf49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2020 21:02:21 -0700 Subject: [PATCH 0369/1214] Bump hibernate-validator in /samples/struts2/pet-store (#357) Bumps [hibernate-validator](https://github.com/hibernate/hibernate-validator) from 4.3.2.Final to 5.3.5.Final. - [Release notes](https://github.com/hibernate/hibernate-validator/releases) - [Changelog](https://github.com/hibernate/hibernate-validator/blob/5.3.5.Final/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/4.3.2.Final...5.3.5.Final) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index b761207d..cfe483fe 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -81,7 +81,7 @@ org.hibernate hibernate-validator - 4.3.2.Final + 5.3.5.Final From 1ab2c56eed93c93c03554c777b7635ed63d08842 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2020 08:36:11 -0700 Subject: [PATCH 0370/1214] Bump log4j.version from 2.8.2 to 2.13.3 in /samples/spring/pet-store (#359) Bumps `log4j.version` from 2.8.2 to 2.13.3. Updates `log4j-core` from 2.8.2 to 2.13.3 Updates `log4j-api` from 2.8.2 to 2.13.3 Updates `log4j-slf4j-impl` from 2.8.2 to 2.13.3 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 927db267..cdad48e8 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.2.5.RELEASE 4.12 - 2.8.2 + 2.13.3 From 6510147e7b2e8404982ba8ee7ba8c79f0ebf43ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2020 08:36:26 -0700 Subject: [PATCH 0371/1214] Bump log4j.version from 2.11.1 to 2.13.3 in /samples/struts2/pet-store (#360) Bumps `log4j.version` from 2.11.1 to 2.13.3. Updates `log4j-core` from 2.11.1 to 2.13.3 Updates `log4j-api` from 2.11.1 to 2.13.3 Updates `log4j-slf4j-impl` from 2.11.1 to 2.13.3 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index cfe483fe..03d7cbe3 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.22 2.10.3 4.12 - 2.11.1 + 2.13.3 From 79b80731fc076d916553ef3cd80b89bc2232e710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Ribeiro?= Date: Wed, 8 Jul 2020 22:49:01 +0100 Subject: [PATCH 0372/1214] Fix for issue #355 (#356) Co-authored-by: Antonio Ribeiro --- .../archetype-resources/build.gradle | 45 ++++++++++++------- .../resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 9e4b4ab1..05e93643 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -6,22 +6,37 @@ repositories { } dependencies { - compile ( - 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.22', - 'org.apache.struts:struts2-rest-plugin:2.5.22', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.22', - 'org.apache.struts:struts2-junit-plugin:2.5.22', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0', - 'org.hibernate:hibernate-validator:4.3.2.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.10.3', - 'org.apache.logging.log4j:log4j-core:2.8.2', - 'org.apache.logging.log4j:log4j-api:2.8.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', - ) - testCompile("junit:junit:4.12") + compile ('com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)') { + exclude group: 'org.apache.struts', module: 'struts2-core' + exclude group: 'org.apache.logging.log4j', module: 'log4j-api' + } + compile ('org.apache.struts:struts2-convention-plugin:2.5.22') { + exclude group: 'org.apache.struts', module: 'struts2-core' + } + compile ('org.apache.struts:struts2-rest-plugin:2.5.22') { + exclude group: 'org.apache.struts', module: 'struts2-core' + } + compile ('org.apache.struts:struts2-bean-validation-plugin:2.5.22') { + exclude group: 'org.apache.struts', module: 'struts2-core' + } + compile ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0') { + exclude group: 'org.apache.struts', module: 'struts2-core' + } + compile ('org.apache.struts:struts2-core:2.5.22') { + exclude group: 'org.apache.logging.log4j', module: 'log4j-api' + } + compile ('org.hibernate:hibernate-validator:4.3.2.Final') + compile ('com.fasterxml.jackson.core:jackson-databind:2.10.3') + compile ('org.apache.logging.log4j:log4j-core:2.8.2') + compile ('org.apache.logging.log4j:log4j-api:2.8.2') + compile ('org.apache.logging.log4j:log4j-slf4j-impl:2.8.2') + compile ('com.amazonaws:aws-lambda-java-log4j2:1.1.0') + + testCompile('junit:junit:4.12') + testCompile('org.apache.struts:struts2-junit-plugin:2.5.22') { + exclude group: 'org.apache.struts', module: 'struts2-core' + } } task buildZip(type: Zip) { diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 935c0e9f..7fbb3194 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.22 2.10.3 4.12 - 2.11.1 + 2.8.2 diff --git a/pom.xml b/pom.xml index 8d322c7d..292995da 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 0.7 5.3.2 2.10.3 - 1.8.0-beta4 + 1.7.30 From 19d0309ce503547049829a772a57b8bcb9341d67 Mon Sep 17 00:00:00 2001 From: Stefano Buliani <2996317+sapessi@users.noreply.github.com> Date: Wed, 15 Jul 2020 10:44:35 -0700 Subject: [PATCH 0373/1214] Merge fixes for patch release 1.5.1 (#364) * fix: Adding pathParameters to v2 proxy event as reported in #358. * fix: Address JSON content type issue reported in #352 and #344 * fix: Fixed bug caught by integration tests for #352 * fix: Fix struts tests for the changes made for #352 * test: Attempting to replicate the issue reported in #342 * test: Reverting exception test in Spring package since it's only available in Spring5, not Spring4 * fix: Sigh, forgot to remove the import for the class that doesn't exist from the previous commit * fix: Addresses bug reported in query string parsing (#363) for HTTP API support where we have a query string key, followed by a value declarator (=), but then no value * chore: Update GitHub issue and PR templates * fix: Fixed issue reported by SpotBugs with the exception logging of the HTTP API query string parsing --- .github/ISSUE_TEMPLATE.md | 22 ++++- .github/PULL_REQUEST_TEMPLATE.md | 9 ++ .../AwsHttpApiV2ProxyHttpServletRequest.java | 19 ++-- .../servlet/AwsHttpServletResponse.java | 43 ++++++--- .../testutils/AwsProxyRequestBuilder.java | 1 - .../proxy/model/HttpApiV2ProxyRequest.java | 9 ++ .../servlet/AwsHttpServletResponseTest.java | 24 +++++ .../proxy/spring/echoapp/EchoResource.java | 1 + .../proxy/spring/ServletAppTest.java | 92 ++++++++++++++++++- .../servletapp/LambdaStreamHandler.java | 63 +++++++++++++ .../spring/servletapp/MessageController.java | 24 +++++ .../proxy/struts2/Struts2AwsProxyTest.java | 2 +- 12 files changed, 282 insertions(+), 27 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 14b1a472..32e04baa 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,30 @@ -* Framework version: XX -* Implementations: Jersey / Spring / Spring Boot / Spark +*To help us debug your issue fill in the basic information below using the options provided* + +*Serverless Java Container version*: `eg. 1.5` + +*Implementations:* `Jersey / Spring / Spring Boot / Spring Boot 2 / Spark` + +*Framework version:* `eg SpringBoot 2.2.6.RELEASE` + +*Frontend service:* `REST API / HTTP API / ALB` + +*Deployment method:* `eg SAM, Serverless Framework, Console` ## Scenario +*Describe what you are trying to accomplish* ## Expected behavior +*Describe how you would expect the application to behave* ## Actual behavior +*Describe what you are seeing instead* ## Steps to reproduce +*Provide code samples we can use to reproduce the issue as part of our integration tests. If there is a public repository for the misbehaving application link to it here* ## Full log output +*Paste the full log output from the Lambda function's CloudWatch logs* + +``` +logs +``` \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..379cffdb --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +*Issue #, if available:* + +*Description of changes:* + + +By submitting this pull request + +- [ ] I confirm that my contribution is made under the terms of the Apache 2.0 license. +- [ ] I confirm that I've made a best effort attempt to update all relevant documentation. \ No newline at end of file diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index e65b506e..dcc48160 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -482,16 +482,19 @@ private MultiValuedTreeMap parseRawQueryString(String qs) { MultiValuedTreeMap qsMap = new MultiValuedTreeMap<>(); for (String value : qs.split(QUERY_STRING_SEPARATOR)) { - if (!value.contains(QUERY_STRING_KEY_VALUE_SEPARATOR)) { - log.warn("Invalid query string parameter: " + SecurityUtils.crlf(value)); - continue; - } - - String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR); try { - qsMap.add(URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding()), kv[1]); + if (!value.contains(QUERY_STRING_KEY_VALUE_SEPARATOR)) { + qsMap.add(URLDecoder.decode(value, LambdaContainerHandler.getContainerConfig().getUriEncoding()), null); + log.warn("Query string parameter with empty value and no =: " + SecurityUtils.crlf(value)); + continue; + } + + String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR); + String key = URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding()); + String val = kv.length == 2 ? kv[1] : null; + qsMap.add(key, val); } catch (UnsupportedEncodingException e) { - log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(kv[0]), e); + log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(value), e); } } return qsMap; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 153cdb91..63a2dca8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; @@ -387,18 +388,26 @@ public void setContentType(String s) { if (s == null) { return; } - - // we have no forced character encoding - if (characterEncoding == null) { - setHeader(HttpHeaders.CONTENT_TYPE, s, true); - return; + String contentType = s; + String charEncoding = characterEncoding; + + // TODO: Make the utilities to parse header values from the request object generic and reuse them here + if (s.contains("charset=")) { // we have a forced charset + int charsetIndex = s.indexOf("charset=") + 8; + int endCharsetIndex = s.indexOf(" ", charsetIndex); + if (endCharsetIndex == -1) { + endCharsetIndex = s.length(); + } + charEncoding = s.substring(charsetIndex, endCharsetIndex).toUpperCase(Locale.getDefault()); + contentType = s.split(";")[0]; } - if (s.contains(";")) { // we have a forced charset - setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", s.split(";")[0], characterEncoding), true); - } else { - setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", s, characterEncoding), true); + if (charEncoding == null) { + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s", contentType), true); + return; } + characterEncoding = charEncoding; + setHeader(HttpHeaders.CONTENT_TYPE, String.format("%s; charset=%s", contentType, charEncoding), true); } @@ -421,11 +430,23 @@ public void flushBuffer() throws IOException { } String charset = characterEncoding; - if(charset == null) { + byte[] respBody = bodyOutputStream.toByteArray(); + + // The content type is json but we have no encoding specified, according to the RFC (https://tools.ietf.org/html/rfc4627#section-3) + // we should attempt to detect the encoding. However, since we are running in Lambda we shouldn't even consider + // big endian systems and it's highly unlikely we'll have apps using UTF-16/32 we simply force UTF-8 + if (headers != null && headers.getFirst(HttpHeaders.CONTENT_TYPE) != null && + headers.getFirst(HttpHeaders.CONTENT_TYPE).toLowerCase(Locale.getDefault()).trim().equals(MediaType.APPLICATION_JSON) && + charset == null) { + charset = "UTF-8"; + } + + // if at this point we are still null, we set the default + if (charset == null) { charset = LambdaContainerHandler.getContainerConfig().getDefaultContentCharset(); } - responseBody = new String(bodyOutputStream.toByteArray(), charset); + responseBody = new String(respBody, charset); log.debug("Response buffer flushed with {} bytes, latch={}", responseBody.length(), writersCountDownLatch.getCount()); isCommitted = true; writersCountDownLatch.countDown(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 8d4dc63f..848f25bb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -482,7 +482,6 @@ public HttpApiV2ProxyRequest toHttpApiV2Request() { // we do not encode it rawQueryString.append(URLEncoder.encode(s, "UTF-8").replaceAll("%2C", ",")); } catch (UnsupportedEncodingException e) { - System.out.println("Ex!"); throw new RuntimeException(e); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java index 6eee7dc4..c50298ee 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java @@ -26,6 +26,7 @@ public class HttpApiV2ProxyRequest { private Map headers; private Map queryStringParameters; private String body; + private Map pathParameters; private boolean isBase64Encoded; private Map stageVariables; private HttpApiV2ProxyRequestContext requestContext; @@ -90,6 +91,14 @@ public String getBody() { return body; } + public Map getPathParameters() { + return pathParameters; + } + + public void setPathParameters(Map pathParameters) { + this.pathParameters = pathParameters; + } + public void setBody(String body) { this.body = body; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 65fc9177..4731a035 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -1,6 +1,7 @@ package com.amazonaws.serverless.proxy.internal.servlet; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.Headers; import org.junit.Test; @@ -36,6 +37,8 @@ public class AwsHttpServletResponseTest { private static final Pattern MAX_AGE_PATTERN = Pattern.compile("Max-Age=(-?[0-9]+)"); private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=(.*)$"); + private static final String CONTENT_TYPE_WITH_CHARSET = "application/json; charset=UTF-8"; + @Test public void cookie_addCookie_verifyPath() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); @@ -301,6 +304,27 @@ public void characterEncoding_setCharacterEncodingAndsetContentType() { assertEquals("UTF-8", resp.getCharacterEncoding()); } + @Test + public void characterEncoding_setCharacterEncodingInContentType_characterEncodingPopulatedCorrectly() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setContentType(CONTENT_TYPE_WITH_CHARSET); + + assertEquals(CONTENT_TYPE_WITH_CHARSET, resp.getContentType()); + assertEquals(CONTENT_TYPE_WITH_CHARSET, resp.getHeader("Content-Type")); + assertEquals("UTF-8", resp.getCharacterEncoding()); + } + + @Test + public void characterEncoding_setCharacterEncodingInContentType_overridesDefault() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setCharacterEncoding(ContainerConfig.DEFAULT_CONTENT_CHARSET); + resp.setContentType(CONTENT_TYPE_WITH_CHARSET); + + assertEquals(CONTENT_TYPE_WITH_CHARSET, resp.getContentType()); + assertEquals(CONTENT_TYPE_WITH_CHARSET, resp.getHeader("Content-Type")); + assertEquals("UTF-8", resp.getCharacterEncoding()); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index c0702001..ceb358be 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -38,6 +38,7 @@ public class EchoResource { public static final String TEST_GENERATE_URI = "test"; public static final String STRING_BODY = "Hello"; + public static final String EX_MESSAGE = "404 exception message"; @Bean public MultipartResolver multipartResolver() { diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index 88cf735d..de222843 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -3,11 +3,10 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.servletapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.servletapp.MessageController; -import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; -import com.amazonaws.serverless.proxy.spring.servletapp.UserData; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.spring.servletapp.*; import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.Assert; import org.junit.Test; @@ -17,8 +16,12 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.Collection; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -108,4 +111,85 @@ public void echoMessage_fileNameLikeParameter_returnsMessage() { assertEquals(200, resp.getStatusCode()); assertEquals("test.test.test", resp.getBody()); } + + @Test + public void getUtf8String_returnsValidUtf8String() { + // We expect strings to come back as UTF-8 correctly because Spring itself will call the setCharacterEncoding + // method on the response to set it to UTF- + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/utf8", "GET") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("text/plain; charset=UTF-8", resp.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).stream().collect(Collectors.joining(","))); + assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); + } + + @Test + public void getUtf8Json_returnsValidUtf8String() { + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("{\"s\":\""+MessageController.UTF8_RESPONSE+"\"}", resp.getBody()); + } + + @Test + public void stream_getUtf8String_returnsValidUtf8String() throws IOException { + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); + AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/utf8", "GET") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); + InputStream req = null; + switch (type) { + case "ALB": + req = reqBuilder.alb().buildStream(); + break; + case "API_GW": + req = reqBuilder.buildStream(); + break; + case "HTTP_API": + req = reqBuilder.toHttpApiV2RequestStream(); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + streamHandler.handleRequest(req, out, lambdaContext); + AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); + } + + @Test + public void stream_getUtf8Json_returnsValidUtf8String() throws IOException { + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); + AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); + InputStream req = null; + switch (type) { + case "ALB": + req = reqBuilder.alb().buildStream(); + break; + case "API_GW": + req = reqBuilder.buildStream(); + break; + case "HTTP_API": + req = reqBuilder.toHttpApiV2RequestStream(); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + streamHandler.handleRequest(req, out, lambdaContext); + AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("{\"s\":\""+MessageController.UTF8_RESPONSE+"\"}", resp.getBody()); + } + + @Test + public void springExceptionMapping_throw404Ex_expectMappedTo404() { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/ex/customstatus", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(404, resp.getStatusCode()); + } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java new file mode 100644 index 00000000..fd7d71d7 --- /dev/null +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class LambdaStreamHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; + + public LambdaStreamHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + switch (type) { + case "API_GW": + case "ALB": + handler.proxyStream(inputStream, outputStream, context); + break; + case "HTTP_API": + httpApiHandler.proxyStream(inputStream, outputStream, context); + } + + } +} diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index d46806b6..6bd51632 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -1,15 +1,22 @@ package com.amazonaws.serverless.proxy.spring.servletapp; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; import javax.validation.Valid; +import java.util.HashMap; +import java.util.Map; @RestController public class MessageController { public static final String HELLO_MESSAGE = "Hello"; public static final String VALID_MESSAGE = "VALID"; + public static final String UTF8_RESPONSE = "öüäß фрыцшщ"; + public static final String EX_MESSAGE = "404 exception message"; @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) public String hello() { @@ -36,4 +43,21 @@ public String returnMessage(@RequestBody MessageData data) { public String returnPathMessage(@PathVariable(value="message") String message) { return message; } + + @GetMapping(value = "/content-type/utf8", produces = "text/plain") + public ResponseEntity getUtf8String() { + return ResponseEntity.ok(UTF8_RESPONSE); + } + + @GetMapping(value = "/content-type/jsonutf8", produces=MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getUtf8Json() { + Map resp = new HashMap(); + resp.put("s", UTF8_RESPONSE); + return ResponseEntity.ok(resp); + } + + @GetMapping(value = "/ex/customstatus") + public String throw404Exception() { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, EX_MESSAGE); + } } diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java index 447b907b..60666f4a 100644 --- a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java @@ -52,7 +52,7 @@ public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { private static final String QUERY_STRING_KEY = "message"; private static final String QUERY_STRING_ENCODED_VALUE = "Hello Struts2"; private static final String USER_PRINCIPAL = "user1"; - private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json;charset=UTF-8"; + private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json; charset=UTF-8"; private static ObjectMapper objectMapper = new ObjectMapper(); From ef8ba5ad39ee083d881ffe9cf5f7a07739e36007 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 15 Jul 2020 12:48:02 -0700 Subject: [PATCH 0374/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.5.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 200108b2..9efa9a0c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e9d4dbf4..cffc0596 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index bbbb53b4..75cea763 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f0a7c984..4edebfd4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index e485b890..56802526 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.6-SNAPSHOT + 1.5.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 5.2.5.RELEASE @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.1 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 40ab552e..14b87e32 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.1 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 93f18286..1f8ee79f 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ccd50e99..de64ee7d 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e53803fc..9060d2c9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 6a9727d7..e4467383 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 76a3c52d..f262be30 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 1ac7fc09..79cc3629 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.1 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.6-SNAPSHOT + 1.5.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 diff --git a/pom.xml b/pom.xml index 292995da..fe5f4e08 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.6-SNAPSHOT + 1.5.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.1 From e4812726e34cdd3e9a669e2deb54899e6eff5193 Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Wed, 15 Jul 2020 12:48:02 -0700 Subject: [PATCH 0375/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9efa9a0c..200108b2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cffc0596..e9d4dbf4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.1 + 1.6-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 75cea763..bbbb53b4 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.1 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4edebfd4..f0a7c984 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.1 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 56802526..e485b890 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.5.1 + 1.6-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT 5.2.5.RELEASE @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.1 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 14b87e32..40ab552e 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.1 + 1.6-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 1f8ee79f..93f18286 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index de64ee7d..ccd50e99 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 9060d2c9..e53803fc 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index e4467383..6a9727d7 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index f262be30..76a3c52d 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 79cc3629..1ac7fc09 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.1 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.5.1 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD diff --git a/pom.xml b/pom.xml index fe5f4e08..292995da 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.5.1 + 1.6-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.1 + HEAD From 771a2fad353b78c2c79f8e5ccd7410b4ffa4265a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2020 12:55:45 -0700 Subject: [PATCH 0376/1214] Bump hibernate-validator in /aws-serverless-java-container-spring (#379) Bumps [hibernate-validator](https://github.com/hibernate/hibernate-validator) from 5.4.1.Final to 5.4.2.Final. - [Release notes](https://github.com/hibernate/hibernate-validator/releases) - [Changelog](https://github.com/hibernate/hibernate-validator/blob/5.4.2.Final/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/5.4.1.Final...5.4.2.Final) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- aws-serverless-java-container-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f0a7c984..20c4f082 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -72,7 +72,7 @@ org.hibernate hibernate-validator - 5.4.1.Final + 5.4.2.Final test From 4ec803b7af146ab09d7cd6eed48205d4e4e648bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2020 12:56:16 -0700 Subject: [PATCH 0377/1214] Bump hibernate-validator in /samples/struts2/pet-store (#378) Bumps [hibernate-validator](https://github.com/hibernate/hibernate-validator) from 5.3.5.Final to 5.3.6.Final. - [Release notes](https://github.com/hibernate/hibernate-validator/releases) - [Changelog](https://github.com/hibernate/hibernate-validator/blob/5.3.6.Final/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/5.3.5.Final...5.3.6.Final) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 03d7cbe3..767c25a7 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -81,7 +81,7 @@ org.hibernate hibernate-validator - 5.3.5.Final + 5.3.6.Final From d3ec49490ced49c0c4cff2be049d7699e6c20b09 Mon Sep 17 00:00:00 2001 From: Abhijeet Joshi Date: Fri, 25 Sep 2020 01:14:54 +0800 Subject: [PATCH 0378/1214] updated spring version (#381) * updated spring version * updated struts2 version because of vulnarabilities * removed the un-necessary new line --- aws-serverless-java-container-springboot2/pom.xml | 2 +- aws-serverless-java-container-struts2/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index e485b890..b52dd6f2 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,7 +15,7 @@ 1.6-SNAPSHOT - 5.2.5.RELEASE + 5.2.9.RELEASE 2.2.6.RELEASE 5.2.2.RELEASE 1.8 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 40ab552e..74f7f0f5 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.20 + 2.5.22 From edf11fe3383eab59f30dcdf5d8d492b20476a5b1 Mon Sep 17 00:00:00 2001 From: Kevin Sewell Date: Thu, 1 Oct 2020 20:50:20 +0200 Subject: [PATCH 0379/1214] fix: ensuring that headers are case insensitive (#383) * fix: ensuring that headers are case insensitive * fix: updating spring version in ci Co-authored-by: Kevin Sewell --- .github/workflows/continuous-integration-workflow.yml | 10 +++++----- .../internal/testutils/AwsProxyRequestBuilder.java | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 02584830..8d209bb0 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -49,11 +49,11 @@ jobs: # Spring core 5.2 and above. SpringBoot 1.5 is deprecated run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - name: Build Spring 4.3 - run: ./gha_build.sh spring false false -Dspring.version=4.3.25.RELEASE -Dspring-security.version=4.2.13.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=4.3.29.RELEASE -Dspring-security.version=4.2.18.RELEASE - name: Build Spring 5.0 - run: ./gha_build.sh spring false false -Dspring.version=5.0.16.RELEASE -Dspring-security.version=5.0.14.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.0.19.RELEASE -Dspring-security.version=5.0.18.RELEASE - name: Build Spring 5.1 - run: ./gha_build.sh spring false false -Dspring.version=5.1.14.RELEASE -Dspring-security.version=5.1.8.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.1.18.RELEASE -Dspring-security.version=5.1.12.RELEASE build_springboot2: name: Build and test SpringBoot 2 @@ -63,9 +63,9 @@ jobs: - name: Build latest run: ./gha_build.sh springboot2 true true - name: Build Spring Boot 2.0 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.16.RELEASE -Dspringsecurity.version=5.0.14.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.19.RELEASE -Dspringsecurity.version=5.0.18.RELEASE - name: Build Spring Boot 2.1 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.12.RELEASE -Dspring.version=5.1.13.RELEASE -Dspringsecurity.version=5.1.8.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.17.RELEASE -Dspring.version=5.1.18.RELEASE -Dspringsecurity.version=5.1.12.RELEASE build_struts2: name: Build and test Struts 2 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 848f25bb..11bcd58e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -457,7 +457,7 @@ public HttpApiV2ProxyRequest toHttpApiV2Request() { if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().containsKey(HttpHeaders.COOKIE)) { req.setCookies(Arrays.asList(request.getMultiValueHeaders().getFirst(HttpHeaders.COOKIE).split(";"))); } - req.setHeaders(new HashMap<>()); + req.setHeaders(new TreeMap<>(String.CASE_INSENSITIVE_ORDER)); if (request.getMultiValueHeaders() != null) { request.getMultiValueHeaders().forEach((key, value) -> req.getHeaders().put(key, value.get(0))); } diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 20c4f082..d7788009 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 5.2.5.RELEASE + 5.2.9.RELEASE 1.5.22.RELEASE 5.2.2.RELEASE diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index e7318593..d430d695 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.2.5.RELEASE', - 'org.springframework:spring-context:5.2.5.RELEASE', + 'org.springframework:spring-webmvc:5.2.9.RELEASE', + 'org.springframework:spring-context:5.2.9.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index a41ddd6e..42bf384e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.2.5.RELEASE + 5.2.9.RELEASE 4.12 2.8.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 433f5741..14e24306 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { compile ( - 'org.springframework:spring-webmvc:5.2.5.RELEASE', - 'org.springframework:spring-context:5.2.5.RELEASE', + 'org.springframework:spring-webmvc:5.2.9.RELEASE', + 'org.springframework:spring-context:5.2.9.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index cdad48e8..440ff32e 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.2.5.RELEASE + 5.2.9.RELEASE 4.12 2.13.3 From 5c4ca2bccae2885034d07dcca4e597f8864953e5 Mon Sep 17 00:00:00 2001 From: Stefano Buliani <2996317+sapessi@users.noreply.github.com> Date: Tue, 6 Oct 2020 14:41:38 -0700 Subject: [PATCH 0380/1214] 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) --- .../AwsProxyHttpServletResponseWriter.java | 29 ++++++++++++++++++- .../ServletLambdaContainerHandlerBuilder.java | 2 +- .../jersey/JerseyLambdaContainerHandler.java | 2 +- .../spark/SparkLambdaContainerHandler.java | 2 +- .../proxy/spring/ServletAppTest.java | 17 +++++++++-- .../Struts2LambdaContainerHandler.java | 2 +- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index ba98eedb..de84b5c2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -19,11 +19,14 @@ import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.Response; import java.util.Base64; +import java.util.HashMap; +import java.util.Map; /** @@ -32,6 +35,16 @@ */ public class AwsProxyHttpServletResponseWriter extends ResponseWriter { + private boolean writeSingleValueHeaders; + + public AwsProxyHttpServletResponseWriter() { + this(false); + } + + public AwsProxyHttpServletResponseWriter(boolean singleValueHeaders) { + writeSingleValueHeaders = singleValueHeaders; + } + //------------------------------------------------------------- // Methods - Implementation //------------------------------------------------------------- @@ -47,13 +60,16 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, if (!isBinary(containerResponse.getContentType()) && isValidUtf8(containerResponse.getAwsResponseBodyBytes())) { responseString = containerResponse.getAwsResponseBodyString(); } else { - responseString = Base64.getMimeEncoder().encodeToString(containerResponse.getAwsResponseBodyBytes()); + responseString = Base64.getEncoder().encodeToString(containerResponse.getAwsResponseBodyBytes()); awsProxyResponse.setBase64Encoded(true); } awsProxyResponse.setBody(responseString); } awsProxyResponse.setMultiValueHeaders(containerResponse.getAwsResponseHeaders()); + if (writeSingleValueHeaders) { + awsProxyResponse.setHeaders(toSingleValueHeaders(containerResponse.getAwsResponseHeaders())); + } awsProxyResponse.setStatusCode(containerResponse.getStatus()); @@ -65,6 +81,17 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, return awsProxyResponse; } + private Map toSingleValueHeaders(Headers h) { + Map out = new HashMap<>(); + if (h == null || h.isEmpty()) { + return out; + } + for (String k : h.keySet()) { + out.put(k, h.getFirst(k)); + } + return out; + } + private boolean isBinary(String contentType) { if(contentType != null) { int semidx = contentType.indexOf(';'); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java index 88e59fb6..caead2aa 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java @@ -110,7 +110,7 @@ public Builder defaultProxy() { public Builder defaultHttpApiV2Proxy() { initializationWrapper(new InitializationWrapper()) .requestReader((RequestReader) new AwsHttpApiV2HttpServletRequestReader()) - .responseWriter((ResponseWriter) new AwsProxyHttpServletResponseWriter()) + .responseWriter((ResponseWriter) new AwsProxyHttpServletResponseWriter(true)) .securityContextWriter((SecurityContextWriter) new AwsHttpApiV2SecurityContextWriter()) .exceptionHandler((ExceptionHandler) new AwsProxyExceptionHandler()) .requestTypeClass((Class) HttpApiV2ProxyRequest.class) diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index bb9d9509..fe50cd0f 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -116,7 +116,7 @@ public static JerseyLambdaContainerHandler newHandler = new SparkLambdaContainerHandler<>(HttpApiV2ProxyRequest.class, AwsProxyResponse.class, new AwsHttpApiV2HttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), + new AwsProxyHttpServletResponseWriter(true), new AwsHttpApiV2SecurityContextWriter(), new AwsProxyExceptionHandler(), new LambdaEmbeddedServerFactory()); diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index de222843..7c80dc86 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -23,8 +23,7 @@ import java.util.Collection; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; @RunWith(Parameterized.class) public class ServletAppTest { @@ -192,4 +191,18 @@ public void springExceptionMapping_throw404Ex_expectMappedTo404() { assertNotNull(resp); assertEquals(404, resp.getStatusCode()); } + + @Test + public void echoMessage_populatesSingleValueHeadersForHttpApiV2() { + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") + .header(HttpHeaders.ACCEPT, "application/json;v=1") + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + if ("HTTP_API".equals(type)) { + assertNotNull(resp.getHeaders()); + } else { + assertNull(resp.getHeaders()); + } + } } diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java index 3a536c9b..99c89c44 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java @@ -65,7 +65,7 @@ public static Struts2LambdaContainerHandler Date: Tue, 6 Oct 2020 15:05:16 -0700 Subject: [PATCH 0381/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.5.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 200108b2..82bfc542 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e9d4dbf4..b52573ea 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index bbbb53b4..9233136c 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d7788009..d9823f97 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index b52dd6f2..4f6cbb2f 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.6-SNAPSHOT + 1.5.2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 5.2.9.RELEASE @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.2 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 74f7f0f5..daff15d5 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.5.2 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 93f18286..e6685738 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ccd50e99..e4c15fda 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e53803fc..6f1c880c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 6a9727d7..781abcf4 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 76a3c52d..e078bd90 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 1ac7fc09..585ba23b 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.5.2 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.6-SNAPSHOT + 1.5.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 diff --git a/pom.xml b/pom.xml index 292995da..e75bf19b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.6-SNAPSHOT + 1.5.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.5.2 From fa97bf9fb6d8847c1d248fe41c006f194ca6265a Mon Sep 17 00:00:00 2001 From: Stefano Buliani Date: Tue, 6 Oct 2020 15:05:16 -0700 Subject: [PATCH 0382/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 13 files changed, 37 insertions(+), 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 82bfc542..200108b2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b52573ea..e9d4dbf4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.2 + 1.6-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9233136c..bbbb53b4 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.2 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d9823f97..d7788009 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT .. @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.2 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 4f6cbb2f..b52dd6f2 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.5.2 + 1.6-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT 5.2.9.RELEASE @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.2 + 1.6-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index daff15d5..74f7f0f5 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.5.2 + 1.6-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e6685738..93f18286 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index e4c15fda..ccd50e99 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 6f1c880c..e53803fc 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml index 781abcf4..6a9727d7 100644 --- a/aws-serverless-springboot-archetype/pom.xml +++ b/aws-serverless-springboot-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index e078bd90..76a3c52d 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 585ba23b..1ac7fc09 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.5.2 + 1.6-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.5.2 + 1.6-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD diff --git a/pom.xml b/pom.xml index e75bf19b..292995da 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.5.2 + 1.6-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -43,7 +43,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.5.2 + HEAD From 61bbef6fa44978c168e473afea63456228ccbc93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2020 08:24:45 -0700 Subject: [PATCH 0383/1214] Bump junit from 4.12 to 4.13.1 (#387) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 292995da..d0a65ef3 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ junit junit - 4.12 + 4.13.1 test From 1acb68a70c70d87b46a3309f860f3d8a18e7704b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2020 08:25:03 -0700 Subject: [PATCH 0384/1214] Bump junit from 4.12 to 4.13.1 in /samples/struts2/pet-store (#388) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 767c25a7..0cf0feaf 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 2.5.22 2.10.3 - 4.12 + 4.13.1 2.13.3 From 5bfacf247dabdb100336beb523d2a8fd5c8b487a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2020 08:25:22 -0700 Subject: [PATCH 0385/1214] Bump junit from 4.12 to 4.13.1 in /samples/spring/pet-store (#389) Bumps [junit](https://github.com/junit-team/junit4) from 4.12 to 4.13.1. - [Release notes](https://github.com/junit-team/junit4/releases) - [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.12.md) - [Commits](https://github.com/junit-team/junit4/compare/r4.12...r4.13.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 440ff32e..4997c048 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 5.2.9.RELEASE - 4.12 + 4.13.1 2.13.3 From e3cffe118fac0879484c52eafd56fbf0198dc8c8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 6 Jan 2021 13:43:08 +0100 Subject: [PATCH 0386/1214] allow compilation with JDK version >8 (update jacoco and spotbugs, added activation dependency) --- aws-serverless-java-container-core/pom.xml | 19 +++++++++++++++++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spark/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- .../pom.xml | 4 ++-- aws-serverless-java-container-struts2/pom.xml | 4 ++-- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 200108b2..301778da 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -104,7 +104,7 @@ org.jacoco jacoco-maven-plugin - 0.8.1 + 0.8.6 ${basedir}/target/coverage-reports/jacoco-unit.exec ${basedir}/target/coverage-reports/jacoco-unit.exec @@ -151,7 +151,7 @@ com.github.spotbugs spotbugs-maven-plugin - 3.1.1 + 4.2.0 + + org.eclipse.jetty + jetty-bom + 9.4.43.v20210629 + pom + import + + + + From 7843026728c96306b27c9af89603bd1d3d245fa4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 11:19:04 +0200 Subject: [PATCH 0394/1214] Update Jersey version to 2.34 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 98ce91a1..32c2f47e 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.30.1 + 2.34 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index fef30c66..e51ef098 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,17 +9,17 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.9.10', + 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'io.symphonia:lambda-logging:1.0.1' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.29.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.34") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.29.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.34") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 9ba6472a..0d1b86df 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,7 @@ 1.8 1.8 - 2.30.1 + 2.34 2.12.0 From beb1232092e5c9c7e9e39a03eca7d80b99f8223b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 11:32:14 +0200 Subject: [PATCH 0395/1214] CI: Use JDK 8 for older Jersey versions --- .github/workflows/continuous-integration-workflow.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 8d209bb0..b5212b12 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -22,6 +22,10 @@ jobs: - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh jersey true true + - name: Set up JDK 8 + uses: actions/setup-java@v1 + with: + java-version: 8 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 - name: Build Jersey 2.28 From bd8b9078449187f3de509f914f4c250e03735da9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 12:47:23 +0200 Subject: [PATCH 0396/1214] add UTF-8 sourceEncoding property (to fix build on Windows machines) --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 737edd1d..20c7cf9a 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,7 @@ 5.3.2 2.12.0 1.7.30 + UTF-8 From 81ee66f2667070483629804b5222aeef9378ec86 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Tue, 8 Dec 2020 15:55:13 +0100 Subject: [PATCH 0397/1214] Remove unused logger instance --- .../serverless/proxy/struts2/Struts2LambdaHandler.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java index 26a01bd9..b4aee76c 100644 --- a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java +++ b/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java @@ -16,8 +16,6 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -32,8 +30,6 @@ */ public class Struts2LambdaHandler implements RequestStreamHandler { - private static final Logger log = LoggerFactory.getLogger(Struts2LambdaHandler.class); - private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler .getAwsProxyHandler(); From 3ae17785ebeb9e36939977921203b02abb5e1ccc Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Tue, 8 Dec 2020 15:55:39 +0100 Subject: [PATCH 0398/1214] Use latest available Apache Struts2 GA version 2.5.26 --- aws-serverless-java-container-struts2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 7ace29f0..769a7929 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.22 + 2.5.26 From e5d824d89bc30d6c6e193445823f24ffefe77be9 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Tue, 8 Dec 2020 16:24:18 +0100 Subject: [PATCH 0399/1214] Use latest available dependency in Struts2 archetype --- .../src/main/resources/archetype-resources/pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index cf642c42..e8906de5 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,10 +15,10 @@ 1.8 1.8 - 2.5.22 + 2.5.26 2.12.0 - 4.12 - 2.8.2 + 4.13.1 + 2.14.0 @@ -31,7 +31,7 @@ com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 @@ -63,14 +63,14 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.1.0 + 1.3.0 org.hibernate hibernate-validator - 4.3.2.Final + 5.3.6.Final @@ -110,7 +110,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.1.0 + 1.2.0 From 4f37cb717dbdc59396a6a3916032c2acceecb0c6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 13:22:39 +0200 Subject: [PATCH 0400/1214] Use latest available Apache Struts2 GA version 2.5.26 --- .../resources/archetype-resources/build.gradle | 16 ++++++++-------- samples/struts2/pet-store/build.gradle | 14 +++++++------- samples/struts2/pet-store/pom.xml | 8 ++++---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index de84e9d9..4cd4c6c4 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,30 +11,30 @@ dependencies { exclude group: 'org.apache.struts', module: 'struts2-core' exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.22') { + implementation ('org.apache.struts:struts2-convention-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.22') { + implementation ('org.apache.struts:struts2-rest-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.22') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.0.0') { + implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.22') { + implementation ('org.apache.struts:struts2-core:2.5.26') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.hibernate:hibernate-validator:4.3.2.Final') + implementation ('org.hibernate:hibernate-validator:5.3.6.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.0') implementation ('org.apache.logging.log4j:log4j-core:2.8.2') implementation ('org.apache.logging.log4j:log4j-api:2.8.2') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.8.2') - implementation ('com.amazonaws:aws-lambda-java-log4j2:1.1.0') + implementation ('com.amazonaws:aws-lambda-java-log4j2:1.2.0') testImplementation('junit:junit:4.12') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.22') { + testImplementation('org.apache.struts:struts2-junit-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 6239be66..96a492e3 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -8,17 +8,17 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.22', - 'org.apache.struts:struts2-rest-plugin:2.5.22', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.22', - 'org.apache.struts:struts2-junit-plugin:2.5.22', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.1.0', - 'org.hibernate:hibernate-validator:4.3.2.Final', + 'org.apache.struts:struts2-convention-plugin:2.5.26', + 'org.apache.struts:struts2-rest-plugin:2.5.26', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.26', + 'org.apache.struts:struts2-junit-plugin:2.5.26', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', + 'org.hibernate:hibernate-validator:5.3.6.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'org.apache.logging.log4j:log4j-core:2.8.2', 'org.apache.logging.log4j:log4j-api:2.8.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', - 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 031714dc..59096afa 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.22 + 2.5.26 2.12.0 4.13.1 2.13.3 @@ -42,7 +42,7 @@ com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 @@ -74,7 +74,7 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.1.0 + 1.3.0 @@ -121,7 +121,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.1.0 + 1.2.0 From c0a30db1b16fbb8cecd8ff11f53f201875b056d7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 13:46:10 +0200 Subject: [PATCH 0401/1214] Update Log4J --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 8 ++++---- samples/spring/pet-store/pom.xml | 4 ++-- samples/struts2/pet-store/build.gradle | 6 +++--- samples/struts2/pet-store/pom.xml | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 769a7929..767beac0 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -69,7 +69,7 @@ org.apache.logging.log4j log4j-to-slf4j - 2.11.1 + 2.14.1 org.slf4j diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index ae04aa9c..9d382124 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.2.16.RELEASE', 'org.springframework:spring-context:5.2.16.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.8.2', - 'org.apache.logging.log4j:log4j-api:2.8.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'org.apache.logging.log4j:log4j-core:2.14.1', + 'org.apache.logging.log4j:log4j-api:2.14.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 822f509a..d981ccad 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.2.16.RELEASE 4.12 - 2.8.2 + 2.14.1 @@ -74,7 +74,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.1.0 + 1.2.0 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 4cd4c6c4..74e1f497 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -28,9 +28,9 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:5.3.6.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.0') - implementation ('org.apache.logging.log4j:log4j-core:2.8.2') - implementation ('org.apache.logging.log4j:log4j-api:2.8.2') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.8.2') + implementation ('org.apache.logging.log4j:log4j-core:2.14.1') + implementation ('org.apache.logging.log4j:log4j-api:2.14.1') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.14.1') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.2.0') testImplementation('junit:junit:4.12') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index e8906de5..bdcbed59 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.26 2.12.0 4.13.1 - 2.14.0 + 2.14.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 52255691..84363157 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,11 +10,11 @@ dependencies { 'org.springframework:spring-webmvc:5.2.9.RELEASE', 'org.springframework:spring-context:5.2.9.RELEASE', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.8.2', - 'org.apache.logging.log4j:log4j-api:2.8.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'org.apache.logging.log4j:log4j-core:2.14.1', + 'org.apache.logging.log4j:log4j-api:2.14.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', - 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', ) } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index b82b2a95..0f538486 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.2.16.RELEASE 4.13.1 - 2.13.3 + 2.14.1 @@ -90,7 +90,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.1.0 + 1.2.0 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 96a492e3..6c0c42a7 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -15,9 +15,9 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', 'org.hibernate:hibernate-validator:5.3.6.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', - 'org.apache.logging.log4j:log4j-core:2.8.2', - 'org.apache.logging.log4j:log4j-api:2.8.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.8.2', + 'org.apache.logging.log4j:log4j-core:2.14.1', + 'org.apache.logging.log4j:log4j-api:2.14.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 59096afa..f31b39c4 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.26 2.12.0 4.13.1 - 2.13.3 + 2.14.1 From b0ac2efc463a885a85bf92d7c3647e78ded03cfa Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 14:03:19 +0200 Subject: [PATCH 0402/1214] remove log4j-to-slf4j (log4j-slf4j-impl is used) --- aws-serverless-java-container-struts2/pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 767beac0..e7ae1c10 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -66,18 +66,6 @@ ${jackson.version} - - org.apache.logging.log4j - log4j-to-slf4j - 2.14.1 - - - org.slf4j - slf4j-api - - - - javax.el javax.el-api From a70de223f24aa6a1a46034856bb0aec7ade0439b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 14:28:58 +0200 Subject: [PATCH 0403/1214] remove log4j-to-slf4j (log4j-slf4j-impl is used) --- .../src/main/resources/archetype-resources/build.gradle | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 74e1f497..43a1f3e6 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -5,11 +5,18 @@ repositories { mavenCentral() } +configurations { + implementation { + exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' + } +} + dependencies { implementation ('com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)') { exclude group: 'org.apache.struts', module: 'struts2-core' exclude group: 'org.apache.logging.log4j', module: 'log4j-api' + exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } implementation ('org.apache.struts:struts2-convention-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' From ce7136c37f4c4c43b20d14a3d840c31505f5b1d6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 7 Jan 2021 09:13:30 +0100 Subject: [PATCH 0404/1214] Improve extensibility, allow other servlets besides DispatcherServlet --- .../spring/SpringLambdaContainerHandler.java | 16 +++- .../spring/SpringProxyHandlerBuilder.java | 23 ++--- .../spring/extensibility/CustomServlet.java | 21 +++++ .../extensibility/CustomServletTest.java | 27 ++++++ .../CustomSpringLambdaContainerHandler.java | 92 +++++++++++++++++++ .../CustomSpringProxyHandlerBuilder.java | 15 +++ .../extensibility/StreamLambdaHandler.java | 32 +++++++ 7 files changed, 208 insertions(+), 18 deletions(-) create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringProxyHandlerBuilder.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/StreamLambdaHandler.java diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 862df3bd..22f7c17c 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -37,7 +37,7 @@ * @param The expected return type */ public class SpringLambdaContainerHandler extends AwsLambdaServletContainerHandler { - private ConfigurableWebApplicationContext appContext; + protected final ConfigurableWebApplicationContext appContext; private String[] profiles; // State vars @@ -172,12 +172,20 @@ public void initialize() appContext.getEnvironment().setActiveProfiles(profiles); } appContext.setServletContext(getServletContext()); + registerServlets(); + // call initialize on AwsLambdaServletContainerHandler to initialize servlets that are set to load on startup + super.initialize(); + Timer.stop("SPRING_COLD_START"); + } + + /** + * Overriding this method allows to customize the standard Spring DispatcherServlet + * or to register additional servlets + */ + protected void registerServlets() { DispatcherServlet dispatcher = new DispatcherServlet(appContext); ServletRegistration.Dynamic reg = getServletContext().addServlet("dispatcherServlet", dispatcher); reg.addMapping("/"); reg.setLoadOnStartup(1); - // call initialize on AwsLambdaServletContainerHandler to initialize servlets that are set to load on startup - super.initialize(); - Timer.stop("SPRING_COLD_START"); } } diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java index 689b6de2..b1f35c80 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java @@ -13,17 +13,14 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import javax.servlet.http.HttpServletRequest; -public final class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< +public class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< RequestType, AwsProxyResponse, HttpServletRequest, @@ -69,22 +66,20 @@ public SpringLambdaContainerHandler build() throw } } - SpringLambdaContainerHandler handler = new SpringLambdaContainerHandler( - requestTypeClass, - responseTypeClass, - requestReader, - responseWriter, - securityContextWriter, - exceptionHandler, - ctx, - initializationWrapper - ); + SpringLambdaContainerHandler handler = createHandler(ctx); if (profiles != null) { handler.activateSpringProfiles(profiles); } return handler; } + protected SpringLambdaContainerHandler createHandler(ConfigurableWebApplicationContext ctx) { + return new SpringLambdaContainerHandler<>( + requestTypeClass, responseTypeClass, requestReader, responseWriter, + securityContextWriter, exceptionHandler, ctx, initializationWrapper + ); + } + @Override public SpringLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { SpringLambdaContainerHandler handler = build(); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java new file mode 100644 index 00000000..2b8604d3 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java @@ -0,0 +1,21 @@ +package com.amazonaws.serverless.proxy.spring.extensibility; + +import org.springframework.context.ApplicationContext; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class CustomServlet extends HttpServlet { + private ApplicationContext appCtx; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.getWriter().print("Unittest " + (appCtx!=null ? appCtx.getDisplayName() : "")); + } + + public void setAppCtx(ApplicationContext appCtx) { + this.appCtx = appCtx; + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java new file mode 100644 index 00000000..9cac0aa1 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java @@ -0,0 +1,27 @@ +package com.amazonaws.serverless.proxy.spring.extensibility; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import org.junit.Test; + +import javax.ws.rs.HttpMethod; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.assertTrue; + +public class CustomServletTest { + + @Test + public void customServlet() throws IOException { + StreamLambdaHandler lambdaHandler = new StreamLambdaHandler(); + InputStream requestStream = new AwsProxyRequestBuilder("/test", HttpMethod.GET) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + lambdaHandler.handleRequest(requestStream, responseStream, new MockLambdaContext()); + assertTrue("response should contain value set in CustomServlet", + responseStream.toString().contains("Unittest")); + } + +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java new file mode 100644 index 00000000..3ed87233 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java @@ -0,0 +1,92 @@ +package com.amazonaws.serverless.proxy.spring.extensibility; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.*; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import org.springframework.web.context.ConfigurableWebApplicationContext; + +import javax.servlet.ServletRegistration; +import javax.servlet.http.HttpServletRequest; + +public class CustomSpringLambdaContainerHandler extends SpringLambdaContainerHandler { + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects + * @param config A set of classes annotated with the Spring @Configuration annotation + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException When the Spring framework fails to start. + */ + public static SpringLambdaContainerHandler getAwsProxyHandler(Class... config) throws ContainerInitializationException { + return new CustomSpringProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .configurationClasses(config) + .buildAndInitialize(); + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and sets the given profiles as active + * @param applicationContext A custom ConfigurableWebApplicationContext to be used + * @param profiles The spring profiles to activate + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException When the Spring framework fails to start. + */ + public static SpringLambdaContainerHandler getAwsProxyHandler(ConfigurableWebApplicationContext applicationContext, String... profiles) + throws ContainerInitializationException { + return new CustomSpringProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springApplicationContext(applicationContext) + .profiles(profiles) + .buildAndInitialize(); + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `HttpApiV2ProxyRequest` and `AwsProxyResponse` objects + * @param config A set of classes annotated with the Spring @Configuration annotation + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException When the Spring framework fails to start. + */ + public static SpringLambdaContainerHandler getHttpApiV2ProxyHandler(Class... config) throws ContainerInitializationException { + return new CustomSpringProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .configurationClasses(config) + .buildAndInitialize(); + } + + /** + * Creates a new container handler with the given reader and writer objects + * + * @param requestTypeClass The class for the incoming Lambda event + * @param requestReader An implementation of `RequestReader` + * @param responseWriter An implementation of `ResponseWriter` + * @param securityContextWriter An implementation of `SecurityContextWriter` + * @param exceptionHandler An implementation of `ExceptionHandler` + */ + public CustomSpringLambdaContainerHandler(Class requestTypeClass, + Class responseTypeClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler, + ConfigurableWebApplicationContext applicationContext, + InitializationWrapper init) { + super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, + exceptionHandler, applicationContext, init); + } + + @Override + protected void registerServlets() { + CustomServlet customServlet = new CustomServlet(); + customServlet.setAppCtx(appContext); + ServletRegistration.Dynamic reg = getServletContext().addServlet("customServlet", customServlet); + reg.addMapping("/"); + reg.setLoadOnStartup(1); + } + +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringProxyHandlerBuilder.java new file mode 100644 index 00000000..de74cf54 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringProxyHandlerBuilder.java @@ -0,0 +1,15 @@ +package com.amazonaws.serverless.proxy.spring.extensibility; + +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringProxyHandlerBuilder; +import org.springframework.web.context.ConfigurableWebApplicationContext; + +public class CustomSpringProxyHandlerBuilder extends SpringProxyHandlerBuilder { + + @Override + protected SpringLambdaContainerHandler createHandler(ConfigurableWebApplicationContext ctx) { + return new CustomSpringLambdaContainerHandler<>(requestTypeClass, responseTypeClass, requestReader, responseWriter, + securityContextWriter, exceptionHandler, ctx, initializationWrapper); + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/StreamLambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/StreamLambdaHandler.java new file mode 100644 index 00000000..afc74869 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/StreamLambdaHandler.java @@ -0,0 +1,32 @@ +package com.amazonaws.serverless.proxy.spring.extensibility; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import org.springframework.web.context.support.GenericWebApplicationContext; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static final SpringLambdaContainerHandler handler; + static { + try { + handler = CustomSpringLambdaContainerHandler.getAwsProxyHandler(new GenericWebApplicationContext()); + } catch (ContainerInitializationException e) { + throw new RuntimeException("Could not initialize Spring framework", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} \ No newline at end of file From cf8abfe2580b83a5ae13016879661a60786d52fa Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jul 2021 16:57:04 +0200 Subject: [PATCH 0405/1214] Revert "Fixing the cookies field in the v2 request object." --- .../servlet/AwsHttpApiV2ProxyHttpServletRequest.java | 7 ------- .../servlet/AwsHttpApiV2HttpServletRequestReaderTest.java | 6 ------ 2 files changed, 13 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index f1ed2175..dcc48160 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -75,13 +75,6 @@ public String getAuthType() { @Override public Cookie[] getCookies() { - if (request.getCookies() != null && !request.getCookies().isEmpty()) { - return request.getCookies().stream() - .map(cookie -> cookie.split("=", 2)) - .map(parts -> new Cookie(SecurityUtils.crlf(parts[0]), SecurityUtils.crlf(parts[1]))) - .toArray(Cookie[]::new); - } - if (headers == null || !headers.containsKey(HttpHeaders.COOKIE)) { return new Cookie[0]; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java index 4e19998d..004d4d48 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -7,7 +7,6 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import org.junit.Test; -import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import static org.junit.Assert.*; @@ -26,7 +25,6 @@ public void baseRequest_read_populatesSuccessfully() { .referer("localhost") .queryString("param1", "value1") .header("custom", "value") - .cookie("_cookie", "baked") .apiId("test").toHttpApiV2Request(); AwsHttpApiV2HttpServletRequestReader reader = new AwsHttpApiV2HttpServletRequestReader(); try { @@ -34,10 +32,6 @@ public void baseRequest_read_populatesSuccessfully() { assertEquals("/hello", servletRequest.getPathInfo()); assertEquals("value1", servletRequest.getParameter("param1")); assertEquals("value", servletRequest.getHeader("CUSTOM")); - Cookie[] cookies = servletRequest.getCookies(); - assertEquals(1, cookies.length); - assertEquals("_cookie", cookies[0].getName()); - assertEquals("baked", cookies[0].getValue()); assertNotNull(servletRequest.getAttribute(AwsHttpApiV2HttpServletRequestReader.HTTP_API_CONTEXT_PROPERTY)); assertEquals("test", From ad4a7a32b6494ce8af2a457341d613bdf957d0fc Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 09:39:16 +0200 Subject: [PATCH 0406/1214] remove unused BasicHeaderValueParser --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index f02cefd1..6996b9b1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -27,7 +27,6 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; -import org.apache.http.message.BasicHeaderValueParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,7 +82,6 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private ServletContext servletContext; private AwsHttpSession session; private String queryString; - private BasicHeaderValueParser headerParser; private Map multipartFormParameters; private Map> urlEncodedFormParameters; @@ -107,7 +105,6 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { AwsHttpServletRequest(Context lambdaContext) { this.lambdaContext = lambdaContext; attributes = new HashMap<>(); - headerParser = new BasicHeaderValueParser(); setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.REQUEST); } From ddc9b61ecc886f96d04226c3ab1773c66e2f2913 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 09:40:11 +0200 Subject: [PATCH 0407/1214] set httpcore dependency to optional (#394) --- aws-serverless-java-container-core/pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 23029ab4..297af240 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -74,7 +74,7 @@ org.apache.httpcomponents httpmime - 4.5.6 + 4.5.13 compile @@ -88,8 +88,10 @@ org.apache.httpcomponents httpcore - 4.4.10 + 4.4.14 compile + true org.springframework.security From ed157dbfa0327d6781a4cc4ce2697ec8006b6ab3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:14:15 +0200 Subject: [PATCH 0408/1214] Drop Spring Boot 1.x support (#419) --- aws-serverless-java-container-spring/pom.xml | 33 --- .../SpringBootLambdaContainerHandler.java | 208 ------------------ .../spring/SpringBootProxyHandlerBuilder.java | 77 ------- ...SpringBootServletConfigurationSupport.java | 24 -- ...erverlessServletEmbeddedServerFactory.java | 67 ------ .../serverless/proxy/spring/SlowAppTest.java | 26 --- .../proxy/spring/SpringBootAppTest.java | 201 ----------------- .../proxy/spring/SpringBootSecurityTest.java | 74 ------- ...rlessServletEmbeddedServerFactoryTest.java | 118 ---------- .../spring/sbsecurityapp/LambdaHandler.java | 33 --- .../spring/sbsecurityapp/TestApplication.java | 13 -- .../spring/sbsecurityapp/TestController.java | 47 ---- .../sbsecurityapp/TestSecurityConfig.java | 44 ---- .../spring/springbootapp/LambdaHandler.java | 58 ----- .../spring/springbootapp/TestApplication.java | 14 -- .../spring/springbootapp/TestController.java | 84 ------- .../springbootslowapp/MessageController.java | 15 -- .../springbootslowapp/SBLambdaHandler.java | 40 ---- .../springbootslowapp/TestApplication.java | 26 --- aws-serverless-springboot-archetype/pom.xml | 80 ------- .../META-INF/maven/archetype-metadata.xml | 39 ---- .../resources/archetype-resources/README.md | 99 --------- .../archetype-resources/build.gradle | 29 --- .../resources/archetype-resources/pom.xml | 141 ------------ .../archetype-resources/src/assembly/bin.xml | 27 --- .../src/main/java/Application.java | 72 ------ .../src/main/java/StreamLambdaHandler.java | 33 --- .../main/java/controller/PingController.java | 20 -- .../src/main/resources/application.properties | 3 - .../test/java/StreamLambdaHandlerTest.java | 90 -------- .../archetype-resources/template.yml | 52 ----- .../projects/base/archetype.properties | 3 - .../src/test/resources/projects/base/goal.txt | 1 - pom.xml | 1 - 34 files changed, 1892 deletions(-) delete mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java delete mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java delete mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java delete mode 100644 aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java delete mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java delete mode 100644 aws-serverless-springboot-archetype/pom.xml delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java delete mode 100644 aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml delete mode 100644 aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties delete mode 100644 aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 2294f8a5..b5c553fa 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,6 @@ 5.2.16.RELEASE - 1.5.22.RELEASE 5.2.11.RELEASE @@ -89,38 +88,6 @@ 2.2.4 test - - org.springframework.boot - spring-boot - ${springboot.version} - true - - - org.springframework - spring-context - - - org.springframework - spring-core - - - - - org.springframework.boot - spring-boot-autoconfigure - ${springboot.version} - test - - - org.springframework - spring-context - - - org.springframework - spring-core - - - org.springframework.security spring-security-config diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java deleted file mode 100644 index 98841ed4..00000000 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.*; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.servlet.*; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; -import com.amazonaws.services.lambda.runtime.Context; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.StandardEnvironment; -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ConfigurableWebApplicationContext; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; - -import java.util.concurrent.CountDownLatch; - -/** - * SpringBoot 1.x implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` - * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and - * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. - * - * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). - * - * @deprecated Spring officially deprecated - * SpringBoot 1.5.x as of August 2019. We recommend upgrading to SpringBoot 2.1 or above. SpringBoot 2 is supported - * in the - * aws-serverless-java-container-springboot2 module. - * - * @param The incoming event type - * @param The expected return type - */ -@Deprecated -public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { - private static final String DISPATCHER_SERVLET_REGISTRATION_NAME = "dispatcherServlet"; - - private final Class springBootInitializer; - private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); - private String[] springProfiles = null; - - private static SpringBootLambdaContainerHandler instance; - - // State vars - private boolean initialized; - - /** - * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. - * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() - * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it - * for our mock {@link com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory}. - * - * @return The initialized instance - */ - public static SpringBootLambdaContainerHandler getInstance() { - return instance; - } - - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @param profiles A list of Spring profiles to activate - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) - throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(springBootInitializer) - .profiles(profiles) - .buildAndInitialize(); - } - - /** - * Creates a default SpringLambdaContainerHandler initialized with the `HttpApiV2ProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @param profiles A list of Spring profiles to activate - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getHttpApiV2ProxyHandler(Class springBootInitializer, String... profiles) - throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(springBootInitializer) - .profiles(profiles) - .buildAndInitialize(); - } - - /** - * Creates a new container handler with the given reader and writer objects - * - * @param requestTypeClass The class for the incoming Lambda event - * @param requestReader An implementation of `RequestReader` - * @param responseWriter An implementation of `ResponseWriter` - * @param securityContextWriter An implementation of `SecurityContextWriter` - * @param exceptionHandler An implementation of `ExceptionHandler` - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public SpringBootLambdaContainerHandler(Class requestTypeClass, - Class responseTypeClass, - RequestReader requestReader, - ResponseWriter responseWriter, - SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler, - Class springBootInitializer, - InitializationWrapper init) - throws ContainerInitializationException { - super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); - initialized = false; - this.springBootInitializer = springBootInitializer; - setInitializationWrapper(init); - SpringBootLambdaContainerHandler.setInstance(this); - - Timer.stop("SPRINGBOOT_CONTAINER_HANDLER_CONSTRUCTOR"); - } - - // this is not pretty. However, because SpringBoot wants to control all of the initialization - // we need to access this handler as a singleton from the EmbeddedContainer to set the servlet - // context and from the ServletConfigurationSupport implementation - private static void setInstance(SpringBootLambdaContainerHandler h) { - SpringBootLambdaContainerHandler.instance = h; - } - - public void activateSpringProfiles(String... profiles) { - springProfiles = profiles; - // force a re-initialization - initialized = false; - } - - @Override - protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { - return new AwsHttpServletResponse(request, latch); - } - - @Override - protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { - // this method of the AwsLambdaServletContainerHandler sets the servlet context - Timer.start("SPRINGBOOT_HANDLE_REQUEST"); - - // wire up the application context on the first invocation - if (!initialized) { - initialize(); - } - - if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { - ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); - ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); - } - - // process filters & invoke servlet - Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - doFilter(containerRequest, containerResponse, reqServlet); - Timer.stop("SPRINGBOOT_HANDLE_REQUEST"); - } - - - @Override - public void initialize() - throws ContainerInitializationException { - Timer.start("SPRINGBOOT_COLD_START"); - - SpringApplication app = new SpringApplication( - springBootInitializer, - ServerlessServletEmbeddedServerFactory.class, - SpringBootServletConfigurationSupport.class - ); - if (springProfiles != null && springProfiles.length > 0) { - ConfigurableEnvironment springEnv = new StandardEnvironment(); - springEnv.setActiveProfiles(springProfiles); - app.setEnvironment(springEnv); - } - ConfigurableApplicationContext applicationContext = app.run(); - - ((ConfigurableWebApplicationContext)applicationContext).setServletContext(getServletContext()); - AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); - if (reg != null) { - reg.setLoadOnStartup(1); - } - super.initialize(); - initialized = true; - Timer.stop("SPRINGBOOT_COLD_START"); - } -} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java deleted file mode 100644 index 2f06e73e..00000000 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.springframework.web.WebApplicationInitializer; - -import javax.servlet.http.HttpServletRequest; - -public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< - RequestType, - AwsProxyResponse, - HttpServletRequest, - SpringBootLambdaContainerHandler, - SpringBootProxyHandlerBuilder> { - private Class springBootInitializer; - private String[] profiles; - - @Override - protected SpringBootProxyHandlerBuilder self() { - return this; - } - - - public SpringBootProxyHandlerBuilder springBootApplication(Class app) { - springBootInitializer = app; - return self(); - } - - public SpringBootProxyHandlerBuilder profiles(String... profiles) { - this.profiles = profiles; - return self(); - } - - @Override - public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { - validate(); - if (springBootInitializer == null) { - throw new ContainerInitializationException("Missing spring boot application class in builder", null); - } - SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( - requestTypeClass, - responseTypeClass, - requestReader, - responseWriter, - securityContextWriter, - exceptionHandler, - springBootInitializer, - initializationWrapper - ); - if (profiles != null) { - handler.activateSpringProfiles(profiles); - } - return handler; - } - - @Override - public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { - SpringBootLambdaContainerHandler handler = build(); - initializationWrapper.start(handler); - return handler; - } -} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java deleted file mode 100644 index 9857c962..00000000 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootServletConfigurationSupport.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import org.springframework.boot.context.embedded.WebApplicationContextServletContextAwareProcessor; -import org.springframework.web.context.ConfigurableWebApplicationContext; - - -public class SpringBootServletConfigurationSupport extends WebApplicationContextServletContextAwareProcessor { - public SpringBootServletConfigurationSupport(ConfigurableWebApplicationContext webApplicationContext) { - super(webApplicationContext); - webApplicationContext.setServletContext(SpringBootLambdaContainerHandler.getInstance().getServletContext()); - } -} diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java deleted file mode 100644 index bd567ed7..00000000 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring.embedded; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory; -import org.springframework.boot.context.embedded.EmbeddedServletContainer; -import org.springframework.boot.context.embedded.EmbeddedServletContainerException; -import org.springframework.boot.web.servlet.ServletContextInitializer; - -import javax.servlet.ServletException; - -/** - * Implementation of SpringBoot's embedded container factory and servlet container. This replaces SpringBoot's default - * embedded container and uses the {@link SpringBootLambdaContainerHandler} as a singleton to retrieve the current - * {@link javax.servlet.ServletContext} and pass it to the array of {@link javax.servlet.ServletContainerInitializer}. - */ -public class ServerlessServletEmbeddedServerFactory extends AbstractEmbeddedServletContainerFactory implements EmbeddedServletContainer { - private AwsLambdaServletContainerHandler handler; - private ServletContextInitializer[] initializers; - - public ServerlessServletEmbeddedServerFactory() { - super(); - handler = SpringBootLambdaContainerHandler.getInstance(); - } - - @Override - public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... servletContextInitializers) { - initializers = servletContextInitializers; - - return this; - } - - @Override - public void start() throws EmbeddedServletContainerException { - for (ServletContextInitializer i : initializers) { - try { - if (handler.getServletContext() == null) { - throw new EmbeddedServletContainerException("Attempting to initialize ServletEmbeddedWebServer without ServletContext in Handler", null); - } - i.onStartup(handler.getServletContext()); - } catch (ServletException e) { - throw new EmbeddedServletContainerException("Could not initialize Servlets", e); - } - } - } - - ServletContextInitializer[] getInitializers() { - return initializers; - } - - @Override - public void stop() throws EmbeddedServletContainerException { - - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java index 29bc83ee..0844b624 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -5,13 +5,11 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.springbootslowapp.SBLambdaHandler; import com.amazonaws.serverless.proxy.spring.springslowapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springslowapp.MessageController; import com.amazonaws.serverless.proxy.spring.springslowapp.SlowAppConfig; import org.junit.Assert; import org.junit.Test; -import org.springframework.core.SpringVersion; import java.time.Instant; import java.util.Objects; @@ -41,28 +39,4 @@ public void springSlowApp_continuesInBackgroundThread_returnsCorrect() { Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } - @Test - public void springBootSlowApp_continuesInBackgroundThread_returnsCorrect() { - // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer - // breaking changes in the latest Spring releases have not been supported in it. - // TODO: Update the check to verify any Spring version above 5.2 - assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); - - SBLambdaHandler slowApp = null; - try { - slowApp = new SBLambdaHandler(); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - fail("Exception during initialization"); - } - System.out.println("Start time: " + slowApp.getConstructorTime()); - assertTrue(slowApp.getConstructorTime() < 10_000); - AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); - long startRequestTime = Instant.now().toEpochMilli(); - AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); - long endRequestTime = Instant.now().toEpochMilli(); - assertTrue(endRequestTime - startRequestTime > SlowAppConfig.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); - assertEquals(200, resp.getStatusCode()); - Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); - } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java deleted file mode 100644 index 2a345b6f..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootAppTest.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.Headers; -import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; -import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; -import com.amazonaws.serverless.proxy.spring.springbootapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.springbootapp.TestController; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.springframework.core.SpringVersion; - -import javax.ws.rs.core.HttpHeaders; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Objects; - -import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_HEADER_NAME; -import static com.amazonaws.serverless.proxy.spring.springbootapp.TestController.CUSTOM_QS_NAME; -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; - - -@RunWith(Parameterized.class) -public class SpringBootAppTest { - private LambdaHandler handler; - private MockLambdaContext context = new MockLambdaContext(); - private ObjectMapper mapper = new ObjectMapper(); - - private String type; - - @Parameterized.Parameters - public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); - } - - @BeforeClass - public static void before() { - // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer - // breaking changes in the latest Spring releases have not been supported in it. - // TODO: Update the check to verify any Spring version above 5.2 - assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); - } - - public SpringBootAppTest(String reqType) { - type = reqType; - handler = new LambdaHandler(type); - } - - @Test - public void testMethod_springSecurity_doesNotThrowException() { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, TestController.TEST_VALUE); - } - - @Test - public void testMethod_testRequestFromString_doesNotThrowNpe() throws IOException { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder().fromJsonString("{\n" + - " \"resource\": \"/missing-params\",\n" + - " \"path\": \"/missing-params\",\n" + - " \"httpMethod\": \"GET\",\n" + - " \"headers\": null,\n" + - " \"multiValueHeaders\": null,\n" + - " \"queryStringParameters\": null,\n" + - " \"multiValueQueryStringParameters\": null,\n" + - " \"pathParameters\": null,\n" + - " \"stageVariables\": null,\n" + - " \"requestContext\": {\n" + - " \"resourcePath\": \"/path/resource\",\n" + - " \"httpMethod\": \"POST\",\n" + - " \"path\": \"//path/resource\",\n" + - " \"accountId\": \"accountIdNumber\",\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"stage\": \"test-invoke-stage\",\n" + - " \"domainPrefix\": \"testPrefix\",\n" + - " \"identity\": {\n" + - " \"cognitoIdentityPoolId\": null,\n" + - " \"cognitoIdentityId\": null,\n" + - " \"apiKey\": \"test-invoke-api-key\",\n" + - " \"principalOrgId\": null,\n" + - " \"cognitoAuthenticationType\": null,\n" + - " \"userArn\": \"actual arn\",\n" + - " \"apiKeyId\": \"test-invoke-api-key-id\"\n" + - " }\n" + - " },\n" + - " \"body\": \"{ \\\"Key1\\\": \\\"Value1\\\", \\\"Key2\\\": \\\"Value2\\\", \\\"Key3\\\": \\\"Vaue3\\\" }\",\n" + - " \"isBase64Encoded\": \"false\"\n" + - "}"); - - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - // Spring identifies the missing header - assertEquals(400, resp.getStatusCode()); - req.multiValueHeaders(new Headers()); - req.header(CUSTOM_HEADER_NAME, "val"); - resp = handler.handleRequest(req, context); - assertEquals(400, resp.getStatusCode()); - req.multiValueQueryString(new MultiValuedTreeMap<>()); - req.queryString(CUSTOM_QS_NAME, "val"); - resp = handler.handleRequest(req, context); - assertEquals(200, resp.getStatusCode()); - } - - @Test - public void defaultError_requestForward_springBootForwardsToDefaultErrorPage() { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test2", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(404, resp.getStatusCode()); - assertNotNull(resp.getMultiValueHeaders()); - } - - @Test - public void requestUri_dotInPathParam_expectRoutingToMethod() { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/testdomain.com", "GET"); - - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, "testdomain.com"); - } - - @Test - public void queryString_commaSeparatedList_expectUnmarshalAsList() { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/query-string", "GET") - .queryString("list", "v1,v2,v3"); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, "3"); - } - - @Test - public void queryString_multipleParamsWithSameName_expectUnmarshalAsList() { - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/test/query-string", "GET") - .queryString("list", "v1").queryString("list", "v2"); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, "2"); - } - - @Test - public void staticContent_getHtmlFile_returnsHtmlContent() { - LambdaContainerHandler.getContainerConfig().addValidFilePath(System.getProperty("user.dir")); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/static.html", "GET") - .header(HttpHeaders.ACCEPT, "text/html") - .header(HttpHeaders.CONTENT_TYPE, "text/plain"); - AwsProxyResponse output = handler.handleRequest(request, context); - assertEquals(200, output.getStatusCode()); - assertTrue(output.getBody().contains("

Static

")); - } - - @Test - public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharset() { - LambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/test/utf8", "GET"); - AwsProxyResponse output = handler.handleRequest(request, context); - validateSingleValueModel(output, TestController.UTF8_TEST_STRING); - assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains(";")); - assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains("charset=UTF-8")); - } - - @Test - public void utf8_returnUtf8String_expectCorrectHeaderMediaAndCharsetNoDefault() { - - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/test/utf8", "GET") - .header("Content-Type", "application/json; charset=UTF-8"); - AwsProxyResponse output = handler.handleRequest(request, context); - validateSingleValueModel(output, TestController.UTF8_TEST_STRING); - assertTrue(output.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains(";")); - assertTrue(output.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).contains("charset=UTF-8")); - } - - - private void validateSingleValueModel(AwsProxyResponse output, String value) { - try { - SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class); - assertNotNull(response.getValue()); - assertEquals(value, response.getValue()); - } catch (IOException e) { - e.printStackTrace(); - fail("Exception while parsing response body: " + e.getMessage()); - } - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java deleted file mode 100644 index 49ba0e00..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootSecurityTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; -import com.amazonaws.serverless.proxy.spring.sbsecurityapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.sbsecurityapp.TestController; -import com.amazonaws.serverless.proxy.spring.sbsecurityapp.TestSecurityConfig; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.core.SpringVersion; - -import javax.ws.rs.core.HttpHeaders; -import java.io.IOException; -import java.util.Base64; -import java.util.Objects; - -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; - - -public class SpringBootSecurityTest { - private LambdaHandler handler = new LambdaHandler(); - private MockLambdaContext context = new MockLambdaContext(); - private ObjectMapper mapper = new ObjectMapper(); - - @BeforeClass - public static void before() { - // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer - // breaking changes in the latest Spring releases have not been supported in it. - // TODO: Update the check to verify any Spring version above 5.2 - assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); - } - - @Test - public void correctUser_springSecurityBasicAuth_requestSucceeds() throws JsonProcessingException { - String authValue = Base64.getMimeEncoder().encodeToString((TestSecurityConfig.USERNAME + ":" + TestSecurityConfig.PASSWORD).getBytes()); - AwsProxyRequest req = new AwsProxyRequestBuilder("/user", "GET") - .header(HttpHeaders.AUTHORIZATION, "Basic " + authValue).build(); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, TestSecurityConfig.USERNAME); - } - - @Test - public void wrongUser_springSecurityBasicAuth_requestRedirectsSuccessfully() throws JsonProcessingException { - String authValue = Base64.getMimeEncoder().encodeToString((TestSecurityConfig.NO_ADMIN_USERNAME + ":" + TestSecurityConfig.PASSWORD).getBytes()); - AwsProxyRequest req = new AwsProxyRequestBuilder("/user", "GET") - .header(HttpHeaders.AUTHORIZATION, "Basic " + authValue).build(); - AwsProxyResponse resp = handler.handleRequest(req, context); - assertNotNull(resp); - mapper.enable(SerializationFeature.INDENT_OUTPUT); - assertEquals(403, resp.getStatusCode()); - validateSingleValueModel(resp, TestController.ACCESS_DENIED); - } - - private void validateSingleValueModel(AwsProxyResponse output, String value) { - try { - SingleValueModel response = mapper.readValue(output.getBody(), SingleValueModel.class); - assertNotNull(response.getValue()); - assertEquals(value, response.getValue()); - } catch (IOException e) { - e.printStackTrace(); - fail("Exception while parsing response body: " + e.getMessage()); - } - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java deleted file mode 100644 index 2ae76a6c..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.embedded; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.boot.context.embedded.EmbeddedServletContainer; -import org.springframework.boot.context.embedded.EmbeddedServletContainerException; -import org.springframework.boot.web.servlet.ServletContextInitializer; -import org.springframework.core.SpringVersion; - -import javax.servlet.*; -import java.io.IOException; -import java.util.Objects; - -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; - -public class ServerlessServletEmbeddedServerFactoryTest { - - @BeforeClass - public static void before() { - // We skip the tests if we are running against Spring 5.2.x - SpringBoot 1.5 is deprecated and no longer - // breaking changes in the latest Spring releases have not been supported in it. - // TODO: Update the check to verify any Spring version above 5.2 - assumeFalse(Objects.requireNonNull(SpringVersion.getVersion()).startsWith("5.2")); - } - - // initialize a container handler to that the embedded factory can grab its instnace - private SpringBootLambdaContainerHandler h = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); - - public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { - } - - @Test - public void getContainer_populatesInitializers() { - ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); - TestServlet initializer = new TestServlet(false); - EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); - assertNotNull(((ServerlessServletEmbeddedServerFactory)container).getInitializers()); - assertEquals(1, ((ServerlessServletEmbeddedServerFactory)container).getInitializers().length); - assertEquals(initializer, ((ServerlessServletEmbeddedServerFactory)container).getInitializers()[0]); - container.stop(); // calling stop just once to get the test coverage since there's no code in it - } - - @Test - public void start_throwsException() { - ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); - TestServlet initializer = new TestServlet(true); - EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); - try { - container.start(); - } catch (EmbeddedServletContainerException e) { - assertTrue(ServletException.class.isAssignableFrom(e.getCause().getClass())); - assertEquals(TestServlet.EXCEPTION_MESSAGE, e.getCause().getMessage()); - return; - } - fail("Did not throw the expected exception"); - } - - @Test - public void start_withoutException_setsServletContext() { - ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); - TestServlet initializer = new TestServlet(false); - EmbeddedServletContainer container = factory.getEmbeddedServletContainer(initializer); - container.start(); - assertNotNull(initializer.getCtx()); - assertEquals(h.getServletContext(), initializer.getCtx()); - } - - public static class TestServlet implements Servlet, ServletContextInitializer { - private ServletContext ctx; - private boolean throwOnInit; - public static final String EXCEPTION_MESSAGE = "Throw on init"; - - public TestServlet(boolean throwOnInit) { - this.throwOnInit = throwOnInit; - } - - @Override - public void init(ServletConfig servletConfig) throws ServletException { - - } - - @Override - public ServletConfig getServletConfig() { - return null; - } - - @Override - public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - - } - - @Override - public String getServletInfo() { - return null; - } - - @Override - public void destroy() { - - } - - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - ctx = servletContext; - if (throwOnInit) { - throw new ServletException(EXCEPTION_MESSAGE); - } - } - - public ServletContext getCtx() { - return ctx; - } - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java deleted file mode 100644 index b5a7ea96..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/LambdaHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.sbsecurityapp; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - - -public class LambdaHandler - implements RequestHandler -{ - SpringBootLambdaContainerHandler handler; - boolean isinitialized = false; - - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) - { - if (!isinitialized) { - isinitialized = true; - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - return null; - } - } - AwsProxyResponse res = handler.proxy(awsProxyRequest, context); - return res; - } -} - diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java deleted file mode 100644 index 34be320f..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.sbsecurityapp; - - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; - - -@SpringBootApplication -@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.sbsecurityapp") -public class TestApplication extends SpringBootServletInitializer { -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java deleted file mode 100644 index 33be36f8..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.sbsecurityapp; - - -import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; -import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -import javax.servlet.http.HttpServletResponse; -import java.security.Principal; -import java.util.List; - - -@RestController -public class TestController { - public static final String ACCESS_DENIED = "AccessDenied"; - - @RequestMapping(path = "/user", method = { RequestMethod.GET }) - public SingleValueModel testGet() { - Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - SingleValueModel value = new SingleValueModel(); - - if (principal instanceof UserDetails) { - String username = ((UserDetails)principal).getUsername(); - value.setValue(username); - } else { - value.setValue(null); - } - return value; - } - - @RequestMapping(path = "/access-denied", method = { RequestMethod.GET }) - public SingleValueModel accessDenied() { - SingleValueModel model = new SingleValueModel(); - model.setValue(ACCESS_DENIED); - return model; - } - - -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java deleted file mode 100644 index b3ca81ea..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/sbsecurityapp/TestSecurityConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.sbsecurityapp; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - - -@Configuration -@EnableGlobalMethodSecurity(prePostEnabled = true) -@EnableWebSecurity -public class TestSecurityConfig extends WebSecurityConfigurerAdapter { - public static final String USERNAME = "test"; - public static final String NO_ADMIN_USERNAME = "test2"; - public static final String PASSWORD = "123"; - public static BCryptPasswordEncoder pEncoder = new BCryptPasswordEncoder(); - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication().withUser(USERNAME).password(pEncoder.encode(PASSWORD)).roles("ADMIN") - .and().withUser(NO_ADMIN_USERNAME).password(pEncoder.encode(PASSWORD)).roles("USER") - .and().passwordEncoder(pEncoder); - - } - - @Override - public void configure(WebSecurity web) throws Exception { - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable(); - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); - http.httpBasic(); - http - .authorizeRequests() - .antMatchers("/user").hasRole("ADMIN") - .and().exceptionHandling().accessDeniedPage("/access-denied"); - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java deleted file mode 100644 index aee0bd03..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/LambdaHandler.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootapp; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.springbootapp.TestApplication; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - - -public class LambdaHandler - implements RequestHandler -{ - SpringBootLambdaContainerHandler handler; - SpringBootLambdaContainerHandler httpApiHandler; - private String type; - - public LambdaHandler(String reqType) { - type = reqType; - switch (type) { - case "API_GW": - case "ALB": - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(TestApplication.class); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - break; - case "HTTP_API": - try { - httpApiHandler = SpringBootLambdaContainerHandler.getHttpApiV2ProxyHandler(TestApplication.class); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) - { - switch (type) { - case "API_GW": - return handler.proxy(awsProxyRequest.build(), context); - case "ALB": - return handler.proxy(awsProxyRequest.alb().build(), context); - case "HTTP_API": - return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); - default: - throw new RuntimeException("Unknown request type: " + type); - } - } -} - diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java deleted file mode 100644 index fda1f801..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootapp; - - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.PropertySource; - - -@SpringBootApplication -@ComponentScan(basePackages = "com.amazonaws.serverless.proxy.spring.springbootapp") -@PropertySource("classpath:boot-application.properties") -public class TestApplication extends SpringBootServletInitializer { -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java deleted file mode 100644 index 900ce50e..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootapp/TestController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootapp; - - -import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; - -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; -import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; - -import javax.servlet.http.HttpServletResponse; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -@RestController -@EnableWebSecurity -public class TestController extends WebSecurityConfigurerAdapter { - public static final String TEST_VALUE = "test"; - public static final String UTF8_TEST_STRING = "health心跳测试完成。可正常使用"; - public static final String CUSTOM_HEADER_NAME = "X-Custom-Header"; - public static final String CUSTOM_QS_NAME = "qs"; - - // workaround to address the most annoying issue in the world: https://blog.georgovassilis.com/2015/10/29/spring-mvc-rest-controller-says-406-when-emails-are-part-url-path/ - @Configuration - public static class CustomConfig extends WebMvcConfigurerAdapter { - @Override - public void configurePathMatch(PathMatchConfigurer configurer) { - configurer.setUseSuffixPatternMatch(false); - } - - @Override - public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { - configurer.favorPathExtension(false); - } - } - - @RequestMapping(path = "/test", method = { RequestMethod.GET }) - public SingleValueModel testGet() { - SingleValueModel value = new SingleValueModel(); - value.setValue(TEST_VALUE); - return value; - } - - @RequestMapping(path = "/missing-params", method = {RequestMethod.GET}) - public Map testInvalidParameters(@RequestHeader(CUSTOM_HEADER_NAME) String h1, @RequestParam(CUSTOM_QS_NAME) String qsValue) { - Map output = new HashMap<>(); - output.put("header", h1 == null); - output.put("queryString", qsValue == null); - return output; - } - - @RequestMapping(path = "/test/{domain}", method = { RequestMethod.GET}) - public SingleValueModel testDomainInPath(@PathVariable("domain") String domainName) { - SingleValueModel value = new SingleValueModel(); - value.setValue(domainName); - return value; - } - - @RequestMapping(path = "/test/query-string", method = { RequestMethod.GET }) - public SingleValueModel testQueryStringList(@RequestParam("list") List qsValues) { - assert qsValues != null; - SingleValueModel value = new SingleValueModel(); - value.setValue(qsValues.size() + ""); - return value; - } - - @RequestMapping(value="/test/utf8",method=RequestMethod.GET) - public Object testUtf8(String name, HttpServletResponse response){ - SingleValueModel model = new SingleValueModel(); - model.setValue(UTF8_TEST_STRING); - return model; - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.sessionManagement().disable(); - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java deleted file mode 100644 index 20dda417..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/MessageController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootslowapp; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class MessageController { - public static final String HELLO_MESSAGE = "Hello"; - - @RequestMapping(path="/hello", method= RequestMethod.GET) - public String hello() { - return HELLO_MESSAGE; - } -} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java deleted file mode 100644 index 157b6c43..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/SBLambdaHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootslowapp; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -import java.time.Instant; - - -public class SBLambdaHandler - implements RequestHandler -{ - SpringBootLambdaContainerHandler handler; - private long constructorTime; - - public SBLambdaHandler() throws ContainerInitializationException { - long startTime = Instant.now().toEpochMilli(); - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .asyncInit(Instant.now().toEpochMilli()) - .springBootApplication(TestApplication.class) - .buildAndInitialize(); - constructorTime = Instant.now().toEpochMilli() - startTime; - } - - public long getConstructorTime() { - return constructorTime; - } - - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) - { - return handler.proxy(awsProxyRequest, context); - } -} - diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java deleted file mode 100644 index 7e9dce5a..00000000 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springbootslowapp/TestApplication.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.springbootslowapp; - - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.stereotype.Component; - -// Need to explicitly exclude security because of some bizarre witchcraft inside SpringBoot that -// enables it even when I don't ask for it - this is only true when I test against spring-webmvc 4.3.x -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class -}) -@ComponentScan(basePackages="com.amazonaws.serverless.proxy.spring.springbootslowapp") -public class TestApplication extends SpringBootServletInitializer { - @Component - public static class SlowDownInit implements InitializingBean { - public static final int INIT_SLEEP_TIME_MS = 13_000; - - @Override - public void afterPropertiesSet() throws Exception { - Thread.sleep(INIT_SLEEP_TIME_MS); - } - } -} diff --git a/aws-serverless-springboot-archetype/pom.xml b/aws-serverless-springboot-archetype/pom.xml deleted file mode 100644 index 6a9727d7..00000000 --- a/aws-serverless-springboot-archetype/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - 4.0.0 - - - com.amazonaws.serverless - aws-serverless-java-container - 1.6-SNAPSHOT - - - com.amazonaws.serverless.archetypes - aws-serverless-springboot-archetype - 1.6-SNAPSHOT - maven-archetype - - - https://github.com/awslabs/aws-serverless-java-container.git - HEAD - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - - src/main/resources - true - - archetype-resources/pom.xml - archetype-resources/README.md - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.0.1 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - \ - - - - org.apache.maven.plugins - maven-archetype-plugin - 3.0.1 - - - - integration-test - - - - - - - - diff --git a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index 5379692b..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - src/main/java - - **/*.java - - - - src/main/resources - - **/*.properties - - - - src/test/java - - **/*.java - - - - src/assembly - - * - - - - - - template.yml - README.md - build.gradle - - - - \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md deleted file mode 100644 index 1dc39a0a..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/README.md +++ /dev/null @@ -1,99 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). - -The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. - -The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). - -#[[##]]# Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -#[[##]]# Building the project -You can use the SAM CLI to quickly build the project -```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false -$ cd \${artifactId} -$ sam build -Building resource '\${resourceName}Function' -Running JavaGradleWorkflow:GradleBuild -Running JavaGradleWorkflow:CopyArtifacts - -Build Succeeded - -Built Artifacts : .aws-sam/build -Built Template : .aws-sam/build/template.yaml - -Commands you can use next -========================= -[*] Invoke Function: sam local invoke -[*] Deploy: sam deploy --guided -``` - -#[[##]]# Testing locally with the SAM CLI - -From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. - -```bash -$ sam local start-api - -... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] -... -``` - -Using a new shell, you can send a test ping request to your API: - -```bash -$ curl -s http://127.0.0.1:3000/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` - -#[[##]]# Deploying to AWS -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... -------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------- -\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets -------------------------------------------------------------------------------------------------------------- -``` - -Copy the `OutputValue` into a browser or use curl to test your first request: - -```bash -$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle deleted file mode 100644 index 584c4102..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'java' - -repositories { - jcenter() - mavenLocal() - mavenCentral() -} - -dependencies { - implementation ( - 'org.springframework.boot:spring-boot-starter-web:1.5.22.RELEASE', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'io.symphonia:lambda-logging:1.0.1' - ) - - testImplementation("junit:junit:4.12") -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -build.dependsOn buildZip diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index f3a4a650..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,141 +0,0 @@ -#set($dollar = '$') - - - 4.0.0 - - \${groupId} - \${artifactId} - \${version} - jar - - Serverless Spring Boot API - https://github.com/awslabs/aws-serverless-java-container - - - org.springframework.boot - spring-boot-starter-parent - 1.5.22.RELEASE - - - - 1.8 - 1.8 - - - - - com.amazonaws.serverless - aws-serverless-java-container-spring - ${project.version} - - - - org.springframework.boot - spring-boot-starter-web - - - - junit - junit - 4.12 - test - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - default-jar - none - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.1.1 - - - copy-dependencies - package - - copy-dependencies - - - ${dollar}{project.build.directory}${dollar}{file.separator}lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - zip-assembly - package - - single - - - ${dollar}{project.artifactId}-${dollar}{project.version} - - src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml - - false - - - - - - - - - diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java deleted file mode 100644 index 0d25d61b..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/Application.java +++ /dev/null @@ -1,72 +0,0 @@ -#macro(loggingOff) - logging.level.root:OFF -#end -#set($logging = "#loggingOff()") -#set($logging = $logging.replaceAll("\n", "").trim()) -package ${groupId}; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import ${groupId}.controller.PingController; - - -@SpringBootApplication -// We use direct @Import instead of @ComponentScan to speed up cold starts -// @ComponentScan(basePackages = "${groupId}.controller") -@Import({ PingController.class }) -public class Application extends SpringBootServletInitializer { - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } - - /* - * optimization - avoids creating default exception resolvers; not required as the serverless container handles - * all exceptions - * - * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including - * an expensive ObjectMapper instance. - * - * To enable custom @ControllerAdvice classes remove this bean. - */ - @Bean - public HandlerExceptionResolver handlerExceptionResolver() { - return new HandlerExceptionResolver() { - - @Override - public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { - return null; - } - }; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java deleted file mode 100644 index e022540c..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java deleted file mode 100644 index 94f517f0..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java +++ /dev/null @@ -1,20 +0,0 @@ -package ${groupId}.controller; - - -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.util.HashMap; -import java.util.Map; - - -@RestController -@EnableWebMvc -public class PingController { - @RequestMapping(path = "/ping", method = RequestMethod.GET) - public Map ping() { - Map pong = new HashMap<>(); - pong.put("pong", "Hello, World!"); - return pong; - } -} diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties deleted file mode 100644 index ec1cb979..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Reduce logging level to make sure the application works with SAM local -# https://github.com/awslabs/aws-serverless-java-container/issues/134 -logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java deleted file mode 100644 index 3f232ebc..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import org.junit.BeforeClass; -import org.junit.Test; - -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.Assert.*; - - -public class StreamLambdaHandlerTest { - - private static StreamLambdaHandler handler; - private static Context lambdaContext; - - @BeforeClass - public static void setUp() { - handler = new StreamLambdaHandler(); - lambdaContext = new MockLambdaContext(); - } - - @Test - public void ping_streamRequest_respondsWithHello() { - InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); - - assertFalse(response.isBase64Encoded()); - - assertTrue(response.getBody().contains("pong")); - assertTrue(response.getBody().contains("Hello, World!")); - - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); - } - - @Test - public void invalidResource_streamRequest_responds404() { - InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); - } - - private void handle(InputStream is, ByteArrayOutputStream os) { - try { - handler.handleRequest(is, os, lambdaContext); - } catch (IOException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { - try { - return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { - e.printStackTrace(); - fail("Error while parsing response: " + e.getMessage()); - } - return null; - } -} diff --git a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml deleted file mode 100644 index 832028a2..00000000 --- a/aws-serverless-springboot-archetype/src/main/resources/archetype-resources/template.yml +++ /dev/null @@ -1,52 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -#macro(regionVar) - AWS::Region -#end -#set($awsRegion = "#regionVar()") -#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Spring Boot API - ${groupId}::${artifactId} -Globals: - Api: - EndpointConfiguration: REGIONAL - -Resources: - ${resourceName}Function: - Type: AWS::Serverless::Function - Properties: - Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java8 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Events: - ProxyResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - ${resourceName}Api: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' - Export: - Name: ${resourceName}Api diff --git a/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties deleted file mode 100644 index 7df3bf6e..00000000 --- a/aws-serverless-springboot-archetype/src/test/resources/projects/base/archetype.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=test.service -artifactId=springboot-archetype-test -version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt deleted file mode 100644 index 597acc76..00000000 --- a/aws-serverless-springboot-archetype/src/test/resources/projects/base/goal.txt +++ /dev/null @@ -1 +0,0 @@ -package \ No newline at end of file diff --git a/pom.xml b/pom.xml index 20c7cf9a..1ecd48c4 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,6 @@ aws-serverless-jersey-archetype aws-serverless-spark-archetype aws-serverless-spring-archetype - aws-serverless-springboot-archetype aws-serverless-springboot2-archetype From 593ae0d15a3c04b6c3a20dfaba94f0030e1abd82 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:16:53 +0200 Subject: [PATCH 0409/1214] Drop Spring Boot 1.x sample (#419) --- samples/springboot/pet-store/README.md | 36 ----- samples/springboot/pet-store/build.gradle | 28 ---- samples/springboot/pet-store/pom.xml | 124 ------------------ .../springboot/pet-store/src/assembly/bin.xml | 27 ---- .../sample/springboot/Application.java | 69 ---------- .../springboot/StreamLambdaHandler.java | 50 ------- .../springboot/controller/PetsController.java | 77 ----------- .../filter/CognitoIdentityFilter.java | 68 ---------- .../sample/springboot/model/Error.java | 29 ---- .../sample/springboot/model/Pet.java | 55 -------- .../sample/springboot/model/PetData.java | 117 ----------------- .../pet-store/src/main/resources/logback.xml | 5 - samples/springboot/pet-store/template.yml | 32 ----- 13 files changed, 717 deletions(-) delete mode 100644 samples/springboot/pet-store/README.md delete mode 100644 samples/springboot/pet-store/build.gradle delete mode 100644 samples/springboot/pet-store/pom.xml delete mode 100644 samples/springboot/pet-store/src/assembly/bin.xml delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java delete mode 100644 samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java delete mode 100644 samples/springboot/pet-store/src/main/resources/logback.xml delete mode 100644 samples/springboot/pet-store/template.yml diff --git a/samples/springboot/pet-store/README.md b/samples/springboot/pet-store/README.md deleted file mode 100644 index 4462f159..00000000 --- a/samples/springboot/pet-store/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Serverless Spring Boot example -A basic pet store written with the [Spring Boot framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ sam build -``` - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets ---------------------------------------------------------------------------------------------------------- - -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets -``` \ No newline at end of file diff --git a/samples/springboot/pet-store/build.gradle b/samples/springboot/pet-store/build.gradle deleted file mode 100644 index 4ac22f06..00000000 --- a/samples/springboot/pet-store/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -apply plugin: 'java' - -repositories { - jcenter() - mavenLocal() - mavenCentral() -} - -dependencies { - implementation ( - 'org.springframework.boot:spring-boot-starter-web:1.5.22.RELEASE', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'io.symphonia:lambda-logging:1.0.1' - ) - testImplementation("junit:junit") -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -build.dependsOn buildZip diff --git a/samples/springboot/pet-store/pom.xml b/samples/springboot/pet-store/pom.xml deleted file mode 100644 index 95170476..00000000 --- a/samples/springboot/pet-store/pom.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - serverless-spring-boot-example - 1.0-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-parent - 1.5.22.RELEASE - - - - 1.8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.amazonaws.serverless - aws-serverless-java-container-spring - [0.1,) - - - - - io.symphonia - lambda-logging - 1.0.1 - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.1.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - zip-assembly - package - - single - - - ${project.artifactId}-${project.version} - - src${file.separator}assembly${file.separator}bin.xml - - false - - - - - - - - - - diff --git a/samples/springboot/pet-store/src/assembly/bin.xml b/samples/springboot/pet-store/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/samples/springboot/pet-store/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java deleted file mode 100644 index 3019b05e..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/Application.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.amazonaws.serverless.sample.springboot; - -import com.amazonaws.serverless.sample.springboot.controller.PetsController; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - -@SpringBootApplication -@Import({ PetsController.class }) -public class Application extends SpringBootServletInitializer { - - // silence console logging - @Value("${logging.level.root:OFF}") - String message = ""; - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } - - /* - * optimization - avoids creating default exception resolvers; not required as the serverless container handles - * all exceptions - * - * By default, an ExceptionHandlerExceptionResolver is created which creates many dependent object, including - * an expensive ObjectMapper instance. - * - * To enable custom @ControllerAdvice classes remove this bean. - */ - @Bean - public HandlerExceptionResolver handlerExceptionResolver() { - return new HandlerExceptionResolver() { - - @Override - public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { - return null; - } - }; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java deleted file mode 100644 index 38e6dae8..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/StreamLambdaHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.amazonaws.serverless.sample.springboot; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.sample.springboot.filter.CognitoIdentityFilter; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.EnumSet; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - - // we use the onStartup method of the handler to register our custom filter - handler.onStartup(servletContext -> { - FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - }); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - public StreamLambdaHandler() { - // we enable the timer for debugging. This SHOULD NOT be enabled in production. - Timer.enable(); - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java deleted file mode 100644 index 2680d111..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/controller/PetsController.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot.controller; - - - -import com.amazonaws.serverless.sample.springboot.model.Pet; -import com.amazonaws.serverless.sample.springboot.model.PetData; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.security.Principal; -import java.util.Optional; -import java.util.UUID; - - -@RestController -@EnableWebMvc -public class PetsController { - @RequestMapping(path = "/pets", method = RequestMethod.POST) - public Pet createPet(@RequestBody Pet newPet) { - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) - public Pet listPets() { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - return newPet; - } - -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java deleted file mode 100644 index 025f565d..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.amazonaws.serverless.sample.springboot.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java deleted file mode 100644 index 74d7ecbf..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Error.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot.model; - -public class Error { - private String message; - - public Error(String errorMessage) { - message = errorMessage; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java deleted file mode 100644 index 1b07530c..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/Pet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot.model; - -import java.util.Date; - - -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java b/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java deleted file mode 100644 index 05026fd3..00000000 --- a/samples/springboot/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot/model/PetData.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot.model; - - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/springboot/pet-store/src/main/resources/logback.xml b/samples/springboot/pet-store/src/main/resources/logback.xml deleted file mode 100644 index 14a3a84f..00000000 --- a/samples/springboot/pet-store/src/main/resources/logback.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/samples/springboot/pet-store/template.yml b/samples/springboot/pet-store/template.yml deleted file mode 100644 index de08aa74..00000000 --- a/samples/springboot/pet-store/template.yml +++ /dev/null @@ -1,32 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with SpringBoot with the aws-serverless-java-container library - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.sample.springboot.StreamLambdaHandler::handleRequest - Runtime: java8 - CodeUri: . - MemorySize: 1512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 60 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - SpringBootPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: SpringBootPetStoreApi From 67b3bcb86187ac3d8b41610c729928f934190157 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:30:40 +0200 Subject: [PATCH 0410/1214] Remove special Spring Boot 1.x handling from GitHub CI build script (#419) --- gha_build.sh | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/gha_build.sh b/gha_build.sh index 9867bf50..1db7ffc7 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -85,27 +85,11 @@ function sample { # set up the master pom otherwise we won't be able to find new dependencies cd ${WORKING_DIR}/ && mvn -q --non-recursive clean install -case $1 in - # special case for spring since we include both spring and springboot 1.x in one package - spring) - install ${FRAMEWORK} ${EXTRA_PARAMS} - if [[ "$RUN_ARCHETYPE" = true ]] ; then - archetype ${FRAMEWORK} - archetype springboot - fi - if [[ "$RUN_SAMPLES" = true ]] ; then - sample ${FRAMEWORK} - sample springboot - fi - break - ;; - *) - install ${FRAMEWORK} ${EXTRA_PARAMS} - if [[ "$RUN_ARCHETYPE" = true ]] ; then - archetype ${FRAMEWORK} - fi - if [[ "$RUN_SAMPLES" = true ]] ; then - sample ${FRAMEWORK} - fi - ;; -esac \ No newline at end of file +install ${FRAMEWORK} ${EXTRA_PARAMS} +if [[ "$RUN_ARCHETYPE" = true ]] ; then + archetype ${FRAMEWORK} +fi +if [[ "$RUN_SAMPLES" = true ]] ; then + sample ${FRAMEWORK} +fi +;; \ No newline at end of file From 38c98d2ee6ba92188591593128a6b43ca5690898 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:31:37 +0200 Subject: [PATCH 0411/1214] Update hibernate-validator (CVE-2017-7536) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b5c553fa..370bfdd9 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -71,7 +71,7 @@ org.hibernate hibernate-validator - 5.4.2.Final + 5.4.3.Final test diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 15bd9f82..2a313a4c 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -156,7 +156,7 @@ org.hibernate hibernate-validator - 6.1.2.Final + 6.1.7.Final test diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 43a1f3e6..0f3f4c68 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -33,7 +33,7 @@ dependencies { implementation ('org.apache.struts:struts2-core:2.5.26') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.hibernate:hibernate-validator:5.3.6.Final') + implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.0') implementation ('org.apache.logging.log4j:log4j-core:2.14.1') implementation ('org.apache.logging.log4j:log4j-api:2.14.1') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index bdcbed59..3634cf8a 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -70,7 +70,7 @@ org.hibernate hibernate-validator - 5.3.6.Final + 5.4.3.Final diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 6c0c42a7..bfd3d805 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.struts:struts2-bean-validation-plugin:2.5.26', 'org.apache.struts:struts2-junit-plugin:2.5.26', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', - 'org.hibernate:hibernate-validator:5.3.6.Final', + 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index f31b39c4..68dbcc8f 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -81,7 +81,7 @@ org.hibernate hibernate-validator - 5.3.6.Final + 5.4.3.Final From 2aaa322a7def8ca4fe76eec6c95b79ffe6b9692b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:50:26 +0200 Subject: [PATCH 0412/1214] Remove special Spring Boot 1.x handling from GitHub CI build script (#419) --- gha_build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gha_build.sh b/gha_build.sh index 1db7ffc7..9d0001ca 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -91,5 +91,4 @@ if [[ "$RUN_ARCHETYPE" = true ]] ; then fi if [[ "$RUN_SAMPLES" = true ]] ; then sample ${FRAMEWORK} -fi -;; \ No newline at end of file +fi \ No newline at end of file From 750f819079f4ec10987f851b4f58845662ac6971 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 10:31:37 +0200 Subject: [PATCH 0413/1214] Update hibernate-validator (CVE-2017-7536) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 2294f8a5..bdd2b380 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -72,7 +72,7 @@ org.hibernate hibernate-validator - 5.4.2.Final + 5.4.3.Final test diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 15bd9f82..2a313a4c 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -156,7 +156,7 @@ org.hibernate hibernate-validator - 6.1.2.Final + 6.1.7.Final test diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 43a1f3e6..0f3f4c68 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -33,7 +33,7 @@ dependencies { implementation ('org.apache.struts:struts2-core:2.5.26') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.hibernate:hibernate-validator:5.3.6.Final') + implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.0') implementation ('org.apache.logging.log4j:log4j-core:2.14.1') implementation ('org.apache.logging.log4j:log4j-api:2.14.1') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index bdcbed59..3634cf8a 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -70,7 +70,7 @@ org.hibernate hibernate-validator - 5.3.6.Final + 5.4.3.Final diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 6c0c42a7..bfd3d805 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.struts:struts2-bean-validation-plugin:2.5.26', 'org.apache.struts:struts2-junit-plugin:2.5.26', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', - 'org.hibernate:hibernate-validator:5.3.6.Final', + 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index f31b39c4..68dbcc8f 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -81,7 +81,7 @@ org.hibernate hibernate-validator - 5.3.6.Final + 5.4.3.Final From 84d84e7fd6878d0fadcd452177d31d0fd9dd4ced Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 13:40:53 +0200 Subject: [PATCH 0414/1214] Use latest versions of Spring, Spring Security, Spring Boot and Micronaut --- .../continuous-integration-workflow.yml | 19 ++++++++++++------- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- .../pom.xml | 6 +++--- .../archetype-resources/build.gradle | 4 ++-- .../resources/archetype-resources/pom.xml | 2 +- .../archetype-resources/build.gradle | 2 +- .../resources/archetype-resources/pom.xml | 2 +- samples/micronaut/pet-store/build.gradle | 6 +++--- samples/micronaut/pet-store/gradle.properties | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 14 files changed, 32 insertions(+), 27 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index b5212b12..d02e4e30 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -53,11 +53,13 @@ jobs: # Spring core 5.2 and above. SpringBoot 1.5 is deprecated run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - name: Build Spring 4.3 - run: ./gha_build.sh spring false false -Dspring.version=4.3.29.RELEASE -Dspring-security.version=4.2.18.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=4.3.30.RELEASE -Dspring-security.version=4.2.20.RELEASE - name: Build Spring 5.0 - run: ./gha_build.sh spring false false -Dspring.version=5.0.19.RELEASE -Dspring-security.version=5.0.18.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE - name: Build Spring 5.1 - run: ./gha_build.sh spring false false -Dspring.version=5.1.18.RELEASE -Dspring-security.version=5.1.12.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE + - name: Build Spring 5.2 + run: ./gha_build.sh spring false false -Dspring.version=5.2.16.RELEASE -Dspring-security.version=5.2.11.RELEASE build_springboot2: name: Build and test SpringBoot 2 @@ -66,10 +68,13 @@ jobs: - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh springboot2 true true - - name: Build Spring Boot 2.0 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.0.9.RELEASE -Dspring.version=5.0.19.RELEASE -Dspringsecurity.version=5.0.18.RELEASE - - name: Build Spring Boot 2.1 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.1.17.RELEASE -Dspring.version=5.1.18.RELEASE -Dspringsecurity.version=5.1.12.RELEASE + # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions + - name: Build Spring Boot 2.2 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.12.RELEASE -Dspringsecurity.version=5.2.8.RELEASE + - name: Build Spring Boot 2.3 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9 + - name: Build Spring Boot 2.4 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.9 -Dspring.version=5.3.9 -Dspringsecurity.version=5.4.7 build_struts2: name: Build and test Struts 2 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 297af240..0af82a9c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -96,7 +96,7 @@ org.springframework.security spring-security-web - 5.2.11.RELEASE + 5.5.1 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 370bfdd9..84d33516 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.2.16.RELEASE - 5.2.11.RELEASE + 5.3.9 + 5.5.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 2a313a4c..aaa4ce4c 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.6-SNAPSHOT - 5.2.16.RELEASE - 2.2.13.RELEASE - 5.2.11.RELEASE + 5.3.9 + 2.5.3 + 5.5.1 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 9d382124..95be75c4 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.2.16.RELEASE', - 'org.springframework:spring-context:5.2.16.RELEASE', + 'org.springframework:spring-webmvc:5.3.9', + 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index d981ccad..db5b639e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.2.16.RELEASE + 5.3.9 4.12 2.14.1 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 4ef18a41..f6fa3332 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.2.6.RELEASE', + 'org.springframework.boot:spring-boot-starter-web:2.5.3', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index e2591648..5726d183 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.6.RELEASE + 2.5.3 diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle index 6282d2d2..688fb551 100644 --- a/samples/micronaut/pet-store/build.gradle +++ b/samples/micronaut/pet-store/build.gradle @@ -3,7 +3,7 @@ plugins { id "com.github.johnrengelman.shadow" version "5.0.0" id "application" id "net.ltgt.apt-eclipse" version "0.21" - id "org.springframework.boot" version "2.1.12.RELEASE" + id "org.springframework.boot" version "2.5.3" id "io.spring.dependency-management" version "1.0.6.RELEASE" } @@ -53,8 +53,8 @@ dependencies { // spring support implementation("org.springframework.boot:spring-boot-starter-web") - runtime("io.micronaut.spring:micronaut-spring-boot:1.0.1") - runtime("io.micronaut.spring:micronaut-spring-web:1.0.1") + runtime("io.micronaut.spring:micronaut-spring-boot:4.0.0-RC2") + runtime("io.micronaut.spring:micronaut-spring-web:4.0.0-RC2") } test.classpath += configurations.developmentOnly diff --git a/samples/micronaut/pet-store/gradle.properties b/samples/micronaut/pet-store/gradle.properties index 04c81860..9208dc28 100644 --- a/samples/micronaut/pet-store/gradle.properties +++ b/samples/micronaut/pet-store/gradle.properties @@ -1 +1 @@ -micronautVersion=1.2.3 \ No newline at end of file +micronautVersion=2.5.9 \ No newline at end of file diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 84363157..441d06fa 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.2.9.RELEASE', - 'org.springframework:spring-context:5.2.9.RELEASE', + 'org.springframework:spring-webmvc:5.3.9', + 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 0f538486..09d4d2ef 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.2.16.RELEASE + 5.3.9 4.13.1 2.14.1 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 1ad1ff44..8ea30058 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.2.6.RELEASE') { + implementation('org.springframework.boot:spring-boot-starter-web:2.5.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 0532ec63..32734e52 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.6.RELEASE + 2.5.3 From 4e1661f9a66b8845413da65319e62748ef869841 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 14:04:34 +0200 Subject: [PATCH 0415/1214] Update Jersey version in sample --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 3ca193b5..cd0be018 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.30.1 + 2.34 2.12.0 From be474417ca6d6cae0f1fd3e3ce1e6c34cd8605c3 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Tue, 28 Jul 2020 16:12:19 +0300 Subject: [PATCH 0416/1214] Move afterburner registration to dedicated method This makes it a lot easier for frameworks that want to use the module in GraalVM, to exclude Afterburner (which does not work in GraalVM native image because it generated classes at runtime) --- .../serverless/proxy/internal/LambdaContainerHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index d31ae257..e29b1072 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -81,9 +81,12 @@ public abstract class LambdaContainerHandler Date: Fri, 23 Jul 2021 14:11:00 +0200 Subject: [PATCH 0417/1214] Update aws-lambda-java-core version --- aws-serverless-java-container-core/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0af82a9c..84a9f779 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -25,7 +25,7 @@ com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index e51ef098..f911093d 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws:aws-lambda-java-core:1.2.0', + 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'io.symphonia:lambda-logging:1.0.1' diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 1805f913..0466a1a2 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws:aws-lambda-java-core:1.2.0', + 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'io.symphonia:lambda-logging:1.0.1' diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index cd0be018..3b476ef7 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -40,7 +40,7 @@ com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 09d4d2ef..a9f4ee88 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -41,7 +41,7 @@ com.amazonaws aws-lambda-java-core - 1.2.0 + 1.2.1 From 71a06b82c199fc080689a98d4e694762e5c4dfb2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 14:17:56 +0200 Subject: [PATCH 0418/1214] Update sparkjava version for samples and archetype --- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/spark/pet-store/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 9e3d10aa..b6c84290 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.sparkjava:spark-core:2.9.1', + 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'io.symphonia:lambda-logging:1.0.1' diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index d3191677..7ac497bd 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.sparkjava:spark-core:2.9.1', + 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.12.0', 'io.symphonia:lambda-logging:1.0.1' From 1a6a9c722b06edf91e423a2b59b10e6803585d32 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 14:21:27 +0200 Subject: [PATCH 0419/1214] Update Jackson databind version --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index f911093d..fd5a519c 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 0d1b86df..fd361bd7 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.34 - 2.12.0 + 2.12.4 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index b6c84290..945708e4 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 2a437624..3b331936 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.12.0 + 2.12.4 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 95be75c4..f50f2c6a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 0f3f4c68..e53e8116 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.0') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.4') implementation ('org.apache.logging.log4j:log4j-core:2.14.1') implementation ('org.apache.logging.log4j:log4j-api:2.14.1') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.14.1') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 3634cf8a..08690bac 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.26 - 2.12.0 + 2.12.4 4.13.1 2.14.1 diff --git a/pom.xml b/pom.xml index 1ecd48c4..d0dc9d32 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 5.3.2 - 2.12.0 + 2.12.4 1.7.30 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 0466a1a2..00dfa51d 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 3b476ef7..c8ab8b98 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.34 - 2.12.0 + 2.12.4 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 7ac497bd..f7da14e0 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'io.symphonia:lambda-logging:1.0.1' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 722c26ec..bb773153 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.12.0 + 2.12.4 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 441d06fa..3994b66d 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', ) } diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index bfd3d805..0229ddee 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.26', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', 'org.hibernate:hibernate-validator:5.4.3.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.12.0', + 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'org.apache.logging.log4j:log4j-core:2.14.1', 'org.apache.logging.log4j:log4j-api:2.14.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 68dbcc8f..9bf3449f 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.26 - 2.12.0 + 2.12.4 4.13.1 2.14.1 From 2eb20f72662e6a50cd7efd5e5b8e00634cad6456 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 14:39:13 +0200 Subject: [PATCH 0420/1214] remove log4j-to-slf4j (log4j-slf4j-impl is used) --- samples/struts2/pet-store/build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 0229ddee..a29ea35b 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -5,6 +5,12 @@ repositories { mavenCentral() } +configurations { + implementation { + exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' + } +} + dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', @@ -12,7 +18,7 @@ dependencies { 'org.apache.struts:struts2-rest-plugin:2.5.26', 'org.apache.struts:struts2-bean-validation-plugin:2.5.26', 'org.apache.struts:struts2-junit-plugin:2.5.26', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.2.0', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'org.apache.logging.log4j:log4j-core:2.14.1', From 496aae0ef286bc0417fb6784cad426021b81695c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 14:56:26 +0200 Subject: [PATCH 0421/1214] Update maven-shade-plugin version to fix "Cannot load implementation hint 'org.springframework.boot.maven.PropertiesMergingResourceTransformer': org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer: org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer" --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index fd361bd7..e72e1713 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -80,7 +80,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 3b331936..83069a1b 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index db5b639e..5a02b9a5 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -94,7 +94,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 package diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 5726d183..cbdb3b22 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -58,7 +58,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c8ab8b98..b65e0a49 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -98,7 +98,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index bb773153..c275d114 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -67,7 +67,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index a9f4ee88..63960011 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 package diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 32734e52..2eb9e0df 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -52,7 +52,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.3 + 3.2.4 false From 85dcf1d2f447cf203dfa01989b75f8d7cd0c4cf2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 15:31:42 +0200 Subject: [PATCH 0422/1214] use Spring 5.2.15 for Spring Boot 2.2 build (CVE-2021-22118) --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index d02e4e30..34666aca 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -70,7 +70,7 @@ jobs: run: ./gha_build.sh springboot2 true true # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions - name: Build Spring Boot 2.2 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.12.RELEASE -Dspringsecurity.version=5.2.8.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE - name: Build Spring Boot 2.3 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9 - name: Build Spring Boot 2.4 From a6f63e83e68940963756592ad5948a03c2376100 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 15:44:50 +0200 Subject: [PATCH 0423/1214] fix Spring Security version for Spring Boot 2.3 build --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 34666aca..c73f7741 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -72,7 +72,7 @@ jobs: - name: Build Spring Boot 2.2 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE - name: Build Spring Boot 2.3 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE - name: Build Spring Boot 2.4 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.9 -Dspring.version=5.3.9 -Dspringsecurity.version=5.4.7 From 1d57069e57c2e842dc067ef29dacb241ee8a9fa2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Jul 2021 15:48:19 +0200 Subject: [PATCH 0424/1214] Update Slf4J and Junit versions --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/pom.xml | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index fd5a519c..26cd8fe8 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { exclude group: 'javax.inject', module: "javax.inject" } - testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.13.2") } task buildZip(type: Zip) { diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 945708e4..53a5f5ee 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'io.symphonia:lambda-logging:1.0.1' ) - testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.13.2") } task buildZip(type: Zip) { diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index f50f2c6a..083e5aed 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -17,7 +17,7 @@ dependencies { 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', ) - testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.13.2") } task buildZip(type: Zip) { diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 5a02b9a5..ccb13a44 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 5.3.9 - 4.12 + 4.13.2 2.14.1 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index f6fa3332..1dea0ac4 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'io.symphonia:lambda-logging:1.0.1' ) - testImplementation("junit:junit:4.12") + testImplementation("junit:junit:4.13.2") } task buildZip(type: Zip) { diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index e53e8116..6afaed74 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -40,7 +40,7 @@ dependencies { implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.14.1') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.2.0') - testImplementation('junit:junit:4.12') + testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:2.5.26') { exclude group: 'org.apache.struts', module: 'struts2-core' } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 08690bac..c98f9475 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 2.5.26 2.12.4 - 4.13.1 + 4.13.2 2.14.1 diff --git a/pom.xml b/pom.xml index d0dc9d32..0deed60b 100644 --- a/pom.xml +++ b/pom.xml @@ -82,9 +82,9 @@ 0.7 - 5.3.2 + 6.2.2 2.12.4 - 1.7.30 + 1.7.32 UTF-8 @@ -93,7 +93,7 @@ junit junit - 4.13.1 + 4.13.2 test diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 63960011..4e745f58 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 5.3.9 - 4.13.1 + 4.13.2 2.14.1 diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 9bf3449f..8559e909 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 2.5.26 2.12.4 - 4.13.1 + 4.13.2 2.14.1 From ac986c0bffec5cdc1c19f28501446382cdb4e274 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sat, 24 Jul 2021 14:01:02 +0200 Subject: [PATCH 0425/1214] Fix minor adjustments and typos README.md and template.yml --- samples/struts2/pet-store/README.md | 23 +++++++++++++++++------ samples/struts2/pet-store/template.yml | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/samples/struts2/pet-store/README.md b/samples/struts2/pet-store/README.md index 89cc1676..80ad76b6 100644 --- a/samples/struts2/pet-store/README.md +++ b/samples/struts2/pet-store/README.md @@ -26,11 +26,22 @@ Once the deployment is completed, the SAM CLI will print out the stack's outputs ``` ... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets ---------------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Outputs +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Key Struts2PetStoreApi +Description URL for application +Value https://n60c1ycwa2.execute-api.eu-central-1.amazonaws.com/pets +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +``` +## Test -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +### JSON Request: +``` +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets.json +``` + +### XML Request +``` +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets.xml ``` \ No newline at end of file diff --git a/samples/struts2/pet-store/template.yml b/samples/struts2/pet-store/template.yml index 72128dd5..243b07a2 100644 --- a/samples/struts2/pet-store/template.yml +++ b/samples/struts2/pet-store/template.yml @@ -25,7 +25,7 @@ Resources: PayloadFormatVersion: '1.0' Outputs: - SpringPetStoreApi: + Struts2PetStoreApi: Description: URL for application Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: From d4b64d292a39dee7efb70c382776b7e68385e75c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Jul 2021 13:56:03 +0200 Subject: [PATCH 0426/1214] Revert version updates for Micronaut sample, more work to be done (see micronaut-sample-update branch) --- samples/micronaut/pet-store/build.gradle | 6 +++--- samples/micronaut/pet-store/gradle.properties | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle index 688fb551..6282d2d2 100644 --- a/samples/micronaut/pet-store/build.gradle +++ b/samples/micronaut/pet-store/build.gradle @@ -3,7 +3,7 @@ plugins { id "com.github.johnrengelman.shadow" version "5.0.0" id "application" id "net.ltgt.apt-eclipse" version "0.21" - id "org.springframework.boot" version "2.5.3" + id "org.springframework.boot" version "2.1.12.RELEASE" id "io.spring.dependency-management" version "1.0.6.RELEASE" } @@ -53,8 +53,8 @@ dependencies { // spring support implementation("org.springframework.boot:spring-boot-starter-web") - runtime("io.micronaut.spring:micronaut-spring-boot:4.0.0-RC2") - runtime("io.micronaut.spring:micronaut-spring-web:4.0.0-RC2") + runtime("io.micronaut.spring:micronaut-spring-boot:1.0.1") + runtime("io.micronaut.spring:micronaut-spring-web:1.0.1") } test.classpath += configurations.developmentOnly diff --git a/samples/micronaut/pet-store/gradle.properties b/samples/micronaut/pet-store/gradle.properties index 9208dc28..04c81860 100644 --- a/samples/micronaut/pet-store/gradle.properties +++ b/samples/micronaut/pet-store/gradle.properties @@ -1 +1 @@ -micronautVersion=2.5.9 \ No newline at end of file +micronautVersion=1.2.3 \ No newline at end of file From a27a160ff598a752818d8df6612708231b901eff Mon Sep 17 00:00:00 2001 From: Buliani Date: Tue, 27 Jul 2021 11:28:25 -0700 Subject: [PATCH 0427/1214] chore(deps): Bump in javadoc plugin version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0deed60b..2502db5c 100644 --- a/pom.xml +++ b/pom.xml @@ -163,7 +163,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.3.0 From ac47d7ff6caa01a4422c2e032915420e8fe750d2 Mon Sep 17 00:00:00 2001 From: Buliani Date: Tue, 27 Jul 2021 11:49:06 -0700 Subject: [PATCH 0428/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.6 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 84a9f779..37f52d7e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 32c2f47e..d81ae6ff 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.6 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 2cdfc2e5..38b39b21 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.6 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 84d33516..93b8fd65 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.6 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index aaa4ce4c..16d347bc 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.6-SNAPSHOT + 1.6 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 5.3.9 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.6 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e7ae1c10..73c2be3b 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6-SNAPSHOT + 1.6 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 93f18286..0b0ed652 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.6-SNAPSHOT + 1.6 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ccd50e99..a6cd5115 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.6-SNAPSHOT + 1.6 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e53803fc..dfff59eb 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.6-SNAPSHOT + 1.6 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 76a3c52d..e5cd32f4 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.6-SNAPSHOT + 1.6 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 1ac7fc09..dbecd3c3 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6-SNAPSHOT + 1.6 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.6-SNAPSHOT + 1.6 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 diff --git a/pom.xml b/pom.xml index 2502db5c..07e7de90 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.6-SNAPSHOT + 1.6 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -42,7 +42,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6 From 5fdf51095fb9cc7d4d5a890d6ee6f524c24274e4 Mon Sep 17 00:00:00 2001 From: Buliani Date: Tue, 27 Jul 2021 11:49:06 -0700 Subject: [PATCH 0429/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 37f52d7e..970b2c86 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d81ae6ff..7516a996 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6 + 1.7-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 38b39b21..5a93d024 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 93b8fd65..4fbb8e3e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 16d347bc..ad7934ca 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.6 + 1.7-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT 5.3.9 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 73c2be3b..fe9a8f2d 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6 + 1.7-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 0b0ed652..70d43010 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.6 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index a6cd5115..71695939 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.6 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index dfff59eb..7b36ba97 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.6 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index e5cd32f4..e88d6769 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.6 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index dbecd3c3..807c0414 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.6 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD diff --git a/pom.xml b/pom.xml index 07e7de90..0a82796b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.6 + 1.7-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -42,7 +42,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6 + HEAD From a72bad46a263d07d71fc2765be94899bfddbba11 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 28 Jul 2021 08:07:27 +0200 Subject: [PATCH 0430/1214] Removed link to Spring Boot 1.x wiki page --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index cad345f0..e9dad056 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) -* [Spring Boot quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot) * [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) From dff29b6215aa79798b83dd732016cf79e673c7a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 01:14:14 +0000 Subject: [PATCH 0431/1214] Bump log4j-api from 2.14.1 to 2.15.0 in /samples/struts2/pet-store Bumps log4j-api from 2.14.1 to 2.15.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 8559e909..a7b594f4 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.26 2.12.4 4.13.2 - 2.14.1 + 2.15.0 From f9ee1dd35b0c54c75cc184dd396a9e3fab650dc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 01:14:22 +0000 Subject: [PATCH 0432/1214] Bump log4j-api from 2.14.1 to 2.15.0 in /samples/spring/pet-store Bumps log4j-api from 2.14.1 to 2.15.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4e745f58..c19df853 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.9 4.13.2 - 2.14.1 + 2.15.0 From 074fa5b1e8d8a95f31bc4aa041a5d7a11558fb7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 01:46:28 +0000 Subject: [PATCH 0433/1214] Bump log4j-core from 2.14.1 to 2.15.0 in /samples/struts2/pet-store Bumps log4j-core from 2.14.1 to 2.15.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- samples/struts2/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 8559e909..a7b594f4 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.26 2.12.4 4.13.2 - 2.14.1 + 2.15.0 From 5cb4cd76d5479953287c135ce7badcae3f66f7a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Dec 2021 01:46:39 +0000 Subject: [PATCH 0434/1214] Bump log4j-core from 2.14.1 to 2.15.0 in /samples/spring/pet-store Bumps log4j-core from 2.14.1 to 2.15.0. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4e745f58..c19df853 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.9 4.13.2 - 2.14.1 + 2.15.0 From 8283d0d5b60f091c0a4a25fe5f40294f36f4b19e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 15 Dec 2021 12:58:51 +0100 Subject: [PATCH 0435/1214] Update Log4J dependency to 2.16.0 (CVE-2021-44228) --- .../src/main/resources/archetype-resources/build.gradle | 8 ++++---- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 8 ++++---- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- samples/spring/pet-store/build.gradle | 8 ++++---- samples/spring/pet-store/pom.xml | 4 ++-- samples/struts2/pet-store/build.gradle | 8 ++++---- samples/struts2/pet-store/pom.xml | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 083e5aed..92e0ce17 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,11 +10,11 @@ dependencies { 'org.springframework:spring-webmvc:5.3.9', 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.14.1', - 'org.apache.logging.log4j:log4j-api:2.14.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', + 'org.apache.logging.log4j:log4j-core:2.16.0', + 'org.apache.logging.log4j:log4j-api:2.16.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'com.amazonaws:aws-lambda-java-log4j2:1.1.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) testImplementation("junit:junit:4.13.2") diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index ccb13a44..cfd1220c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.3.9 4.13.2 - 2.14.1 + 2.16.0 @@ -74,7 +74,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.2.0 + 1.3.0 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 6afaed74..b5a36ae8 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,10 +35,10 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.4') - implementation ('org.apache.logging.log4j:log4j-core:2.14.1') - implementation ('org.apache.logging.log4j:log4j-api:2.14.1') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.14.1') - implementation ('com.amazonaws:aws-lambda-java-log4j2:1.2.0') + implementation ('org.apache.logging.log4j:log4j-core:2.16.0') + implementation ('org.apache.logging.log4j:log4j-api:2.16.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.16.0') + implementation ('com.amazonaws:aws-lambda-java-log4j2:1.3.0') testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:2.5.26') { diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index c98f9475..9c862788 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.26 2.12.4 4.13.2 - 2.14.1 + 2.16.0 @@ -110,7 +110,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.2.0 + 1.3.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 3994b66d..fa543cd7 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,11 +10,11 @@ dependencies { 'org.springframework:spring-webmvc:5.3.9', 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.14.1', - 'org.apache.logging.log4j:log4j-api:2.14.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', + 'org.apache.logging.log4j:log4j-core:2.16.0', + 'org.apache.logging.log4j:log4j-api:2.16.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index c19df853..26c99dad 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.9 4.13.2 - 2.15.0 + 2.16.0 @@ -90,7 +90,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.2.0 + 1.3.0 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index a29ea35b..e8f06ea4 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -21,10 +21,10 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'org.apache.logging.log4j:log4j-core:2.14.1', - 'org.apache.logging.log4j:log4j-api:2.14.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1', - 'com.amazonaws:aws-lambda-java-log4j2:1.2.0', + 'org.apache.logging.log4j:log4j-core:2.16.0', + 'org.apache.logging.log4j:log4j-api:2.16.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index a7b594f4..7dc5269f 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.26 2.12.4 4.13.2 - 2.15.0 + 2.16.0 @@ -121,7 +121,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.2.0 + 1.3.0 From 66e90a1f205fa45412604dc583aa89db67df4a93 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 15 Dec 2021 13:51:17 +0100 Subject: [PATCH 0436/1214] Explicitly set Log4J version for Struts2 as transitive dependency is outdated (CVE-2021-44228) --- aws-serverless-java-container-struts2/pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index fe9a8f2d..272379d7 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,6 +16,7 @@ 2.5.26 + 2.16.0 @@ -37,6 +38,18 @@ + + org.apache.logging.log4j + log4j-api + ${log4j.version} + runtime + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + runtime + org.apache.struts From 7f122e7f0f557a699d6b788567c2213596ee61e2 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 15 Dec 2021 08:53:09 -0800 Subject: [PATCH 0437/1214] [maven-release-plugin] prepare release aws-serverless-java-container-1.6.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 970b2c86..b2bbfac3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 7516a996..eba157f7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.6.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5a93d024..a42b7eb9 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.6.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4fbb8e3e..85acd16f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.6.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index ad7934ca..38b4d632 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.7-SNAPSHOT + 1.6.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 5.3.9 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.6.1 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 272379d7..470262be 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.6.1 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 70d43010..4542124a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.7-SNAPSHOT + 1.6.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 71695939..a6ae7ae9 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.7-SNAPSHOT + 1.6.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7b36ba97..e28518d9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.7-SNAPSHOT + 1.6.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index e88d6769..421bce87 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.7-SNAPSHOT + 1.6.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 807c0414..ad3ca496 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.6.1 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.7-SNAPSHOT + 1.6.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 diff --git a/pom.xml b/pom.xml index 0a82796b..27029eea 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.7-SNAPSHOT + 1.6.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -42,7 +42,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.6.1 From eddea6d6072a042616afcc96dcad2d767c218ee6 Mon Sep 17 00:00:00 2001 From: sapessi Date: Wed, 15 Dec 2021 08:53:09 -0800 Subject: [PATCH 0438/1214] [maven-release-plugin] prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b2bbfac3..970b2c86 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index eba157f7..7516a996 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6.1 + 1.7-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index a42b7eb9..5a93d024 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6.1 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 85acd16f..4fbb8e3e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6.1 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 38b4d632..ad7934ca 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.6.1 + 1.7-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT 5.3.9 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6.1 + 1.7-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 470262be..272379d7 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.6.1 + 1.7-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 4542124a..70d43010 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.6.1 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index a6ae7ae9..71695939 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.6.1 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e28518d9..7b36ba97 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.6.1 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 421bce87..e88d6769 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.6.1 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index ad3ca496..807c0414 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.6.1 + 1.7-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.6.1 + 1.7-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD diff --git a/pom.xml b/pom.xml index 27029eea..0a82796b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.6.1 + 1.7-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -42,7 +42,7 @@ https://github.com/awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git scm:git:git@github.com:awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.6.1 + HEAD From 1db559c51aef3fbb5237fba2ac2e69e00fb1f840 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 19 Dec 2021 19:52:03 +0100 Subject: [PATCH 0439/1214] Update Log4J dependency to 2.17.0 (CVE-2021-45105) --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 6 +++--- samples/struts2/pet-store/pom.xml | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 272379d7..4fe98922 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -16,7 +16,7 @@ 2.5.26 - 2.16.0 + 2.17.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 92e0ce17..c9caab5d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.9', 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.16.0', - 'org.apache.logging.log4j:log4j-api:2.16.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', + 'org.apache.logging.log4j:log4j-core:2.17.0', + 'org.apache.logging.log4j:log4j-api:2.17.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index cfd1220c..38df0ebe 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.3.9 4.13.2 - 2.16.0 + 2.17.0 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index b5a36ae8..f0462e0c 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,9 +35,9 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.4') - implementation ('org.apache.logging.log4j:log4j-core:2.16.0') - implementation ('org.apache.logging.log4j:log4j-api:2.16.0') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.16.0') + implementation ('org.apache.logging.log4j:log4j-core:2.17.0') + implementation ('org.apache.logging.log4j:log4j-api:2.17.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.3.0') testImplementation('junit:junit:4.13.2') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 9c862788..c5247a24 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.26 2.12.4 4.13.2 - 2.16.0 + 2.17.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index fa543cd7..e885ef5d 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.9', 'org.springframework:spring-context:5.3.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.16.0', - 'org.apache.logging.log4j:log4j-api:2.16.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', + 'org.apache.logging.log4j:log4j-core:2.17.0', + 'org.apache.logging.log4j:log4j-api:2.17.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 26c99dad..e6cc8492 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.9 4.13.2 - 2.16.0 + 2.17.0 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index e8f06ea4..77ea7419 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -21,9 +21,9 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'org.apache.logging.log4j:log4j-core:2.16.0', - 'org.apache.logging.log4j:log4j-api:2.16.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.16.0', + 'org.apache.logging.log4j:log4j-core:2.17.0', + 'org.apache.logging.log4j:log4j-api:2.17.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 7dc5269f..efff5582 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.26 2.12.4 4.13.2 - 2.16.0 + 2.17.0 From 1a41a69133eb326e33d52dfe809a975e0fe04428 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 27 Dec 2021 10:37:03 +0100 Subject: [PATCH 0440/1214] Update Struts2 dependency to 2.5.28.2 --- aws-serverless-java-container-struts2/pom.xml | 16 +--------------- .../resources/archetype-resources/build.gradle | 10 +++++----- .../main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 8 ++++---- samples/struts2/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 26 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 4fe98922..0454adb0 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,8 +15,7 @@ - 2.5.26 - 2.17.0 + 2.5.28.2 @@ -38,19 +37,6 @@ - - org.apache.logging.log4j - log4j-api - ${log4j.version} - runtime - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - runtime - - org.apache.struts struts2-json-plugin diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index f0462e0c..c943a909 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.26') { + implementation ('org.apache.struts:struts2-convention-plugin:2.5.28.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.26') { + implementation ('org.apache.struts:struts2-rest-plugin:2.5.28.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.26') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.28.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.26') { + implementation ('org.apache.struts:struts2-core:2.5.28.2') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') @@ -41,7 +41,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.3.0') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.26') { + testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index c5247a24..409b7628 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.26 + 2.5.28.2 2.12.4 4.13.2 2.17.0 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 77ea7419..9923630a 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.26', - 'org.apache.struts:struts2-rest-plugin:2.5.26', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.26', - 'org.apache.struts:struts2-junit-plugin:2.5.26', + 'org.apache.struts:struts2-convention-plugin:2.5.28.2', + 'org.apache.struts:struts2-rest-plugin:2.5.28.2', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.28.2', + 'org.apache.struts:struts2-junit-plugin:2.5.28.2', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.12.4', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index efff5582..0e36f5c8 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.26 + 2.5.28.2 2.12.4 4.13.2 2.17.0 From d3702dc6875afa0590e5274d8954ac2db4ff0b02 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 27 Dec 2021 10:58:19 +0100 Subject: [PATCH 0441/1214] Minor dependency updates (Jackson, Jersey, Jetty, aws-lambda-java-log4j2, --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spark/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 4 ++-- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 4 ++-- samples/struts2/pet-store/pom.xml | 4 ++-- 19 files changed, 29 insertions(+), 29 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 7516a996..1f279e1d 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.34 + 2.35 diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5a93d024..caf664e9 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -25,7 +25,7 @@ org.eclipse.jetty jetty-bom - 9.4.43.v20210629 + 9.4.44.v20210927 pom import diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 26cd8fe8..30346bb3 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,17 +9,17 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'io.symphonia:lambda-logging:1.0.1' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.34") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.34") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.35") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index e72e1713..91ea9cf9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,8 +14,8 @@ 1.8 1.8 - 2.34 - 2.12.4 + 2.35 + 2.13.1 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 53a5f5ee..fb54a385 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 83069a1b..a2a25c7f 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.12.4 + 2.13.1 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index c9caab5d..3b6135ba 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,8 +13,8 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.0', 'org.apache.logging.log4j:log4j-api:2.17.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) testImplementation("junit:junit:4.13.2") diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 38df0ebe..04981326 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -74,7 +74,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.3.0 + 1.5.0 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index c943a909..72e1548e 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,11 +34,11 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.4') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.1') implementation ('org.apache.logging.log4j:log4j-core:2.17.0') implementation ('org.apache.logging.log4j:log4j-api:2.17.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.0') - implementation ('com.amazonaws:aws-lambda-java-log4j2:1.3.0') + implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.0') testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.2') { diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 409b7628..6b36d0f2 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.28.2 - 2.12.4 + 2.13.1 4.13.2 2.17.0 @@ -110,7 +110,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.3.0 + 1.5.0 diff --git a/pom.xml b/pom.xml index 0a82796b..b8942389 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 6.2.2 - 2.12.4 + 2.13.1 1.7.32 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 00dfa51d..a2c1f576 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index b65e0a49..5cf04032 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,8 +26,8 @@ 1.8 1.8 - 2.34 - 2.12.4 + 2.35 + 2.13.1 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index f7da14e0..1554edf5 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'io.symphonia:lambda-logging:1.0.1' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index c275d114..82fb10d8 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.12.4 + 2.13.1 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index e885ef5d..a4c9852c 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,8 +13,8 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.0', 'org.apache.logging.log4j:log4j-api:2.17.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', - 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e6cc8492..d3a5b77b 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -90,7 +90,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.3.0 + 1.5.0 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 9923630a..943b3fb2 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -20,11 +20,11 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.28.2', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.12.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'org.apache.logging.log4j:log4j-core:2.17.0', 'org.apache.logging.log4j:log4j-api:2.17.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', - 'com.amazonaws:aws-lambda-java-log4j2:1.3.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 0e36f5c8..d5f281f6 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.28.2 - 2.12.4 + 2.13.1 4.13.2 2.17.0 @@ -121,7 +121,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.3.0 + 1.5.0 From 87858ab07eba4c4b830bcf3c41b4c130c3b9d669 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 27 Dec 2021 11:09:48 +0100 Subject: [PATCH 0442/1214] Update Spring dependencies (framework to 5.3.14, boot to 2.6.2, security to 5.6.1) --- .github/workflows/continuous-integration-workflow.yml | 6 ++++-- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 12 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c73f7741..dbfc7847 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -72,9 +72,11 @@ jobs: - name: Build Spring Boot 2.2 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE - name: Build Spring Boot 2.3 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.14.RELEASE - name: Build Spring Boot 2.4 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.9 -Dspring.version=5.3.9 -Dspringsecurity.version=5.4.7 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 + - name: Build Spring Boot 2.5 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.8 -Dspring.version=5.3.14 -Dspringsecurity.version=5.5.4 build_struts2: name: Build and test Struts 2 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 970b2c86..b59cd1e1 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -96,7 +96,7 @@ org.springframework.security spring-security-web - 5.5.1 + 5.6.1 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4fbb8e3e..ec4511ad 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.9 - 5.5.1 + 5.3.14 + 5.6.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index ad7934ca..29ceef11 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.7-SNAPSHOT - 5.3.9 - 2.5.3 - 5.5.1 + 5.3.14 + 2.6.2 + 5.6.1 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3b6135ba..8b1946ac 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.9', - 'org.springframework:spring-context:5.3.9', + 'org.springframework:spring-webmvc:5.3.14', + 'org.springframework:spring-context:5.3.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.0', 'org.apache.logging.log4j:log4j-api:2.17.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 04981326..d6fda730 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.9 + 5.3.14 4.13.2 2.17.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 1dea0ac4..e502ef03 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.5.3', + 'org.springframework.boot:spring-boot-starter-web:2.6.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.1' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index cbdb3b22..6234b9db 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.5.3 + 2.6.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index a4c9852c..f91a9163 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.9', - 'org.springframework:spring-context:5.3.9', + 'org.springframework:spring-webmvc:5.3.14', + 'org.springframework:spring-context:5.3.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.0', 'org.apache.logging.log4j:log4j-api:2.17.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index d3a5b77b..7456dbca 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.9 + 5.3.14 4.13.2 2.17.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 8ea30058..16a33bcc 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.5.3') { + implementation('org.springframework.boot:spring-boot-starter-web:2.6.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 2eb9e0df..45814208 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 2.5.3 + 2.6.2 From b3d3ad0b5c960509f3ae9f8316cfb0b87dadc41b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 27 Dec 2021 11:41:48 +0100 Subject: [PATCH 0443/1214] fix Spring Security version for Spring Boot 2.3 build --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index dbfc7847..dd7f5050 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -72,7 +72,7 @@ jobs: - name: Build Spring Boot 2.2 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE - name: Build Spring Boot 2.3 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.14.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE - name: Build Spring Boot 2.4 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 - name: Build Spring Boot 2.5 From 4f08c518c5022f474bc96c152491a586cea7fa01 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 29 Dec 2021 15:06:30 +0100 Subject: [PATCH 0444/1214] Update Log4J dependency to 2.17.1 (CVE-2021-44832) --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 6 +++--- samples/struts2/pet-store/pom.xml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 8b1946ac..647a06ce 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.14', 'org.springframework:spring-context:5.3.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.0', - 'org.apache.logging.log4j:log4j-api:2.17.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', + 'org.apache.logging.log4j:log4j-core:2.17.1', + 'org.apache.logging.log4j:log4j-api:2.17.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index d6fda730..7bf984f6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.3.14 4.13.2 - 2.17.0 + 2.17.1 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 72e1548e..1e969a00 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,9 +35,9 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.1') - implementation ('org.apache.logging.log4j:log4j-core:2.17.0') - implementation ('org.apache.logging.log4j:log4j-api:2.17.0') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.0') + implementation ('org.apache.logging.log4j:log4j-core:2.17.1') + implementation ('org.apache.logging.log4j:log4j-api:2.17.1') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.1') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.0') testImplementation('junit:junit:4.13.2') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 6b36d0f2..442f7bff 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.28.2 2.13.1 4.13.2 - 2.17.0 + 2.17.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index f91a9163..e2e66719 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.14', 'org.springframework:spring-context:5.3.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.0', - 'org.apache.logging.log4j:log4j-api:2.17.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', + 'org.apache.logging.log4j:log4j-core:2.17.1', + 'org.apache.logging.log4j:log4j-api:2.17.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 7456dbca..05fb63ac 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.14 4.13.2 - 2.17.0 + 2.17.1 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 943b3fb2..df617ff2 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -21,9 +21,9 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'org.apache.logging.log4j:log4j-core:2.17.0', - 'org.apache.logging.log4j:log4j-api:2.17.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.0', + 'org.apache.logging.log4j:log4j-core:2.17.1', + 'org.apache.logging.log4j:log4j-api:2.17.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index d5f281f6..e0f7079c 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.28.2 2.13.1 4.13.2 - 2.17.0 + 2.17.1 From 54497cf1dcb15daac6254ee329da3b92f7432546 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 29 Dec 2021 16:35:38 +0100 Subject: [PATCH 0445/1214] Add support for Lambda Authorizers in combination with Http API 2.0 payload format (#386) --- .../proxy/model/HttpApiV2AuthorizerMap.java | 21 ++++++- .../model/HttpApiV2ProxyRequestTest.java | 62 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java index e7017f60..4fff028c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java @@ -23,24 +23,35 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.fasterxml.jackson.databind.type.TypeFactory; import java.io.IOException; import java.util.HashMap; +import java.util.Map; @JsonSerialize(using = HttpApiV2AuthorizerMap.HttpApiV2AuthorizerSerializer.class) @JsonDeserialize(using = HttpApiV2AuthorizerMap.HttpApiV2AuthorizerDeserializer.class) public class HttpApiV2AuthorizerMap extends HashMap { private static final String JWT_KEY = "jwt"; + private static final String LAMBDA_KEY = "lambda"; private static final long serialVersionUID = 42L; public HttpApiV2JwtAuthorizer getJwtAuthorizer() { return (HttpApiV2JwtAuthorizer)get(JWT_KEY); } + public Map getLambdaAuthorizerContext() { + return (Map) get(LAMBDA_KEY); + } + public boolean isJwt() { return containsKey(JWT_KEY); } + public boolean isLambda() { + return containsKey(LAMBDA_KEY); + } + public void putJwtAuthorizer(HttpApiV2JwtAuthorizer jwt) { put(JWT_KEY, jwt); } @@ -56,10 +67,15 @@ public HttpApiV2AuthorizerDeserializer() { public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { HttpApiV2AuthorizerMap map = new HttpApiV2AuthorizerMap(); JsonNode node = jsonParser.getCodec().readTree(jsonParser); - if (node.get(JWT_KEY) != null) { + if (node.has(JWT_KEY)) { HttpApiV2JwtAuthorizer authorizer = LambdaContainerHandler.getObjectMapper().treeToValue(node.get(JWT_KEY), HttpApiV2JwtAuthorizer.class); map.putJwtAuthorizer(authorizer); } + if (node.has(LAMBDA_KEY)) { + Map context = LambdaContainerHandler.getObjectMapper().treeToValue(node.get(LAMBDA_KEY), + TypeFactory.defaultInstance().constructMapType(HashMap.class, String.class, Object.class)); + map.put(LAMBDA_KEY, context); + } // we ignore other, unknown values return map; } @@ -78,6 +94,9 @@ public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerat if (httpApiV2AuthorizerMap.isJwt()) { jsonGenerator.writeObjectField(JWT_KEY, httpApiV2AuthorizerMap.getJwtAuthorizer()); } + if (httpApiV2AuthorizerMap.isLambda()) { + jsonGenerator.writeObjectField(LAMBDA_KEY, httpApiV2AuthorizerMap.getLambdaAuthorizerContext()); + } jsonGenerator.writeEndObject(); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java index 42084330..c673a59e 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -83,6 +83,52 @@ public class HttpApiV2ProxyRequestTest { " \"isBase64Encoded\": true,\n" + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + " }\n"; + private static final String LAMBDA_AUTHORIZER = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [ \"cookie1\", \"cookie2\" ],\n" + + " \"headers\": {\n" + + " \"Header1\": \"value1\",\n" + + " \"Header2\": \"value2\"\n" + + " },\n" + + " \"queryStringParameters\": { \"parameter1\": \"value1,value2\", \"parameter2\": \"value\" },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authorizer\": { \"lambda\": {\n" + + " \"arrayKey\": [\n" + + " \"value1\",\n" + + " \"value2\"\n" + + " ],\n" + + " \"booleanKey\": true,\n" + + " \"mapKey\": {\n" + + " \"value1\": \"value2\"\n" + + " },\n" + + " \"numberKey\": 1,\n" + + " \"stringKey\": \"value\"\n" + + " }" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + + " }\n";; @Test public void deserialize_fromJsonString_authorizerPopulatedCorrectly() { @@ -102,6 +148,22 @@ public void deserialize_fromJsonString_authorizerEmptyMap() { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); assertNotNull(req.getRequestContext().getAuthorizer()); assertFalse(req.getRequestContext().getAuthorizer().isJwt()); + assertFalse(req.getRequestContext().getAuthorizer().isLambda()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while parsing request" + e.getMessage()); + } + } + + @Test + public void deserialize_fromJsonString_lambdaAuthorizer() { + try { + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(LAMBDA_AUTHORIZER, HttpApiV2ProxyRequest.class); + assertNotNull(req.getRequestContext().getAuthorizer()); + assertFalse(req.getRequestContext().getAuthorizer().isJwt()); + assertTrue(req.getRequestContext().getAuthorizer().isLambda()); + assertEquals(5, req.getRequestContext().getAuthorizer().getLambdaAuthorizerContext().size()); + assertEquals(1, req.getRequestContext().getAuthorizer().getLambdaAuthorizerContext().get("numberKey")); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); From 8382bcc084b00b47418119bd42e856455f391fc3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 30 Dec 2021 10:31:33 +0100 Subject: [PATCH 0446/1214] Change AwsHttpServletRequest constructor to protected to allow extension (#422) --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 6996b9b1..8ea22653 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -102,7 +102,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { * AWS Lambda * @param lambdaContext The Lambda function context. This object is used for utility methods such as log */ - AwsHttpServletRequest(Context lambdaContext) { + protected AwsHttpServletRequest(Context lambdaContext) { this.lambdaContext = lambdaContext; attributes = new HashMap<>(); setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.REQUEST); From b009775732cf042bde1f3e8cf98a08e537a2e369 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 09:15:09 +0100 Subject: [PATCH 0447/1214] Jersey startup time improvements (#366) --- .../src/main/java/StreamLambdaHandler.java | 12 ++++++++++-- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- .../sample/jersey/StreamLambdaHandler.java | 8 ++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index a79670b7..768a5ad9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -8,6 +8,7 @@ import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.server.ServerProperties; import java.io.IOException; import java.io.InputStream; @@ -18,8 +19,15 @@ public class StreamLambdaHandler implements RequestStreamHandler { private static final ResourceConfig jerseyApplication = new ResourceConfig() - .register(PingResource.class) - .register(JacksonFeature.class); + // properties to speed up Jersey start time + .property(ServerProperties.FEATURE_AUTO_DISCOVERY_DISABLE,true) + .property(ServerProperties.WADL_FEATURE_DISABLE,true) + .property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE,true) + .property(ServerProperties.BV_FEATURE_DISABLE,true) + .property(ServerProperties.JSON_PROCESSING_FEATURE_DISABLE,true) + .property(ServerProperties.MOXY_JSON_FEATURE_DISABLE,true) + .register(PingResource.class) + .register(JacksonFeature.class); private static final JerseyLambdaContainerHandler handler = JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication); diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index a2c1f576..f7da9f2e 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -13,13 +13,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.1' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.30.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.30.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.35") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 5cf04032..c3519980 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - [0.1,) + [1.0,) diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java index 20c6d534..9701a2c3 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/StreamLambdaHandler.java @@ -11,6 +11,7 @@ import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.server.ServerProperties; import java.io.IOException; import java.io.InputStream; @@ -19,6 +20,13 @@ public class StreamLambdaHandler implements RequestStreamHandler { private static final ResourceConfig jerseyApplication = new ResourceConfig() + // properties to speed up Jersey start time + .property(ServerProperties.FEATURE_AUTO_DISCOVERY_DISABLE,true) + .property(ServerProperties.WADL_FEATURE_DISABLE,true) + .property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE,true) + .property(ServerProperties.BV_FEATURE_DISABLE,true) + .property(ServerProperties.JSON_PROCESSING_FEATURE_DISABLE,true) + .property(ServerProperties.MOXY_JSON_FEATURE_DISABLE,true) .packages("com.amazonaws.serverless.sample.jersey") .register(JacksonFeature.class); private static final JerseyLambdaContainerHandler handler From 45169fb4f8e6329f658e060acd5246c95dd1c5ff Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 09:32:55 +0100 Subject: [PATCH 0448/1214] Update Struts2 dependency to 2.5.28.3 --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 8 ++++---- samples/struts2/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 0454adb0..e888540d 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.28.2 + 2.5.28.3 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 1e969a00..1edd92c3 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.28.2') { + implementation ('org.apache.struts:struts2-convention-plugin:2.5.28.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.28.2') { + implementation ('org.apache.struts:struts2-rest-plugin:2.5.28.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.28.2') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.28.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.28.2') { + implementation ('org.apache.struts:struts2-core:2.5.28.3') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') @@ -41,7 +41,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.0') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.2') { + testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 442f7bff..bbc66615 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.28.2 + 2.5.28.3 2.13.1 4.13.2 2.17.1 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index df617ff2..5532bd29 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.28.2', - 'org.apache.struts:struts2-rest-plugin:2.5.28.2', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.28.2', - 'org.apache.struts:struts2-junit-plugin:2.5.28.2', + 'org.apache.struts:struts2-convention-plugin:2.5.28.3', + 'org.apache.struts:struts2-rest-plugin:2.5.28.3', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.28.3', + 'org.apache.struts:struts2-junit-plugin:2.5.28.3', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index e0f7079c..294fc850 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.28.2 + 2.5.28.3 2.13.1 4.13.2 2.17.1 From 3ef1f63bddcf3d4f952833ceac678face2d67161 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 5 Jan 2022 09:40:21 +0100 Subject: [PATCH 0449/1214] minor javadoc fix --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 0eaf58f9..ce6bad7b 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -41,7 +41,7 @@ import java.util.concurrent.CountDownLatch; /** - * SpringBoot 1.x implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` + * SpringBoot implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. * From dbc58331a5b804d01e24b279b7f8d6f4676284cb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 6 Jan 2022 11:27:47 +0100 Subject: [PATCH 0450/1214] fix: Updated sample and archetype maven build files to avoid "The packaging for this project did not assign a file to the build artifact" message (#336)" This reverts commit 253910f3 --- .../resources/archetype-resources/pom.xml | 14 +++++-- .../resources/archetype-resources/pom.xml | 14 +++++-- .../resources/archetype-resources/pom.xml | 14 +++++-- .../resources/archetype-resources/pom.xml | 14 +++++-- .../resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 26 +++++++++++-- samples/spark/pet-store/pom.xml | 26 +++++++++++-- samples/spring/pet-store/pom.xml | 26 +++++++++++-- samples/springboot2/pet-store/pom.xml | 37 +++++++++++++++++-- samples/struts2/pet-store/pom.xml | 4 +- 10 files changed, 150 insertions(+), 27 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 91ea9cf9..cd2fab40 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.1.1 + 3.2.0 default-jar @@ -115,11 +115,19 @@ + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -137,7 +145,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index a2a25c7f..3f134aa7 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -97,7 +97,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.1.1 + 3.2.0 default-jar @@ -105,11 +105,19 @@ + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -127,7 +135,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 7bf984f6..12bf0690 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -133,7 +133,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.1.1 + 3.2.0 default-jar @@ -141,11 +141,19 @@ + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -163,7 +171,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 6234b9db..359eb62b 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -92,7 +92,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.1.1 + 3.2.0 default-jar @@ -100,11 +100,19 @@ + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -122,7 +130,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index bbc66615..95c49901 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -126,7 +126,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 src/main/assembly/dist.xml diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c3519980..71998d8a 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - [1.0,) + [1.6,) @@ -121,11 +121,31 @@ + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -143,7 +163,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 82fb10d8..c4685d2e 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-spark - [0.2,) + [1.6,) @@ -105,11 +105,31 @@ + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -127,7 +147,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 05fb63ac..dac58c27 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - [0.1,) + [1.6,) @@ -144,11 +144,31 @@ + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -166,7 +186,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 45814208..7565f7d3 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -6,6 +6,9 @@ com.amazonaws.serverless.sample serverless-springboot2-example 1.0-SNAPSHOT + Spring Boot example for the aws-serverless-java-container library + Simple pet store written with the Spring framework and Spring Boot + https://aws.amazon.com/lambda/ org.springframework.boot @@ -13,6 +16,14 @@ 2.6.2 + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + 1.8 1.8 @@ -33,7 +44,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot2 - [1.4,) + [1.6,) @@ -82,11 +93,31 @@ + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.2.0 copy-dependencies @@ -104,7 +135,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 zip-assembly diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 294fc850..457f0833 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -36,7 +36,7 @@ com.amazonaws.serverless aws-serverless-java-container-struts2 - [0.1,) + [1.6,) @@ -145,7 +145,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.1.0 + 3.3.0 src/main/assembly/dist.xml From 7722fe3516e2d9a211238a3464a3923b065629c2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 6 Jan 2022 13:34:00 +0100 Subject: [PATCH 0451/1214] chore(deps): Update lambda-logging version to 1.0.3 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 30346bb3..fab27db5 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,7 +10,7 @@ dependencies { 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index fb54a385..143fd9dd 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,7 +10,7 @@ dependencies { 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit:4.13.2") diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index e502ef03..4ef94378 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation ( 'org.springframework.boot:spring-boot-starter-web:2.6.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit:4.13.2") diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index f7da9f2e..fa04aadc 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -10,7 +10,7 @@ dependencies { 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 1554edf5..d07a6733 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -10,7 +10,7 @@ dependencies { 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index c4685d2e..aa03786a 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -55,7 +55,7 @@ io.symphonia lambda-logging - 1.0.1 + 1.0.3 diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 7565f7d3..6ff84ce5 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -51,7 +51,7 @@ io.symphonia lambda-logging - 1.0.1 + 1.0.3 From e24c9160145ed672a2b23c3fd1bd967cd6b18ef6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 7 Jan 2022 09:15:13 +0100 Subject: [PATCH 0452/1214] chore(deps): Update aws-lambda-java-log4j2 version to 1.5.1 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 647a06ce..9555f73c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.logging.log4j:log4j-api:2.17.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) testImplementation("junit:junit:4.13.2") diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 12bf0690..ce0553de 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -74,7 +74,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.5.0 + 1.5.1 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 1edd92c3..dff76649 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -38,7 +38,7 @@ dependencies { implementation ('org.apache.logging.log4j:log4j-core:2.17.1') implementation ('org.apache.logging.log4j:log4j-api:2.17.1') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.1') - implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.0') + implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.3') { diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 95c49901..d8b58a89 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -110,7 +110,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.5.0 + 1.5.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index e2e66719..123cf4db 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -14,7 +14,7 @@ dependencies { 'org.apache.logging.log4j:log4j-api:2.17.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index dac58c27..693d9642 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -90,7 +90,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.5.0 + 1.5.1 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 5532bd29..f480ee3e 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -24,7 +24,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.1', 'org.apache.logging.log4j:log4j-api:2.17.1', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', - 'com.amazonaws:aws-lambda-java-log4j2:1.5.0', + 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 457f0833..1d646bff 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -121,7 +121,7 @@ com.amazonaws aws-lambda-java-log4j2 - 1.5.0 + 1.5.1 From 108e8dc06a10088abadd61d409f147963f4d362e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 7 Jan 2022 10:37:09 +0100 Subject: [PATCH 0453/1214] chore(deps): Updates to test/ optional dependencies --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 12 ++++++------ aws-serverless-java-container-springboot2/pom.xml | 10 +++++----- aws-serverless-java-container-struts2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 13 +++++++++++++ 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b59cd1e1..0a8aa636 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -88,7 +88,7 @@ org.apache.httpcomponents httpcore - 4.4.14 + 4.4.15 compile true diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ec4511ad..1579f1b0 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -48,7 +48,7 @@ commons-codec commons-codec - 1.10 + 1.15 test @@ -69,23 +69,23 @@ - org.hibernate + org.hibernate.validator hibernate-validator - 5.4.3.Final + 6.2.1.Final test javax.el javax.el-api - 2.2.4 + 3.0.0 test - org.glassfish.web + org.glassfish javax.el - 2.2.4 + 3.0.0 test diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 29ceef11..6595ab8d 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -148,15 +148,15 @@ test - javax.validation - validation-api - 2.0.1.Final + jakarta.validation + jakarta.validation-api + 2.0.2 test - org.hibernate + org.hibernate.validator hibernate-validator - 6.1.7.Final + 6.2.1.Final test diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index e888540d..6c38466c 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -55,7 +55,7 @@ commons-codec commons-codec - 1.10 + 1.15 test @@ -68,7 +68,7 @@ javax.el javax.el-api - 2.2.4 + 2.2.5 test @@ -82,7 +82,7 @@ org.glassfish.web javax.el - 2.2.4 + 2.2.6 test diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index d8b58a89..481a135c 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -113,6 +113,19 @@ 1.5.1 + + javax.el + javax.el-api + 2.2.5 + test + + + org.glassfish.web + javax.el + 2.2.6 + test + + junit junit From 18aa8a97f9a347f7a904e0b1afdb5aa5ffd7f25b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 7 Jan 2022 10:47:47 +0100 Subject: [PATCH 0454/1214] chore(deps): Remove unused jetbrain annotations dependency --- aws-serverless-java-container-springboot2/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 6595ab8d..4dde4a58 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -159,12 +159,6 @@ 6.2.1.Final test - - org.jetbrains - annotations - 17.0.0 - compile - javax.activation From fee7a6da206cdd9adbc1b5db1db79d443828b66e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 7 Jan 2022 10:53:39 +0100 Subject: [PATCH 0455/1214] fix: asyncInit() code sample (#391) --- .../src/main/java/StreamLambdaHandler.java | 5 ++--- .../serverless/sample/springboot2/StreamLambdaHandler.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index ba15c6d6..dca9650d 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -19,10 +19,9 @@ public class StreamLambdaHandler implements RequestStreamHandler { try { handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); // For applications that take longer than 10 seconds to start, use the async builder: - // long startTime = Instant.now().toEpochMilli(); - // handler = new SpringBootProxyHandlerBuilder() + // handler = new SpringBootProxyHandlerBuilder() // .defaultProxy() - // .asyncInit(startTime) + // .asyncInit() // .springBootApplication(Application.class) // .buildAndInitialize(); } catch (ContainerInitializationException e) { diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java index 0b7cf554..01ea9663 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java @@ -26,10 +26,9 @@ public class StreamLambdaHandler implements RequestStreamHandler { handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); // For applications that take longer than 10 seconds to start, use the async builder: - // long startTime = Instant.now().toEpochMilli(); - // handler = new SpringBootProxyHandlerBuilder() + // handler = new SpringBootProxyHandlerBuilder() // .defaultProxy() - // .asyncInit(startTime) + // .asyncInit() // .springBootApplication(Application.class) // .buildAndInitialize(); From 0c890e32df88db015a91bfdaf8f922a63d066494 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 11:48:29 +0100 Subject: [PATCH 0456/1214] Empty form params should not be omitted (#340) --- .../internal/servlet/AwsHttpServletRequest.java | 6 ++++-- .../AwsProxyHttpServletRequestFormTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 8ea22653..61d97bfe 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -496,14 +496,16 @@ protected Map> getFormUrlEncodedParametersMap() { urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR); - if (parameterKeyValue.length < 2) { + if (parameterKeyValue.length < 1) { continue; } List values = new ArrayList<>(); if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) { values = urlEncodedFormParameters.get(parameterKeyValue[0]); } - values.add(decodeValueIfEncoded(parameterKeyValue[1])); + if (parameterKeyValue.length > 1) { + values.add(decodeValueIfEncoded(parameterKeyValue[1])); + } urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values); } Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index b20982b7..073f0dc8 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -123,4 +123,21 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { assertEquals(2, params.size()); assertEquals(true, params.containsKey(PART_KEY_1)); } + + /** + * issue #340 + */ + @Test + public void postForm_emptyParamPresent() { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); + String body = PART_KEY_1 + "=" + "&" + PART_KEY_2 + "=" + PART_VALUE_2; + proxyRequest.setBody(body); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + Map params = request.getParameterMap(); + assertNotNull(params); + assertEquals(2, params.size()); + assertEquals(true, params.containsKey(PART_KEY_1)); + } } From cab58173de425f6eae99f4cf61ced0cee744f7c7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 12:00:42 +0100 Subject: [PATCH 0457/1214] use assertTrue for boolean checks --- .../internal/servlet/AwsProxyHttpServletRequestFormTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 073f0dc8..7663937b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -121,7 +122,7 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { Map params = request.getParameterMap(); assertNotNull(params); assertEquals(2, params.size()); - assertEquals(true, params.containsKey(PART_KEY_1)); + assertTrue(params.containsKey(PART_KEY_1)); } /** @@ -138,6 +139,6 @@ public void postForm_emptyParamPresent() { Map params = request.getParameterMap(); assertNotNull(params); assertEquals(2, params.size()); - assertEquals(true, params.containsKey(PART_KEY_1)); + assertTrue(params.containsKey(PART_KEY_1)); } } From 0288c488b61c44e9a26a650d887fcecb980075a1 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 13:59:47 +0100 Subject: [PATCH 0458/1214] form param names must be included in getParameterNames() (#340) --- .../internal/servlet/AwsProxyHttpServletRequest.java | 10 +++++++--- .../servlet/AwsProxyHttpServletRequestFormTest.java | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 97ae055b..eecda99c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -45,6 +45,9 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** @@ -360,11 +363,12 @@ public String getParameter(String s) { @Override public Enumeration getParameterNames() { + Set formParameterNames = getFormUrlEncodedParametersMap().keySet(); if (request.getMultiValueQueryStringParameters() == null) { - return Collections.emptyEnumeration(); + return Collections.enumeration(formParameterNames); } - - return Collections.enumeration(request.getMultiValueQueryStringParameters().keySet()); + return Collections.enumeration(Stream.concat(formParameterNames.stream(), + request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet())); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 7663937b..838ea660 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Base64; +import java.util.Collections; import java.util.Map; import java.util.Random; @@ -123,6 +124,7 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { assertNotNull(params); assertEquals(2, params.size()); assertTrue(params.containsKey(PART_KEY_1)); + assertEquals(2, Collections.list(request.getParameterNames()).size()); } /** @@ -140,5 +142,6 @@ public void postForm_emptyParamPresent() { assertNotNull(params); assertEquals(2, params.size()); assertTrue(params.containsKey(PART_KEY_1)); + assertEquals(2, Collections.list(request.getParameterNames()).size()); } } From 3b5f1f021dc102678e2fb4da24c798b13b2457dd Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 19 Jan 2022 11:14:59 +0100 Subject: [PATCH 0459/1214] chore(deps): Update SLF4J version to 1.7.33 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b8942389..44bb1336 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ 0.7 6.2.2 2.13.1 - 1.7.32 + 1.7.33 UTF-8 From 92ad7386daae797a4b808c9173e549087d5c9fb1 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 14 Feb 2022 12:47:48 +0100 Subject: [PATCH 0460/1214] fix: getServletContextName() must not throw UnsupportedOperationException (#448) --- .../serverless/proxy/internal/servlet/AwsServletContext.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index cf2e3920..864a9bf1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -310,8 +310,7 @@ public void removeAttribute(String s) { @Override public String getServletContextName() { - // TODO: This can also come from a reader interface - throw new UnsupportedOperationException(); + return null; } From 7b5a66b6451a1b615ae1b62c30b8744e697184ff Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Feb 2022 19:58:32 +0100 Subject: [PATCH 0461/1214] chore(deps): Update SLF4J version to 1.7.36 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 44bb1336..84e86d7d 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ 0.7 6.2.2 2.13.1 - 1.7.33 + 1.7.36 UTF-8 From 0a55c8aae69ba12f5baff857d01a485d71151ddb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Feb 2022 21:12:39 +0100 Subject: [PATCH 0462/1214] chore(deps): Update Spring dependencies (framework to 5.3.15, boot to 2.6.3) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1579f1b0..9f2a4bc0 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 5.3.14 + 5.3.15 5.6.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 4dde4a58..80ffd84d 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,8 +15,8 @@ 1.7-SNAPSHOT - 5.3.14 - 2.6.2 + 5.3.15 + 2.6.3 5.6.1 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 9555f73c..3edfb685 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.14', - 'org.springframework:spring-context:5.3.14', + 'org.springframework:spring-webmvc:5.3.15', + 'org.springframework:spring-context:5.3.15', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.1', 'org.apache.logging.log4j:log4j-api:2.17.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index ce0553de..0ac77021 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.14 + 5.3.15 4.13.2 2.17.1 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 4ef94378..dde89ac5 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.2', + 'org.springframework.boot:spring-boot-starter-web:2.6.3', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 359eb62b..c798b2c9 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.2 + 2.6.3 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 123cf4db..95cc4d90 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.14', - 'org.springframework:spring-context:5.3.14', + 'org.springframework:spring-webmvc:5.3.15', + 'org.springframework:spring-context:5.3.15', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.1', 'org.apache.logging.log4j:log4j-api:2.17.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 693d9642..39f3d37a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.14 + 5.3.15 4.13.2 2.17.1 diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 6ff84ce5..c81e1e0c 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.2 + 2.6.3 From 4392c33751b956a398e2e664cde2c319764c77af Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Feb 2022 21:16:52 +0100 Subject: [PATCH 0463/1214] chore(deps): Update Jetty dependency --- aws-serverless-java-container-spark/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index caf664e9..5211650f 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -25,7 +25,7 @@ org.eclipse.jetty jetty-bom - 9.4.44.v20210927 + 9.4.45.v20220203 pom import From 85bcf3db7118d47d20275b5d1bc4d92f5fc81c2f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Feb 2022 21:24:20 +0100 Subject: [PATCH 0464/1214] chore(deps): Update Struts2 dependency to 2.5.29 --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 8 ++++---- samples/struts2/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 6c38466c..c383578a 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.28.3 + 2.5.29 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index dff76649..0c752a40 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.28.3') { + implementation ('org.apache.struts:struts2-convention-plugin:2.5.29') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.28.3') { + implementation ('org.apache.struts:struts2-rest-plugin:2.5.29') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.28.3') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.29') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.28.3') { + implementation ('org.apache.struts:struts2-core:2.5.29') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') @@ -41,7 +41,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.28.3') { + testImplementation('org.apache.struts:struts2-junit-plugin:2.5.29') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 481a135c..e387c47c 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.28.3 + 2.5.29 2.13.1 4.13.2 2.17.1 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index f480ee3e..51da7fef 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.28.3', - 'org.apache.struts:struts2-rest-plugin:2.5.28.3', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.28.3', - 'org.apache.struts:struts2-junit-plugin:2.5.28.3', + 'org.apache.struts:struts2-convention-plugin:2.5.29', + 'org.apache.struts:struts2-rest-plugin:2.5.29', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.29', + 'org.apache.struts:struts2-junit-plugin:2.5.29', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 1d646bff..2bbdd429 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.28.3 + 2.5.29 2.13.1 4.13.2 2.17.1 From 9af380bef32e5412aa69d6674387e85a908aca9e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 10:22:19 +0100 Subject: [PATCH 0465/1214] Create GitHub action to automate releases --- .github/workflows/release.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..e887deee --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,33 @@ +name: Publish package to the Maven Central Repository +on: + workflow_dispatch: + inputs: + releaseVersion: + description: "Version to use for the release." + required: true + default: "X.Y.Z" + developmentVersion: + description: "Version to use for further development" + required: true + default: "X.Y.Z-SNAPSHOT" +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Maven + uses: actions/setup-java@v2 + with: + distribution: 'temurin' # Corretto isn't supported right now https://github.com/actions/setup-java/issues/68 + java-version: 8 + server-id: sonatype-nexus-staging + server-username: MAVEN_USERNAME + server-password: MAVEN_PASSWORD + gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} # Value of the GPG private key to import + gpg-passphrase: GPG_PASSPHRASE # env variable for GPG private key passphrase + - name: Release and publish package + run: mvn release:prepare release:perform -B -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} + env: + MAVEN_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} From b028c0f19af1a6ea691e634714a92f6b81794878 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 10:58:57 +0100 Subject: [PATCH 0466/1214] chore: release automation - configure Git user --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e887deee..57fd9681 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Configure Git User # may be removed after https://github.com/actions/checkout/issues/13 is resolved + run: | + git config user.email "${{ github.actor }}@users.noreply.github.com" + git config user.name "${{ github.actor }}" - name: Set up Maven uses: actions/setup-java@v2 with: From e82eb908a058949526c32c4a0ff898fcf85d6e22 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 11:12:06 +0100 Subject: [PATCH 0467/1214] chore: release automation - update maven-gpg-plugin to fix gpg: signing failed: Inappropriate ioctl for device --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84e86d7d..bd732025 100644 --- a/pom.xml +++ b/pom.xml @@ -193,7 +193,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.6 + 3.0.1 sign-artifacts From 158fe6e0a996c81368bc537773e1ac4ac4e0b4a7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 11:42:03 +0100 Subject: [PATCH 0468/1214] chore: release automation - maven-release-plugin config --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd732025..cb266b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -171,8 +171,8 @@ maven-release-plugin clean verify install - false true + chore: release From 91129910273e483f8ce3c27ac3aa7882b8f1e057 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 12:06:07 +0100 Subject: [PATCH 0469/1214] chore: release automation - use https instead of ssh connection --- aws-serverless-jersey-archetype/pom.xml | 3 +-- aws-serverless-spark-archetype/pom.xml | 3 +-- aws-serverless-spring-archetype/pom.xml | 3 +-- aws-serverless-springboot2-archetype/pom.xml | 3 +-- aws-serverless-struts2-archetype/pom.xml | 3 +-- pom.xml | 8 +++----- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 70d43010..c9420435 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -14,8 +14,7 @@ https://github.com/awslabs/aws-serverless-java-container.git - HEAD - + diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 71695939..9e46e7ab 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -14,8 +14,7 @@ https://github.com/awslabs/aws-serverless-java-container.git - HEAD - + diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7b36ba97..cc3119e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -14,8 +14,7 @@ https://github.com/awslabs/aws-serverless-java-container.git - HEAD - + diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index e88d6769..bda5c41c 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -14,8 +14,7 @@ https://github.com/awslabs/aws-serverless-java-container.git - HEAD - + diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 807c0414..4086e992 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -14,8 +14,7 @@ https://github.com/awslabs/aws-serverless-java-container.git - HEAD - + diff --git a/pom.xml b/pom.xml index cb266b8e..a7c92ae5 100644 --- a/pom.xml +++ b/pom.xml @@ -39,11 +39,9 @@ - https://github.com/awslabs/aws-serverless-java-container.git - scm:git:git@github.com:awslabs/aws-serverless-java-container.git - scm:git:git@github.com:awslabs/aws-serverless-java-container.git - HEAD - + https://github.com/awslabs/aws-serverless-java-container + https://github.com/awslabs/aws-serverless-java-container.git + From 9fd23c6c747846bb4b7a400bf8960c04a35acd4b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 12:09:32 +0100 Subject: [PATCH 0470/1214] chore: release automation - use https instead of ssh connection --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a7c92ae5..3e91563b 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ https://github.com/awslabs/aws-serverless-java-container - https://github.com/awslabs/aws-serverless-java-container.git + scm:git:https://github.com/awslabs/aws-serverless-java-container.git From c857510e0fe4a7e9ad3d50b143ef5145bb6361c8 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 16 Feb 2022 11:17:43 +0000 Subject: [PATCH 0471/1214] chore: releaseprepare release aws-serverless-java-container-1.7 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 7 ++++--- aws-serverless-spark-archetype/pom.xml | 7 ++++--- aws-serverless-spring-archetype/pom.xml | 7 ++++--- aws-serverless-springboot2-archetype/pom.xml | 7 ++++--- aws-serverless-struts2-archetype/pom.xml | 7 ++++--- pom.xml | 5 +++-- 12 files changed, 40 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0a8aa636..d4c7edf4 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 1f279e1d..3d82feba 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.7 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 5211650f..299a34d6 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.7 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9f2a4bc0..82ff947e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.7 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 80ffd84d..da4d0ac5 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.7-SNAPSHOT + 1.7 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 5.3.15 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.7 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index c383578a..870af950 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7-SNAPSHOT + 1.7 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c9420435..2a1bd765 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.7-SNAPSHOT + 1.7 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 9e46e7ab..ce7677c3 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.7-SNAPSHOT + 1.7 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index cc3119e9..b1e81fd8 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.7-SNAPSHOT + 1.7 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index bda5c41c..ae051343 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.7-SNAPSHOT + 1.7 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 4086e992..e6e1c5d3 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7-SNAPSHOT + 1.7 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.7-SNAPSHOT + 1.7 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + diff --git a/pom.xml b/pom.xml index 3e91563b..65f72e04 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.7-SNAPSHOT + 1.7 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,8 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - + aws-serverless-java-container-1.7 + From d647d3cd5d85539b47ba6a51bf87d49448178a5a Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 16 Feb 2022 11:17:45 +0000 Subject: [PATCH 0472/1214] chore: releaseprepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index d4c7edf4..70213cdf 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 3d82feba..ad6d3144 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7 + 1.8-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 299a34d6..0267da06 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7 + 1.8-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 82ff947e..f8ad2d60 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7 + 1.8-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index da4d0ac5..535ace66 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.7 + 1.8-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT 5.3.15 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7 + 1.8-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 870af950..880b1074 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.7 + 1.8-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 2a1bd765..fa79a42f 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.7 + 1.8-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ce7677c3..86f6aacd 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.7 + 1.8-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index b1e81fd8..019c2902 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.7 + 1.8-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index ae051343..9706c577 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.7 + 1.8-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index e6e1c5d3..f72bdc99 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.7 + 1.8-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.7 + 1.8-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD diff --git a/pom.xml b/pom.xml index 65f72e04..874cfd2d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.7 + 1.8-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.7 + HEAD From 7294aad170fca494450b1ab491440d5e2ae9edff Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 12:37:11 +0100 Subject: [PATCH 0473/1214] chore(deps): Update OWASP dependency checker to 6.5.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 874cfd2d..430ea182 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 0.7 - 6.2.2 + 6.5.3 2.13.1 1.7.36 UTF-8 @@ -171,7 +171,7 @@ clean verify install true - chore: release + chore: release - From caf193833913c37949d0fc6d1e99e929c6638d0c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Feb 2022 13:24:09 +0100 Subject: [PATCH 0474/1214] chore(deps): Explicitly set commons-io version to 2.11.0 to avoid older transitive dependency version (CVE-2021-29425) --- aws-serverless-java-container-core/pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 70213cdf..a581c3ee 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -101,6 +101,16 @@ + + + + commons-io + commons-io + 2.11.0 + + + + From 6fe0e4449dad0c476c0ab0390ae1252d56363ceb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 4 Mar 2022 21:01:29 +0100 Subject: [PATCH 0475/1214] chore(deps): Update Log4J version to 2.17.2 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 6 +++--- samples/struts2/pet-store/pom.xml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3edfb685..2e0e8707 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.15', 'org.springframework:spring-context:5.3.15', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.1', - 'org.apache.logging.log4j:log4j-api:2.17.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', + 'org.apache.logging.log4j:log4j-core:2.17.2', + 'org.apache.logging.log4j:log4j-api:2.17.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 0ac77021..c7c87a7e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.3.15 4.13.2 - 2.17.1 + 2.17.2 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 0c752a40..e4c9bb9b 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,9 +35,9 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.1') - implementation ('org.apache.logging.log4j:log4j-core:2.17.1') - implementation ('org.apache.logging.log4j:log4j-api:2.17.1') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.1') + implementation ('org.apache.logging.log4j:log4j-core:2.17.2') + implementation ('org.apache.logging.log4j:log4j-api:2.17.2') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index e387c47c..856a666c 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 2.5.29 2.13.1 4.13.2 - 2.17.1 + 2.17.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 95cc4d90..4c36b835 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.15', 'org.springframework:spring-context:5.3.15', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.1', - 'org.apache.logging.log4j:log4j-api:2.17.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', + 'org.apache.logging.log4j:log4j-core:2.17.2', + 'org.apache.logging.log4j:log4j-api:2.17.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 39f3d37a..ce1a3b97 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.15 4.13.2 - 2.17.1 + 2.17.2 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 51da7fef..959cb057 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -21,9 +21,9 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.1', - 'org.apache.logging.log4j:log4j-core:2.17.1', - 'org.apache.logging.log4j:log4j-api:2.17.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1', + 'org.apache.logging.log4j:log4j-core:2.17.2', + 'org.apache.logging.log4j:log4j-api:2.17.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 2bbdd429..34908b9b 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -29,7 +29,7 @@ 2.5.29 2.13.1 4.13.2 - 2.17.1 + 2.17.2 From 41123f359f2753963fe734ddedf2a86707679a4b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 24 Mar 2022 10:23:03 +0100 Subject: [PATCH 0476/1214] chore: Move spotbugs plugin config to parent pom --- aws-serverless-java-container-core/pom.xml | 23 --------------- aws-serverless-java-container-jersey/pom.xml | 22 --------------- aws-serverless-java-container-spark/pom.xml | 23 --------------- aws-serverless-java-container-spring/pom.xml | 23 --------------- .../pom.xml | 23 --------------- aws-serverless-java-container-struts2/pom.xml | 23 --------------- pom.xml | 28 +++++++++++++++++++ 7 files changed, 28 insertions(+), 137 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a581c3ee..a8123e58 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -163,29 +163,6 @@ com.github.spotbugs spotbugs-maven-plugin - 4.2.0 - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - - Max - - Low - - true - - ${project.build.directory}/spotbugs - - - - com.h3xstream.findsecbugs - findsecbugs-plugin - 1.7.1 - - - + Max + + Low + + true + + ${project.build.directory}/spotbugs + + + + com.h3xstream.findsecbugs + findsecbugs-plugin + 1.7.1 + + + + From 074a29535394f5f9bd4abbf400482d1d1250ac66 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 24 Mar 2022 11:28:30 +0100 Subject: [PATCH 0477/1214] chore(deps): align versions with Maven POM --- samples/springboot2/pet-store/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 16a33bcc..bc8508c5 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,11 +8,11 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.6.2') { + implementation('org.springframework.boot:spring-boot-starter-web:2.6.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', - 'io.symphonia:lambda-logging:1.0.1' + 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit") } From 6d91ac9a108aa448c01933c049dad6ec0cb7925d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 13:13:52 +0200 Subject: [PATCH 0478/1214] chore(deps): update Jackson version (CVE-2020-36518) --- aws-serverless-java-container-core/pom.xml | 3 ++- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 4 ++-- 16 files changed, 19 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a8123e58..bf3e8047 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -53,7 +53,8 @@ com.fasterxml.jackson.module jackson-module-afterburner - ${jackson.version} + 2.13.2 + com.fasterxml.jackson.core diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index fab27db5..f1a43b13 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index cd2fab40..b2d73942 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.35 - 2.13.1 + 2.13.2.1 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 143fd9dd..df7dabaf 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 3f134aa7..3741f857 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.13.1 + 2.13.2.1 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 2e0e8707..800d7cf0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index e4c9bb9b..3a14d07b 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.1') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.2.1') implementation ('org.apache.logging.log4j:log4j-core:2.17.2') implementation ('org.apache.logging.log4j:log4j-api:2.17.2') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 856a666c..c7c8ad3d 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.29 - 2.13.1 + 2.13.2 4.13.2 2.17.2 @@ -86,7 +86,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.1 diff --git a/pom.xml b/pom.xml index 368d4f9c..9b941430 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 6.5.3 - 2.13.1 + 2.13.2 1.7.36 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index fa04aadc..0347120b 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 71998d8a..71675f0b 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.35 - 2.13.1 + 2.13.2.1 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index d07a6733..dbe3b879 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index aa03786a..53c8a02f 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.13.1 + 2.13.2.1 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 4c36b835..96f61bea 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 959cb057..88cd447d 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -20,7 +20,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.29', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.13.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 34908b9b..7d1cb9ab 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.29 - 2.13.1 + 2.13.2 4.13.2 2.17.2 @@ -97,7 +97,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.1 From 0a5af3211c7068b423f36e0072643357c7ca5d20 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 13:22:29 +0200 Subject: [PATCH 0479/1214] chore(deps): update Jackson version (CVE-2020-36518) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b941430..ec2c9baf 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 6.5.3 - 2.13.2 + 2.13.2.1 1.7.36 UTF-8 From 6140f3efddfbfaefe1e75b9a70d172cb3f212fe8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 13:55:26 +0200 Subject: [PATCH 0480/1214] fix: ${} versions in archetypes need escaping otherwise they will be replace directly --- .../resources/archetype-resources/pom.xml | 6 ++--- .../resources/archetype-resources/pom.xml | 4 ++-- .../resources/archetype-resources/pom.xml | 14 ++++++------ .../resources/archetype-resources/pom.xml | 22 +++++++++---------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index b2d73942..5bce2b69 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -28,7 +28,7 @@ org.glassfish.jersey.media jersey-media-json-jackson - ${jersey.version} + \${jersey.version} com.fasterxml.jackson.core @@ -48,13 +48,13 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + \${jackson.version} org.glassfish.jersey.inject jersey-hk2 - ${jersey.version} + \${jersey.version} diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 3741f857..4f183879 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -30,13 +30,13 @@ com.sparkjava spark-core - ${spark.version} + \${spark.version} com.fasterxml.jackson.core jackson-databind - ${jackson.version} + \${jackson.version} diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index c7c87a7e..8acc76fa 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -31,13 +31,13 @@ org.springframework spring-webmvc - ${spring.version} + \${spring.version} org.springframework spring-context - ${spring.version} + \${spring.version} + commons-io + commons-io + 2.11.0 + + + + From a8d4765b710dd0afbd02820f8f472c5d034ca11e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 14:01:51 +0200 Subject: [PATCH 0482/1214] chore(deps): Update Spring dependencies (framework to 5.3.17, boot to 2.6.5, security to 5.6.2) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index bf3e8047..aa40631a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -97,7 +97,7 @@ org.springframework.security spring-security-web - 5.6.1 + 5.6.2 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index bf2e66d2..3d715aa5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.15 - 5.6.1 + 5.3.17 + 5.6.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index b0692fcc..51eb7604 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.8-SNAPSHOT - 5.3.15 - 2.6.3 - 5.6.1 + 5.3.17 + 2.6.5 + 5.6.2 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 800d7cf0..ca53251f 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.15', - 'org.springframework:spring-context:5.3.15', + 'org.springframework:spring-webmvc:5.3.17', + 'org.springframework:spring-context:5.3.17', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 8acc76fa..757f4582 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.15 + 5.3.17 4.13.2 2.17.2 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index dde89ac5..729e7671 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.3', + 'org.springframework.boot:spring-boot-starter-web:2.6.5', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index c798b2c9..c580345d 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 2.6.5 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 96f61bea..c220a178 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.15', - 'org.springframework:spring-context:5.3.15', + 'org.springframework:spring-webmvc:5.3.17', + 'org.springframework:spring-context:5.3.17', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ce1a3b97..310b7b95 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.15 + 5.3.17 4.13.2 2.17.2 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index bc8508c5..ede2ea60 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.6.3') { + implementation('org.springframework.boot:spring-boot-starter-web:2.6.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index c81e1e0c..2c2b2f63 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.3 + 2.6.5 From 94bbd4f25a05fdb9a777f8730e3aa6fe4ae8599e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 14:23:06 +0200 Subject: [PATCH 0483/1214] chore(deps): update commons-codec version to 1.15 --- aws-serverless-java-container-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f3262ae3..a6c54558 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -58,7 +58,7 @@ commons-codec commons-codec - 1.10 + 1.15 test From 26d049a6d75e5ed2117231c2d42371363108812b Mon Sep 17 00:00:00 2001 From: Arthur Kam Date: Tue, 29 Mar 2022 20:32:56 -0400 Subject: [PATCH 0484/1214] Add support for HTTP API cookie parameter --- .../AwsHttpApiV2ProxyHttpServletRequest.java | 27 +++++++++++++++++-- .../testutils/AwsProxyRequestBuilder.java | 6 ++++- ...HttpApiV2HttpServletRequestReaderTest.java | 6 +++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index dcc48160..aa4f4eb5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -37,6 +37,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; import java.util.*; +import java.util.stream.Stream; public class AwsHttpApiV2ProxyHttpServletRequest extends AwsHttpServletRequest { private static Logger log = LoggerFactory.getLogger(AwsHttpApiV2ProxyHttpServletRequest.class); @@ -75,11 +76,33 @@ public String getAuthType() { @Override public Cookie[] getCookies() { + Cookie[] rhc; if (headers == null || !headers.containsKey(HttpHeaders.COOKIE)) { - return new Cookie[0]; + rhc = new Cookie[0]; + } else { + rhc = parseCookieHeaderValue(headers.getFirst(HttpHeaders.COOKIE)); } - return parseCookieHeaderValue(headers.getFirst(HttpHeaders.COOKIE)); + Cookie[] rc; + if (request.getCookies() == null) { + rc = new Cookie[0]; + } else { + rc = request.getCookies().stream() + .map(c -> { + int i = c.indexOf('='); + if (i == -1) { + return null; + } else { + String k = SecurityUtils.crlf(c.substring(0, i)).trim(); + String v = SecurityUtils.crlf(c.substring(i+1)); + return new Cookie(k, v); + } + }) + .filter(c -> c != null) + .toArray(Cookie[]::new); + } + + return Stream.concat(Arrays.stream(rhc), Arrays.stream(rc)).toArray(Cookie[]::new); } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 11bcd58e..998bf474 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -459,7 +459,11 @@ public HttpApiV2ProxyRequest toHttpApiV2Request() { } req.setHeaders(new TreeMap<>(String.CASE_INSENSITIVE_ORDER)); if (request.getMultiValueHeaders() != null) { - request.getMultiValueHeaders().forEach((key, value) -> req.getHeaders().put(key, value.get(0))); + request.getMultiValueHeaders().forEach((key, value) -> { + if (!HttpHeaders.COOKIE.equals(key)) { + req.getHeaders().put(key, value.get(0)); + } + }); } if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null) { if (request.getRequestContext().getIdentity().getCaller() != null) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java index 004d4d48..263c78f5 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -25,6 +25,7 @@ public void baseRequest_read_populatesSuccessfully() { .referer("localhost") .queryString("param1", "value1") .header("custom", "value") + .cookie("cookey", "cooval") .apiId("test").toHttpApiV2Request(); AwsHttpApiV2HttpServletRequestReader reader = new AwsHttpApiV2HttpServletRequestReader(); try { @@ -33,6 +34,11 @@ public void baseRequest_read_populatesSuccessfully() { assertEquals("value1", servletRequest.getParameter("param1")); assertEquals("value", servletRequest.getHeader("CUSTOM")); + assertNotNull(servletRequest.getCookies()); + assertEquals(1, servletRequest.getCookies().length); + assertEquals("cookey", servletRequest.getCookies()[0].getName()); + assertEquals("cooval", servletRequest.getCookies()[0].getValue()); + assertNotNull(servletRequest.getAttribute(AwsHttpApiV2HttpServletRequestReader.HTTP_API_CONTEXT_PROPERTY)); assertEquals("test", ((HttpApiV2ProxyRequestContext)servletRequest.getAttribute(AwsHttpApiV2HttpServletRequestReader.HTTP_API_CONTEXT_PROPERTY)).getApiId()); From a2dd500e684a655b78658060cd2d6fbf6cff8394 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 30 Mar 2022 09:54:32 +0200 Subject: [PATCH 0485/1214] fix: AwsHttpApiV2ProxyHttpServletRequest.getParameterMap returns arrays containing null for empty query params (#427) --- .../servlet/AwsHttpApiV2ProxyHttpServletRequest.java | 2 +- .../servlet/AwsProxyHttpServletRequestTest.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index aa4f4eb5..9b4fa8b8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -514,7 +514,7 @@ private MultiValuedTreeMap parseRawQueryString(String qs) { String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR); String key = URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding()); - String val = kv.length == 2 ? kv[1] : null; + String val = kv.length == 2 ? kv[1] : ""; qsMap.add(key, val); } catch (UnsupportedEncodingException e) { log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(value), e); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 732c3f69..8ea888a0 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -74,6 +74,8 @@ public class AwsProxyHttpServletRequestTest { private static final AwsProxyRequestBuilder REQUEST_QUERY = new AwsProxyRequestBuilder("/hello", "POST") .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE); + private static final AwsProxyRequestBuilder REQUEST_QUERY_EMPTY_VALUE = new AwsProxyRequestBuilder("/hello", "POST") + .queryString(FORM_PARAM_NAME, ""); public AwsProxyHttpServletRequestTest(String type) { @@ -239,6 +241,14 @@ public void queryParameters_getParameterMap_nonNull() { assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(FORM_PARAM_NAME)[0]); } + @Test + public void queryParameters_getParameterMap_nonNull_EmptyParamValue() { + HttpServletRequest request = getRequest(REQUEST_QUERY_EMPTY_VALUE, null, null); + assertNotNull(request); + assertEquals(1, request.getParameterMap().size()); + assertEquals("", request.getParameterMap().get(FORM_PARAM_NAME)[0]); + } + @Test public void queryParameters_getParameterNames_null() { HttpServletRequest request = getRequest(REQUEST_NULL_QUERY_STRING, null, null); From 48eac33d6ecd25cf6e79611412c6471221a0aacf Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Mar 2022 15:59:51 +0200 Subject: [PATCH 0486/1214] feat: add environment variables to tune async init without the need to recompile (#450) --- .../serverless/proxy/AsyncInitializationWrapper.java | 10 ++++++---- .../serverless/proxy/model/ContainerConfig.java | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index 813d8178..fa4be303 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -38,11 +38,14 @@ * seconds has already been used up. */ public class AsyncInitializationWrapper extends InitializationWrapper { - private int INIT_GRACE_TIME_MS = 250; + private static final int DEFAULT_INIT_GRACE_TIME_MS = 150; + private static final String INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_INIT_GRACE_TIME"; + private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getProperty( + INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS))); private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; private CountDownLatch initializationLatch; - private long actualStartTime; + private final long actualStartTime; private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); /** @@ -60,7 +63,6 @@ public AsyncInitializationWrapper(long startTime) { */ public AsyncInitializationWrapper() { actualStartTime = ManagementFactory.getRuntimeMXBean().getStartTime(); - INIT_GRACE_TIME_MS = 150; } @Override @@ -71,7 +73,7 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization initThread.start(); try { long curTime = Instant.now().toEpochMilli(); - // account for the time it took to call the various constructors with the actual start time + a grace of 500ms + // account for the time it took to call the various constructors with the actual start time + a grace time long awaitTime = (actualStartTime + LAMBDA_MAX_INIT_TIME_MS) - curTime - INIT_GRACE_TIME_MS; log.info("Async initialization will wait for " + awaitTime + "ms"); if (!initializationLatch.await(awaitTime, TimeUnit.MILLISECONDS)) { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index 5edeeebb..d9889cc8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -26,7 +26,10 @@ public class ContainerConfig { public static final String DEFAULT_URI_ENCODING = "UTF-8"; public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1"; private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; - private static final int MAX_INIT_TIMEOUT_MS = 20_000; + private static final int DEFAULT_MAX_INIT_TIMEOUT_MS = 20_000; + private static final String MAX_INIT_TIMEOUT_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_MAX_INIT_TIMEOUT"; + private static final int MAX_INIT_TIMEOUT_MS = Integer.parseInt(System.getProperty( + MAX_INIT_TIMEOUT_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_MAX_INIT_TIMEOUT_MS))); public static ContainerConfig defaultConfig() { ContainerConfig configuration = new ContainerConfig(); From 76521b1d3b4e1172f0bf0bd5e18264f17b899bd0 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 30 Mar 2022 08:53:17 +0000 Subject: [PATCH 0487/1214] chore: release -prepare release aws-serverless-java-container-1.8 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index aa40631a..5cdcc336 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index a6c54558..284bf655 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8-SNAPSHOT + 1.8 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 06281e89..01d409a0 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8-SNAPSHOT + 1.8 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 3d715aa5..dd6c210c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8-SNAPSHOT + 1.8 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 51eb7604..c8ca8993 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.8-SNAPSHOT + 1.8 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 5.3.17 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8-SNAPSHOT + 1.8 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 95518a42..227bdf50 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8-SNAPSHOT + 1.8 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index fa79a42f..04339cd8 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.8-SNAPSHOT + 1.8 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 86f6aacd..4e25bd52 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.8-SNAPSHOT + 1.8 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 019c2902..fdc54334 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.8-SNAPSHOT + 1.8 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 9706c577..013e9e8e 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.8-SNAPSHOT + 1.8 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index f72bdc99..196c5d66 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8-SNAPSHOT + 1.8 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.8-SNAPSHOT + 1.8 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 diff --git a/pom.xml b/pom.xml index ec2c9baf..6d28c728 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.8-SNAPSHOT + 1.8 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8 From 0bfe469ce5753916b65db70608c27378ac1c4bb1 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 30 Mar 2022 08:53:19 +0000 Subject: [PATCH 0488/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5cdcc336..80c73637 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 284bf655..e1c08347 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8 + 1.9-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 01d409a0..7a1a914d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index dd6c210c..86ab3e3c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index c8ca8993..7fec891e 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.8 + 1.9-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT 5.3.17 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 227bdf50..50ee0e0e 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8 + 1.9-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 04339cd8..8f0a225c 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.8 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 4e25bd52..fea28b1f 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.8 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fdc54334..723de360 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.8 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 013e9e8e..ecf410f5 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.8 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 196c5d66..cb96c077 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.8 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD diff --git a/pom.xml b/pom.xml index 6d28c728..bdea29d9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.8 + 1.9-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8 + HEAD From 5d7b81d36faf20c0eb1ae64f7ad0d698a5f8a1be Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 30 Mar 2022 11:22:40 +0200 Subject: [PATCH 0489/1214] docs: add note that Micronaut content is oudated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9dad056..0e83ba97 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serve * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) -* Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) +* Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) (outdated! - needs to be updated to latest Micronaut version) Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). From 6d88f503c02988cc947743bad78d965d8aa0b5a2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 1 Apr 2022 12:10:05 +0200 Subject: [PATCH 0490/1214] chore(deps): Update Spring dependencies (framework to 5.3.18, boot to 2.6.6) - CVE-2022-22965 --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 86ab3e3c..5851e0bb 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 5.3.17 + 5.3.18 5.6.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 7fec891e..19ab85ab 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,8 +15,8 @@ 1.9-SNAPSHOT - 5.3.17 - 2.6.5 + 5.3.18 + 2.6.6 5.6.2 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index ca53251f..18d5782c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.17', - 'org.springframework:spring-context:5.3.17', + 'org.springframework:spring-webmvc:5.3.18', + 'org.springframework:spring-context:5.3.18', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 757f4582..bdef3ae0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.17 + 5.3.18 4.13.2 2.17.2 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 729e7671..fca6dee7 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.5', + 'org.springframework.boot:spring-boot-starter-web:2.6.6', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index c580345d..f38cbb41 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.5 + 2.6.6 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index c220a178..76b8c166 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.17', - 'org.springframework:spring-context:5.3.17', + 'org.springframework:spring-webmvc:5.3.18', + 'org.springframework:spring-context:5.3.18', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 310b7b95..ad86fe81 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.17 + 5.3.18 4.13.2 2.17.2 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index ede2ea60..dd296281 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.6.5') { + implementation('org.springframework.boot:spring-boot-starter-web:2.6.6') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 2c2b2f63..8c5bde73 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.5 + 2.6.6 From 1572ee1ccd35e7fe41e799554e92bc4d8d66ea23 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 25 Apr 2022 08:42:14 +0200 Subject: [PATCH 0491/1214] chore(deps): Update Struts2 version to 2.5.30 --- aws-serverless-java-container-struts2/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts2/pet-store/build.gradle | 8 ++++---- samples/struts2/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 50ee0e0e..c2ec5923 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -15,7 +15,7 @@ - 2.5.29 + 2.5.30 diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 3a14d07b..6cbad5d7 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.29') { + implementation ('org.apache.struts:struts2-convention-plugin:2.5.30') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.29') { + implementation ('org.apache.struts:struts2-rest-plugin:2.5.30') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.29') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.30') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.29') { + implementation ('org.apache.struts:struts2-core:2.5.30') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') @@ -41,7 +41,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.29') { + testImplementation('org.apache.struts:struts2-junit-plugin:2.5.30') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 1af582c9..50fbae6f 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.29 + 2.5.30 2.13.2 4.13.2 2.17.2 diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 88cd447d..0a48d8e3 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.29', - 'org.apache.struts:struts2-rest-plugin:2.5.29', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.29', - 'org.apache.struts:struts2-junit-plugin:2.5.29', + 'org.apache.struts:struts2-convention-plugin:2.5.30', + 'org.apache.struts:struts2-rest-plugin:2.5.30', + 'org.apache.struts:struts2-bean-validation-plugin:2.5.30', + 'org.apache.struts:struts2-junit-plugin:2.5.30', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 7d1cb9ab..0b044c45 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.29 + 2.5.30 2.13.2 4.13.2 2.17.2 From 7fcd01e3e827fdf2d877b5f49f34040134355ebb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 25 Apr 2022 09:00:39 +0200 Subject: [PATCH 0492/1214] chore(deps): Update Spring dependencies (framework to 5.3.19, security to 5.6.3, boot to 2.6.7) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 80c73637..1d42a145 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -97,7 +97,7 @@ org.springframework.security spring-security-web - 5.6.2 + 5.6.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5851e0bb..8b32e991 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.18 - 5.6.2 + 5.3.19 + 5.6.3 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 19ab85ab..3e7e3274 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.9-SNAPSHOT - 5.3.18 - 2.6.6 - 5.6.2 + 5.3.19 + 2.6.7 + 5.6.3 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 18d5782c..f50f3406 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.18', - 'org.springframework:spring-context:5.3.18', + 'org.springframework:spring-webmvc:5.3.19', + 'org.springframework:spring-context:5.3.19', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index bdef3ae0..75a1d2a6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.18 + 5.3.19 4.13.2 2.17.2 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index fca6dee7..0d590cc5 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.6', + 'org.springframework.boot:spring-boot-starter-web:2.6.7', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index f38cbb41..3f01eda3 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.6 + 2.6.7 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 76b8c166..bb16a7af 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.18', - 'org.springframework:spring-context:5.3.18', + 'org.springframework:spring-webmvc:5.3.19', + 'org.springframework:spring-context:5.3.19', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ad86fe81..e635c95a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.18 + 5.3.19 4.13.2 2.17.2 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index dd296281..60c4c2de 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.6.6') { + implementation('org.springframework.boot:spring-boot-starter-web:2.6.7') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 8c5bde73..065af3cf 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.6 + 2.6.7 From 41f2ac88cfb24f404e94c2461a01ba129cc993d4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 25 Apr 2022 09:16:47 +0200 Subject: [PATCH 0493/1214] chore: Remove automated build with Spring 4.3 (EOL) --- .github/workflows/continuous-integration-workflow.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index dd7f5050..3b31e046 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -52,14 +52,12 @@ jobs: # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with # Spring core 5.2 and above. SpringBoot 1.5 is deprecated run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - - name: Build Spring 4.3 - run: ./gha_build.sh spring false false -Dspring.version=4.3.30.RELEASE -Dspring-security.version=4.2.20.RELEASE - name: Build Spring 5.0 run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE - name: Build Spring 5.1 run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE - name: Build Spring 5.2 - run: ./gha_build.sh spring false false -Dspring.version=5.2.16.RELEASE -Dspring-security.version=5.2.11.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE build_springboot2: name: Build and test SpringBoot 2 From fe29825af9755a1b7f0b1f99c2b767eccf3b4b27 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 25 Apr 2022 09:33:45 +0200 Subject: [PATCH 0494/1214] chore: Skip OWASP dependency check when running automated builds for older Spring versions --- .../workflows/continuous-integration-workflow.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 3b31e046..f3e27013 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -53,11 +53,11 @@ jobs: # Spring core 5.2 and above. SpringBoot 1.5 is deprecated run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - name: Build Spring 5.0 - run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE -Ddependency-check.skip=true - name: Build Spring 5.1 - run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE -Ddependency-check.skip=true - name: Build Spring 5.2 - run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE + run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE -Ddependency-check.skip=true build_springboot2: name: Build and test SpringBoot 2 @@ -68,13 +68,13 @@ jobs: run: ./gha_build.sh springboot2 true true # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions - name: Build Spring Boot 2.2 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE -Ddependency-check.skip=true - name: Build Spring Boot 2.3 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE -Ddependency-check.skip=true - name: Build Spring Boot 2.4 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 -Ddependency-check.skip=true - name: Build Spring Boot 2.5 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.8 -Dspring.version=5.3.14 -Dspringsecurity.version=5.5.4 + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.13 -Dspring.version=5.3.19 -Dspringsecurity.version=5.5.6 -Ddependency-check.skip=true build_struts2: name: Build and test Struts 2 From b192b2d52ca6eda94ded5c2636bba468370c7ee9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Apr 2022 16:57:23 +0200 Subject: [PATCH 0495/1214] fix: add @JsonIgnoreProperties to HttpApiV2ProxyRequestContext to avoid UnrecognizedPropertyException for Lambda Function URLs with IAM auth (#460) --- .../serverless/proxy/model/HttpApiV2ProxyRequestContext.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java index 55bbe1f8..738f692f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java @@ -12,6 +12,9 @@ */ package com.amazonaws.serverless.proxy.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) public class HttpApiV2ProxyRequestContext { private String accountId; private String apiId; From 78a35ceb3b3de93311edd0fc46f525c32e1dfb71 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Apr 2022 22:04:50 +0200 Subject: [PATCH 0496/1214] fix: use environment variables to tune async init - and not system properties (#450) --- .../serverless/proxy/AsyncInitializationWrapper.java | 5 +++-- .../amazonaws/serverless/proxy/model/ContainerConfig.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index fa4be303..d1e97909 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -40,7 +40,7 @@ public class AsyncInitializationWrapper extends InitializationWrapper { private static final int DEFAULT_INIT_GRACE_TIME_MS = 150; private static final String INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_INIT_GRACE_TIME"; - private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getProperty( + private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault( INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS))); private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; @@ -75,7 +75,8 @@ public void start(LambdaContainerHandler handler) throws ContainerInitialization long curTime = Instant.now().toEpochMilli(); // account for the time it took to call the various constructors with the actual start time + a grace time long awaitTime = (actualStartTime + LAMBDA_MAX_INIT_TIME_MS) - curTime - INIT_GRACE_TIME_MS; - log.info("Async initialization will wait for " + awaitTime + "ms"); + log.info("Async initialization will wait for {}ms (init grace time is configured to {})", + awaitTime, INIT_GRACE_TIME_MS); if (!initializationLatch.await(awaitTime, TimeUnit.MILLISECONDS)) { log.info("Initialization took longer than " + LAMBDA_MAX_INIT_TIME_MS + ", setting new CountDownLatch and " + "continuing in event handler"); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java index d9889cc8..941109b7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ContainerConfig.java @@ -28,7 +28,7 @@ public class ContainerConfig { private static final List DEFAULT_FILE_PATHS = new ArrayList() {{ add("/tmp"); add("/var/task"); }}; private static final int DEFAULT_MAX_INIT_TIMEOUT_MS = 20_000; private static final String MAX_INIT_TIMEOUT_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_MAX_INIT_TIMEOUT"; - private static final int MAX_INIT_TIMEOUT_MS = Integer.parseInt(System.getProperty( + private static final int MAX_INIT_TIMEOUT_MS = Integer.parseInt(System.getenv().getOrDefault( MAX_INIT_TIMEOUT_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_MAX_INIT_TIMEOUT_MS))); public static ContainerConfig defaultConfig() { From 820e3f35d213ff2668f3f960eee92fa5d63c4d35 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 27 Apr 2022 20:14:19 +0000 Subject: [PATCH 0497/1214] chore: release -prepare release aws-serverless-java-container-1.8.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1d42a145..964c2c10 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e1c08347..3022c041 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7a1a914d..ddc9e7db 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8b32e991..88beeadd 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 3e7e3274..185b0498 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9-SNAPSHOT + 1.8.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 5.3.19 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.1 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index c2ec5923..69509d7b 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.1 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8f0a225c..52efcd34 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9-SNAPSHOT + 1.8.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index fea28b1f..e7a7bc59 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9-SNAPSHOT + 1.8.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 723de360..6250b927 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9-SNAPSHOT + 1.8.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index ecf410f5..d7cf61f3 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9-SNAPSHOT + 1.8.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index cb96c077..d775d674 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.1 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.9-SNAPSHOT + 1.8.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 diff --git a/pom.xml b/pom.xml index bdea29d9..d930519e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9-SNAPSHOT + 1.8.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.1 From f6d3a4488e96162d552ad7a319e83ae033ea6e67 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 27 Apr 2022 20:14:21 +0000 Subject: [PATCH 0498/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 964c2c10..1d42a145 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 3022c041..e1c08347 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.1 + 1.9-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index ddc9e7db..7a1a914d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.1 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 88beeadd..8b32e991 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.1 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 185b0498..3e7e3274 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.8.1 + 1.9-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT 5.3.19 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.1 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 69509d7b..c2ec5923 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.1 + 1.9-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 52efcd34..8f0a225c 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.8.1 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index e7a7bc59..fea28b1f 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.8.1 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 6250b927..723de360 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.8.1 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index d7cf61f3..ecf410f5 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.8.1 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index d775d674..cb96c077 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.1 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.8.1 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD diff --git a/pom.xml b/pom.xml index d930519e..bdea29d9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.8.1 + 1.9-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.1 + HEAD From dbf072d15eb87d2c8710cac1393bd8da646ba100 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 25 May 2022 10:42:44 +0200 Subject: [PATCH 0499/1214] chore(deps): Update Spring dependencies (framework to 5.3.20, security to 5.6.5, boot to 2.6.8) --- .github/workflows/continuous-integration-workflow.yml | 2 +- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index f3e27013..6edfe855 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -74,7 +74,7 @@ jobs: - name: Build Spring Boot 2.4 run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 -Ddependency-check.skip=true - name: Build Spring Boot 2.5 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.13 -Dspring.version=5.3.19 -Dspringsecurity.version=5.5.6 -Ddependency-check.skip=true + run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.14 -Dspring.version=5.3.20 -Dspringsecurity.version=5.5.8 -Ddependency-check.skip=true build_struts2: name: Build and test Struts 2 diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1d42a145..2f5752e9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -97,7 +97,7 @@ org.springframework.security spring-security-web - 5.6.3 + 5.6.5 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8b32e991..8e7e2915 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.19 - 5.6.3 + 5.3.20 + 5.6.5 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 3e7e3274..ff485aa9 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.9-SNAPSHOT - 5.3.19 - 2.6.7 - 5.6.3 + 5.3.20 + 2.6.8 + 5.6.5 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index f50f3406..10d9f2df 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.19', - 'org.springframework:spring-context:5.3.19', + 'org.springframework:spring-webmvc:5.3.20', + 'org.springframework:spring-context:5.3.20', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 75a1d2a6..6a8f393c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.19 + 5.3.20 4.13.2 2.17.2 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 0d590cc5..5c846754 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.7', + 'org.springframework.boot:spring-boot-starter-web:2.6.8', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 3f01eda3..12bc00df 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index bb16a7af..89b2804b 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.19', - 'org.springframework:spring-context:5.3.19', + 'org.springframework:spring-webmvc:5.3.20', + 'org.springframework:spring-context:5.3.20', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e635c95a..b802e99e 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.19 + 5.3.20 4.13.2 2.17.2 diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 065af3cf..fccf7bd4 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 From 216deb7bee199b5b44d662b6969b59c71b5baba6 Mon Sep 17 00:00:00 2001 From: Benjamin Qader Date: Mon, 30 May 2022 21:20:15 +0100 Subject: [PATCH 0500/1214] fix: AwsHttpApiV2ProxyHttpServletRequest.headersMapToMultiValue truncates the user-agent (#464) --- .../internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java | 1 + .../servlet/AwsHttpApiV2HttpServletRequestReaderTest.java | 3 +++ .../proxy/internal/servlet/AwsProxyHttpServletRequestTest.java | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 9b4fa8b8..09a5e884 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -533,6 +533,7 @@ private Headers headersMapToMultiValue(Map headers) { // Exceptions for known header values that contain commas if (hkv.getKey().equalsIgnoreCase(HttpHeaders.DATE) || hkv.getKey().equalsIgnoreCase(HttpHeaders.IF_MODIFIED_SINCE) || + hkv.getKey().equalsIgnoreCase(HttpHeaders.USER_AGENT) || hkv.getKey().toLowerCase(Locale.getDefault()).startsWith("accept-")) { h.add(hkv.getKey(), hkv.getValue()); continue; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java index 263c78f5..37ba3059 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.HttpHeaders; import static org.junit.Assert.*; @@ -23,6 +24,7 @@ public void reflection_getRequestClass_returnsCorrectType() { public void baseRequest_read_populatesSuccessfully() { HttpApiV2ProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET") .referer("localhost") + .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36") .queryString("param1", "value1") .header("custom", "value") .cookie("cookey", "cooval") @@ -33,6 +35,7 @@ public void baseRequest_read_populatesSuccessfully() { assertEquals("/hello", servletRequest.getPathInfo()); assertEquals("value1", servletRequest.getParameter("param1")); assertEquals("value", servletRequest.getHeader("CUSTOM")); + assertEquals("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36", servletRequest.getHeader(HttpHeaders.USER_AGENT)); assertNotNull(servletRequest.getCookies()); assertEquals(1, servletRequest.getCookies().length); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 8ea888a0..de23d855 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -36,7 +36,7 @@ public class AwsProxyHttpServletRequestTest { private static final String FORM_PARAM_TEST = "test_cookie_param"; private static final String QUERY_STRING_NAME_VALUE = "Bob"; private static final String REQUEST_SCHEME_HTTP = "http"; - private static final String USER_AGENT = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0"; + private static final String USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36"; private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; private static ZonedDateTime REQUEST_DATE = ZonedDateTime.now(); From 09f07471b47807298b072eec8b446552c62ef8a0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 3 Jun 2022 11:51:23 +0200 Subject: [PATCH 0501/1214] chore(deps): update Jackson version to 2.13.3 --- aws-serverless-java-container-core/pom.xml | 9 +-------- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 4 ++-- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts2/pet-store/build.gradle | 2 +- samples/struts2/pet-store/pom.xml | 4 ++-- 16 files changed, 18 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 2f5752e9..274c70e9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -53,14 +53,7 @@ com.fasterxml.jackson.module jackson-module-afterburner - 2.13.2 - - - - com.fasterxml.jackson.core - jackson-databind - - + ${jackson.version} diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index f1a43b13..9f4e934e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 5bce2b69..d1fc42e0 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.35 - 2.13.2.1 + 2.13.3 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index df7dabaf..a1261c3d 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 4f183879..678d2cf1 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.13.2.1 + 2.13.3 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 10d9f2df..21e3815b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle index 6cbad5d7..a2cb228b 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:5.4.3.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.2.1') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3') implementation ('org.apache.logging.log4j:log4j-core:2.17.2') implementation ('org.apache.logging.log4j:log4j-api:2.17.2') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml index 50fbae6f..19204eac 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 2.5.30 - 2.13.2 + 2.13.3 4.13.2 2.17.2 @@ -86,7 +86,7 @@ com.fasterxml.jackson.core jackson-databind - \${jackson.version}.1 + \${jackson.version} diff --git a/pom.xml b/pom.xml index bdea29d9..beca7016 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 6.5.3 - 2.13.2.1 + 2.13.3 1.7.36 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 0347120b..3f8842b8 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 71675f0b..27b46328 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.35 - 2.13.2.1 + 2.13.3 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index dbe3b879..132f2d6c 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.3', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 53c8a02f..e46eff94 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.13.2.1 + 2.13.3 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 89b2804b..58423266 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts2/pet-store/build.gradle index 0a48d8e3..1d734194 100644 --- a/samples/struts2/pet-store/build.gradle +++ b/samples/struts2/pet-store/build.gradle @@ -20,7 +20,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:2.5.30', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', 'org.hibernate:hibernate-validator:5.4.3.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.13.2.1', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts2/pet-store/pom.xml index 0b044c45..562c8fb8 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts2/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.5.30 - 2.13.2 + 2.13.3 4.13.2 2.17.2 @@ -97,7 +97,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.1 + ${jackson.version} From 67b11b62d47fd11cae7a28b77ac38e61f30cff34 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 3 Jun 2022 12:24:56 +0200 Subject: [PATCH 0502/1214] chore: suppress CVE-2016-1000027 OWASP detection in Spring libs (see spring-projects/spring-framework#24434) --- owasp-suppression.xml | 7 ++++++- pom.xml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/owasp-suppression.xml b/owasp-suppression.xml index 0997df5c..83fde581 100644 --- a/owasp-suppression.xml +++ b/owasp-suppression.xml @@ -17,7 +17,7 @@ ~ specific language governing permissions and limitations ~ under the License. --> - + @@ -27,4 +27,9 @@ cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ + + + ^pkg:maven/org\.springframework/spring.*$ + CVE-2016-1000027 + \ No newline at end of file diff --git a/pom.xml b/pom.xml index beca7016..87128512 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 0.7 - 6.5.3 + 7.1.0 2.13.3 1.7.36 UTF-8 From 8264eebfed44074fdbd05a8737cac4dc011e6677 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 10 Jun 2022 12:04:10 +0000 Subject: [PATCH 0503/1214] chore: release -prepare release aws-serverless-java-container-1.8.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 274c70e9..7cf23b61 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e1c08347..46af80b1 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7a1a914d..7438ff5c 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8e7e2915..fc8681c7 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index ff485aa9..6425c184 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9-SNAPSHOT + 1.8.2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 5.3.20 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.2 diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index c2ec5923..101e79b1 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.8.2 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8f0a225c..0492d4f2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9-SNAPSHOT + 1.8.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index fea28b1f..1ab51869 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9-SNAPSHOT + 1.8.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 723de360..c4149c5a 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9-SNAPSHOT + 1.8.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index ecf410f5..6ed2453d 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9-SNAPSHOT + 1.8.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index cb96c077..01a5a0ab 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.8.2 com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.9-SNAPSHOT + 1.8.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 diff --git a/pom.xml b/pom.xml index 87128512..5e354009 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9-SNAPSHOT + 1.8.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.8.2 From e0a0d907b3bc0fd4ec31579853104aaf84921f1b Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 10 Jun 2022 12:04:11 +0000 Subject: [PATCH 0504/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts2/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts2-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7cf23b61..274c70e9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 46af80b1..e1c08347 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.2 + 1.9-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7438ff5c..7a1a914d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT .. @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.2 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index fc8681c7..8e7e2915 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.2 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 6425c184..ff485aa9 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.8.2 + 1.9-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT 5.3.20 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.2 + 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts2/pom.xml index 101e79b1..c2ec5923 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts2/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts2 implementation Allows Java applications written for the Struts2 framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.8.2 + 1.9-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 0492d4f2..8f0a225c 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.8.2 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 1ab51869..fea28b1f 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.8.2 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index c4149c5a..723de360 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.8.2 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 6ed2453d..ecf410f5 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.8.2 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts2-archetype/pom.xml index 01a5a0ab..cb96c077 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.8.2 + 1.9-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts2-archetype - 1.8.2 + 1.9-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD diff --git a/pom.xml b/pom.xml index 5e354009..87128512 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.8.2 + 1.9-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.8.2 + HEAD From 3627c6641db5480041043cdd7ba53d563d1391b5 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Jul 2022 15:30:14 +0200 Subject: [PATCH 0505/1214] chore(deps): Update Spring dependencies (framework to 5.3.22, security to 5.7.2, boot to 2.7.2) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 274c70e9..ecd905f1 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -90,7 +90,7 @@ org.springframework.security spring-security-web - 5.6.5 + 5.7.2 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8e7e2915..25df7325 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.20 - 5.6.5 + 5.3.22 + 5.7.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index ff485aa9..65b1ed22 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.9-SNAPSHOT - 5.3.20 - 2.6.8 - 5.6.5 + 5.3.22 + 2.7.2 + 5.7.2 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 21e3815b..4497f8c8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.20', - 'org.springframework:spring-context:5.3.20', + 'org.springframework:spring-webmvc:5.3.22', + 'org.springframework:spring-context:5.3.22', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 6a8f393c..b3597de5 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.20 + 5.3.22 4.13.2 2.17.2 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 5c846754..30221b51 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.6.8', + 'org.springframework.boot:spring-boot-starter-web:2.7.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 12bc00df..8efb4efc 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.8 + 2.7.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 58423266..d25e400e 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.20', - 'org.springframework:spring-context:5.3.20', + 'org.springframework:spring-webmvc:5.3.22', + 'org.springframework:spring-context:5.3.22', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index b802e99e..ea06bddf 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.20 + 5.3.22 4.13.2 2.17.2 diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index fccf7bd4..10910661 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.8 + 2.7.2 From df3e0558152ce6be1941ef02929b625c7834dbf4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Jul 2022 15:37:51 +0200 Subject: [PATCH 0506/1214] chore(deps): Update Jetty dependency to 9.4.48.v20220622 --- aws-serverless-java-container-spark/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7a1a914d..92700f2d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -25,7 +25,7 @@ org.eclipse.jetty jetty-bom - 9.4.45.v20220203 + 9.4.48.v20220622 pom import From 0c821a968606cb7406ccd1a6243c47c5ddab67e9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 10 Aug 2022 16:36:47 +0200 Subject: [PATCH 0507/1214] chore(deps): Update Jersey dependencies to 2.36 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e1c08347..d5223458 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.35 + 2.36 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 9f4e934e..08c10203 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,13 +13,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.36") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.35") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.36") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index d1fc42e0..93dccc59 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,7 @@ 1.8 1.8 - 2.35 + 2.36 2.13.3 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 3f8842b8..e01cde9f 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -13,13 +13,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.35") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.36") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.35") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.36") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 27b46328..ffdc2db8 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.35 + 2.36 2.13.3 From c84af04bf9f658df3b91b4c5011a91338041f2fa Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 10 Aug 2022 17:01:08 +0200 Subject: [PATCH 0508/1214] chore(deps): Update Spark dependency to 2.9.4 --- aws-serverless-java-container-spark/pom.xml | 22 +------------------ .../embeddedserver/LambdaEmbeddedServer.java | 2 +- .../LambdaEmbeddedServerTest.java | 2 +- .../archetype-resources/build.gradle | 2 +- samples/spark/pet-store/build.gradle | 2 +- 5 files changed, 5 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 92700f2d..03690328 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -16,22 +16,9 @@ - 2.9.3 + 2.9.4 - - - - - org.eclipse.jetty - jetty-bom - 9.4.48.v20220622 - pom - import - - - - @@ -45,13 +32,6 @@ com.sparkjava spark-core ${spark.version} - - - - org.slf4j - slf4j-api - - diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index 4be5d856..fadca494 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -80,7 +80,7 @@ public int ignite(String host, int port, SslStores sslStores, int maxThreads, in public void configureWebSockets(Map webSocketHandlers, - Optional webSocketIdleTimeoutMillis) { + Optional webSocketIdleTimeoutMillis) { // Swallowing this exception to prevent Spark from getting stuck // throw new UnsupportedOperationException(); log.info("Spark called configureWebSockets. However, web sockets are not supported"); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java index 8a0e1f4e..968b2b47 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java @@ -14,7 +14,7 @@ public class LambdaEmbeddedServerTest { @Test public void webSocket_configureWebSocket_noException() { try { - server.configureWebSockets(null, Optional.of(0)); + server.configureWebSockets(null, Optional.of(0L)); } catch (Exception e) { e.printStackTrace(); fail(); diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index a1261c3d..4fe67241 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.sparkjava:spark-core:2.9.3', + 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 132f2d6c..dc6a63db 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.sparkjava:spark-core:2.9.3', + 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'io.symphonia:lambda-logging:1.0.3' From 8962d53f638faaba4cf0d0765bf1aa7743d81fee Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 10 Aug 2022 17:19:38 +0200 Subject: [PATCH 0509/1214] chore(deps): Update Spark dependency to 2.9.4 - running 2.8.0 is no longer supported --- .github/workflows/continuous-integration-workflow.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 6edfe855..5c55e7b7 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -40,8 +40,6 @@ jobs: - uses: actions/checkout@v2 - name: Build latest run: ./gha_build.sh spark true true - - name: Build Spark 2.8.0 - run: ./gha_build.sh spark false false -Dspark.version=2.8.0 build_spring: name: Build and test Spring & SpringBoot From 0b92c8ec9c6d8955ee6e311e668282a754d80d7d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 10 Aug 2022 17:35:14 +0200 Subject: [PATCH 0510/1214] move samples/ archetypes to java11 runtime --- .../resources/archetype-resources/README.md | 2 +- .../archetype-resources/template.yml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../archetype-resources/template.yml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../archetype-resources/template.yml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../archetype-resources/template.yml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../archetype-resources/template.yml | 2 +- samples/jersey/pet-store/template.yml | 2 +- samples/spark/pet-store/template.yml | 2 +- samples/spring/pet-store/template.yml | 2 +- samples/springboot2/pet-store/template.yml | 28 ++++++++++--------- samples/struts2/pet-store/template.yml | 2 +- 15 files changed, 29 insertions(+), 27 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md index 1dc39a0a..1017a83a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md @@ -56,7 +56,7 @@ From the project root folder - where the `template.yml` file is located - start $ sam local start-api ... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] ... ``` diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml index db6ecbaf..e6e7e59b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md index 1dc39a0a..1017a83a 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md @@ -56,7 +56,7 @@ From the project root folder - where the `template.yml` file is located - start $ sam local start-api ... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] ... ``` diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml index d9e83ceb..d45c9923 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md index 1dc39a0a..1017a83a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md @@ -56,7 +56,7 @@ From the project root folder - where the `template.yml` file is located - start $ sam local start-api ... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] ... ``` diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml index 292d87a9..1c919d02 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md index 1dc39a0a..1017a83a 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md @@ -56,7 +56,7 @@ From the project root folder - where the `template.yml` file is located - start $ sam local start-api ... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] ... ``` diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml index ae2adf28..8d8e0946 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md index 1dc39a0a..1017a83a 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md @@ -56,7 +56,7 @@ From the project root folder - where the `template.yml` file is located - start $ sam local start-api ... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java8) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] ... ``` diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml index 11e06d07..2025da62 100644 --- a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/jersey/pet-store/template.yml b/samples/jersey/pet-store/template.yml index ababb78a..f715064c 100644 --- a/samples/jersey/pet-store/template.yml +++ b/samples/jersey/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.jersey.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/spark/pet-store/template.yml b/samples/spark/pet-store/template.yml index 26e0a653..535e684f 100644 --- a/samples/spark/pet-store/template.yml +++ b/samples/spark/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.spark.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/spring/pet-store/template.yml b/samples/spring/pet-store/template.yml index 8c3dec02..c485cf4c 100644 --- a/samples/spring/pet-store/template.yml +++ b/samples/spring/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.spring.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/springboot2/pet-store/template.yml b/samples/springboot2/pet-store/template.yml index a8297479..6e8ee653 100644 --- a/samples/springboot2/pet-store/template.yml +++ b/samples/springboot2/pet-store/template.yml @@ -12,21 +12,23 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' + FunctionUrlConfig: + AuthType: NONE +# Events: +# HttpApiEvent: +# Type: HttpApi +# Properties: +# TimeoutInMillis: 20000 +# PayloadFormatVersion: '1.0' -Outputs: - SpringBootPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: SpringBootPetStoreApi +#Outputs: +# SpringBootPetStoreApi: +# Description: URL for application +# Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' +# Export: +# Name: SpringBootPetStoreApi diff --git a/samples/struts2/pet-store/template.yml b/samples/struts2/pet-store/template.yml index 243b07a2..a3e794e9 100644 --- a/samples/struts2/pet-store/template.yml +++ b/samples/struts2/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest - Runtime: java8 + Runtime: java11 CodeUri: . MemorySize: 256 Policies: AWSLambdaBasicExecutionRole From 768732a7874f72cb9d6e4deff9c364c7d39960f5 Mon Sep 17 00:00:00 2001 From: sapessi Date: Thu, 18 Aug 2022 08:53:53 -0700 Subject: [PATCH 0511/1214] docs: Documenting use of suppress warnings for path traversal in security utils --- .../serverless/proxy/internal/SecurityUtils.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java index 3395b56c..d553d17a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/SecurityUtils.java @@ -12,6 +12,7 @@ */ package com.amazonaws.serverless.proxy.internal; +import com.amazonaws.serverless.proxy.model.ContainerConfig; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -174,6 +175,14 @@ public static String getValidFilePath(String inputPath) { /** * Returns an absolute file path given an input path and validates that it is not trying * to write/read from a directory other than /tmp. + * + * We suppress the path traversal warnings because this method is used to validate paths passed + * to the servlet implementation methods such as {@link com.amazonaws.serverless.proxy.internal.servlet.AwsProxyRequestPart#write(String)}. + * Using relative paths is a valid use-case for developers implementing a servlet-based API. We + * mitigate the potential partial path traversal by checking the resulting absolute path against + * the list of allowed paths specified in {@link ContainerConfig#getValidFilePaths()}. We also + * block the /var/task directory regardless. + * * @param inputPath The input path * @return The absolute path to the file * @throws IllegalArgumentException If the given path is not valid or outside of /tmp From 98482d485dadaf7212141f162e7e35f4ea6c7b6f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 21 Aug 2022 21:24:37 +0200 Subject: [PATCH 0512/1214] chore(deps): Update Spring dependencies (security to 5.7.3, boot to 2.7.3) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ecd905f1..f87eb119 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -90,7 +90,7 @@ org.springframework.security spring-security-web - 5.7.2 + 5.7.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 25df7325..ed42b240 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 5.3.22 - 5.7.2 + 5.7.3 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 65b1ed22..0779abd2 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -16,8 +16,8 @@ 5.3.22 - 2.7.2 - 5.7.2 + 2.7.3 + 5.7.3 1.8 1.8 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 30221b51..4a7199c8 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.2', + 'org.springframework.boot:spring-boot-starter-web:2.7.3', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 8efb4efc..27cfc10c 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.2 + 2.7.3 diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 10910661..b0e6720d 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.2 + 2.7.3 From 8cc839a41d90f6038ff201034051f94aac8d1e20 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 17 Aug 2022 11:53:00 +0200 Subject: [PATCH 0513/1214] Add missing Struts Quick start reference https://github.com/awslabs/aws-serverless-java-container/issues/471 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0e83ba97..4c0a4c99 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,16 @@ Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serve * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) +* [Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) (outdated! - needs to be updated to latest Micronaut version) -Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). +Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). ```java public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringLambdaContainerHandler handler; + private static final SpringLambdaContainerHandler handler; + static { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); From e0074a9c8464185f106ffeb2b1ba8fd6f81b682e Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 17 Aug 2022 11:55:12 +0200 Subject: [PATCH 0514/1214] Rename maven modules for Struts implementation without version number https://github.com/awslabs/aws-serverless-java-container/issues/471 --- .../pom.xml | 6 +++--- .../proxy/struts2/Struts2LambdaContainerHandler.java | 0 .../serverless/proxy/struts2/Struts2LambdaHandler.java | 0 .../serverless/proxy/struts2/Struts2AwsProxyTest.java | 0 .../serverless/proxy/struts2/echoapp/EchoAction.java | 0 .../proxy/struts2/echoapp/EchoRequestInfoAction.java | 0 .../src/test/resources/struts.xml | 0 .../pom.xml | 2 +- .../main/resources/META-INF/maven/archetype-metadata.xml | 0 .../src/main/resources/archetype-resources/README.md | 0 .../src/main/resources/archetype-resources/build.gradle | 0 .../src/main/resources/archetype-resources/pom.xml | 0 .../archetype-resources/src/main/assembly/dist.xml | 0 .../src/main/java/actions/PingController.java | 0 .../src/main/resources/application.properties | 0 .../archetype-resources/src/main/resources/log4j2.xml | 0 .../archetype-resources/src/main/resources/struts.xml | 0 .../src/test/java/StreamLambdaHandlerTest.java | 0 .../src/main/resources/archetype-resources/template.yml | 0 .../src/test/resources/projects/base/archetype.properties | 0 .../src/test/resources/projects/base/goal.txt | 0 pom.xml | 4 ++-- 22 files changed, 6 insertions(+), 6 deletions(-) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/pom.xml (97%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java (100%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java (100%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java (100%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java (100%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java (100%) rename {aws-serverless-java-container-struts2 => aws-serverless-java-container-struts}/src/test/resources/struts.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/pom.xml (97%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/META-INF/maven/archetype-metadata.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/README.md (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/build.gradle (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/pom.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/main/assembly/dist.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/main/java/actions/PingController.java (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/main/resources/application.properties (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/main/resources/log4j2.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/main/resources/struts.xml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/main/resources/archetype-resources/template.yml (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/test/resources/projects/base/archetype.properties (100%) rename {aws-serverless-struts2-archetype => aws-serverless-struts-archetype}/src/test/resources/projects/base/goal.txt (100%) diff --git a/aws-serverless-java-container-struts2/pom.xml b/aws-serverless-java-container-struts/pom.xml similarity index 97% rename from aws-serverless-java-container-struts2/pom.xml rename to aws-serverless-java-container-struts/pom.xml index c2ec5923..94388723 100644 --- a/aws-serverless-java-container-struts2/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - aws-serverless-java-container-struts2 - AWS Serverless Java container support - Struts2 implementation - Allows Java applications written for the Struts2 framework to run in AWS Lambda + aws-serverless-java-container-struts + AWS Serverless Java container support - Struts implementation + Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda 1.9-SNAPSHOT diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java similarity index 100% rename from aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java rename to aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java diff --git a/aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-struts2/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java rename to aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java similarity index 100% rename from aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java similarity index 100% rename from aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java diff --git a/aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java similarity index 100% rename from aws-serverless-java-container-struts2/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java diff --git a/aws-serverless-java-container-struts2/src/test/resources/struts.xml b/aws-serverless-java-container-struts/src/test/resources/struts.xml similarity index 100% rename from aws-serverless-java-container-struts2/src/test/resources/struts.xml rename to aws-serverless-java-container-struts/src/test/resources/struts.xml diff --git a/aws-serverless-struts2-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml similarity index 97% rename from aws-serverless-struts2-archetype/pom.xml rename to aws-serverless-struts-archetype/pom.xml index cb96c077..9eed0080 100644 --- a/aws-serverless-struts2-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -8,7 +8,7 @@ com.amazonaws.serverless.archetypes - aws-serverless-struts2-archetype + aws-serverless-struts-archetype 1.9-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-struts-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml rename to aws-serverless-struts-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/README.md rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/build.gradle rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/pom.xml rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java diff --git a/aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml similarity index 100% rename from aws-serverless-struts2-archetype/src/main/resources/archetype-resources/template.yml rename to aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml diff --git a/aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties similarity index 100% rename from aws-serverless-struts2-archetype/src/test/resources/projects/base/archetype.properties rename to aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties diff --git a/aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-struts-archetype/src/test/resources/projects/base/goal.txt similarity index 100% rename from aws-serverless-struts2-archetype/src/test/resources/projects/base/goal.txt rename to aws-serverless-struts-archetype/src/test/resources/projects/base/goal.txt diff --git a/pom.xml b/pom.xml index 87128512..b752bb12 100644 --- a/pom.xml +++ b/pom.xml @@ -29,9 +29,9 @@ aws-serverless-java-container-jersey aws-serverless-java-container-spark aws-serverless-java-container-spring - aws-serverless-java-container-struts2 + aws-serverless-java-container-struts aws-serverless-java-container-springboot2 - aws-serverless-struts2-archetype + aws-serverless-struts-archetype aws-serverless-jersey-archetype aws-serverless-spark-archetype aws-serverless-spring-archetype From 72b0fd67e54b9d73f30d70c29486b9929c2627b8 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 17 Aug 2022 12:54:37 +0200 Subject: [PATCH 0515/1214] Rename class file names for Struts implementation without version number https://github.com/awslabs/aws-serverless-java-container/issues/471 --- .../continuous-integration-workflow.yml | 4 +- .../StrutsLambdaContainerHandler.java} | 67 +++++++++++-------- .../StrutsLambdaHandler.java} | 8 +-- .../StrutsAwsProxyTest.java} | 18 +++-- .../echoapp/EchoAction.java | 2 +- .../echoapp/EchoRequestInfoAction.java | 2 +- .../src/test/resources/struts.xml | 4 +- .../archetype-resources/build.gradle | 2 +- .../resources/archetype-resources/pom.xml | 10 +-- .../test/java/StreamLambdaHandlerTest.java | 6 +- .../archetype-resources/template.yml | 4 +- .../projects/base/archetype.properties | 2 +- .../{struts2 => struts}/pet-store/README.md | 6 +- .../pet-store/build.gradle | 0 samples/{struts2 => struts}/pet-store/pom.xml | 2 +- .../pet-store/src/main/assembly/dist.xml | 0 .../sample/struts/actions/PetsController.java | 0 .../serverless/sample/struts/model/Pet.java | 0 .../sample/struts/model/PetData.java | 0 .../pet-store/src/main/resources/log4j2.xml | 0 .../pet-store/src/main/resources/struts.xml | 0 .../pet-store/template.yml | 6 +- 22 files changed, 76 insertions(+), 67 deletions(-) rename aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/{struts2/Struts2LambdaContainerHandler.java => struts/StrutsLambdaContainerHandler.java} (59%) rename aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/{struts2/Struts2LambdaHandler.java => struts/StrutsLambdaHandler.java} (79%) rename aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/{struts2/Struts2AwsProxyTest.java => struts/StrutsAwsProxyTest.java} (95%) rename aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/{struts2 => struts}/echoapp/EchoAction.java (96%) rename aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/{struts2 => struts}/echoapp/EchoRequestInfoAction.java (98%) rename samples/{struts2 => struts}/pet-store/README.md (91%) rename samples/{struts2 => struts}/pet-store/build.gradle (100%) rename samples/{struts2 => struts}/pet-store/pom.xml (98%) rename samples/{struts2 => struts}/pet-store/src/main/assembly/dist.xml (100%) rename samples/{struts2 => struts}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java (100%) rename samples/{struts2 => struts}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java (100%) rename samples/{struts2 => struts}/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java (100%) rename samples/{struts2 => struts}/pet-store/src/main/resources/log4j2.xml (100%) rename samples/{struts2 => struts}/pet-store/src/main/resources/struts.xml (100%) rename samples/{struts2 => struts}/pet-store/template.yml (84%) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 5c55e7b7..e1ae0e00 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -75,9 +75,9 @@ jobs: run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.14 -Dspring.version=5.3.20 -Dspringsecurity.version=5.5.8 -Ddependency-check.skip=true build_struts2: - name: Build and test Struts 2 + name: Build and test Struts runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build latest - run: ./gha_build.sh struts2 true true + run: ./gha_build.sh struts true true diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java similarity index 59% rename from aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java rename to aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java index 99c89c44..42ff0aee 100644 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaContainerHandler.java +++ b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java @@ -10,11 +10,22 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.struts2; +package com.amazonaws.serverless.proxy.struts; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.*; -import com.amazonaws.serverless.proxy.internal.servlet.*; +import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpApiV2HttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -32,26 +43,26 @@ import java.util.concurrent.CountDownLatch; /** - * A Lambda handler to initialize the Struts2 filter and proxy the requests. + * A Lambda handler to initialize the Struts filter and proxy the requests. * * @param request type * @param response type */ -public class Struts2LambdaContainerHandler extends AwsLambdaServletContainerHandler { +public class StrutsLambdaContainerHandler extends AwsLambdaServletContainerHandler { - private static final Logger log = LoggerFactory.getLogger(Struts2LambdaContainerHandler.class); + private static final Logger log = LoggerFactory.getLogger(StrutsLambdaContainerHandler.class); public static final String HEADER_STRUTS_STATUS_CODE = "X-Struts-StatusCode"; - private static final String TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR = "STRUTS2_CONTAINER_CONSTRUCTOR"; - private static final String TIMER_STRUTS_2_HANDLE_REQUEST = "STRUTS2_HANDLE_REQUEST"; - private static final String TIMER_STRUTS_2_COLD_START_INIT = "STRUTS2_COLD_START_INIT"; - private static final String STRUTS_FILTER_NAME = "Struts2Filter"; + private static final String TIMER_STRUTS_CONTAINER_CONSTRUCTOR = "STRUTS_CONTAINER_CONSTRUCTOR"; + private static final String TIMER_STRUTS_HANDLE_REQUEST = "STRUTS_HANDLE_REQUEST"; + private static final String TIMER_STRUTS_COLD_START_INIT = "STRUTS_COLD_START_INIT"; + private static final String STRUTS_FILTER_NAME = "StrutsFilter"; private boolean initialized; - public static Struts2LambdaContainerHandler getAwsProxyHandler() { - return new Struts2LambdaContainerHandler( + public static StrutsLambdaContainerHandler getAwsProxyHandler() { + return new StrutsLambdaContainerHandler( AwsProxyRequest.class, AwsProxyResponse.class, new AwsProxyHttpServletRequestReader(), @@ -60,8 +71,8 @@ public static Struts2LambdaContainerHandler g new AwsProxyExceptionHandler()); } - public static Struts2LambdaContainerHandler getHttpApiV2ProxyHandler() { - return new Struts2LambdaContainerHandler( + public static StrutsLambdaContainerHandler getHttpApiV2ProxyHandler() { + return new StrutsLambdaContainerHandler( HttpApiV2ProxyRequest.class, AwsProxyResponse.class, new AwsHttpApiV2HttpServletRequestReader(), @@ -70,17 +81,17 @@ public static Struts2LambdaContainerHandler requestTypeClass, - Class responseTypeClass, - RequestReader requestReader, - ResponseWriter responseWriter, - SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler) { + public StrutsLambdaContainerHandler(Class requestTypeClass, + Class responseTypeClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler) { super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start(TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR); + Timer.start(TIMER_STRUTS_CONTAINER_CONSTRUCTOR); this.initialized = false; - Timer.stop(TIMER_STRUTS_2_CONTAINER_CONSTRUCTOR); + Timer.stop(TIMER_STRUTS_CONTAINER_CONSTRUCTOR); } @Override @@ -92,7 +103,7 @@ protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) throws Exception { - Timer.start(TIMER_STRUTS_2_HANDLE_REQUEST); + Timer.start(TIMER_STRUTS_HANDLE_REQUEST); if (!this.initialized) { initialize(); } @@ -105,13 +116,13 @@ protected void handleRequest(HttpServletRequest httpServletRequest, if (responseStatusCode != null) { httpServletResponse.setStatus(Integer.parseInt(responseStatusCode)); } - Timer.stop(TIMER_STRUTS_2_HANDLE_REQUEST); + Timer.stop(TIMER_STRUTS_HANDLE_REQUEST); } @Override public void initialize() throws ContainerInitializationException { log.info("Initialize Struts2 Lambda Application ..."); - Timer.start(TIMER_STRUTS_2_COLD_START_INIT); + Timer.start(TIMER_STRUTS_COLD_START_INIT); try { if (this.startupHandler != null) { this.startupHandler.onStartup(this.getServletContext()); @@ -123,12 +134,12 @@ public void initialize() throws ContainerInitializationException { EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), true, "/*"); } catch (Exception e) { - throw new ContainerInitializationException("Could not initialize Struts2", e); + throw new ContainerInitializationException("Could not initialize Struts container", e); } this.initialized = true; - Timer.stop(TIMER_STRUTS_2_COLD_START_INIT); - log.info("... initialize of Struts2 Lambda Application completed!"); + Timer.stop(TIMER_STRUTS_COLD_START_INIT); + log.info("... initialize of Struts Lambda Application completed!"); } public Servlet getServlet() { diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java similarity index 79% rename from aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java rename to aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java index b4aee76c..0e1ccfa1 100644 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts2/Struts2LambdaHandler.java +++ b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.struts2; +package com.amazonaws.serverless.proxy.struts; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -25,12 +25,12 @@ * The lambda handler to handle the requests. *

* - * com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + * com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest * */ -public class Struts2LambdaHandler implements RequestStreamHandler { +public class StrutsLambdaHandler implements RequestStreamHandler { - private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler + private final StrutsLambdaContainerHandler handler = StrutsLambdaContainerHandler .getAwsProxyHandler(); @Override diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java similarity index 95% rename from aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java index 60666f4a..b4f9ecf9 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/Struts2AwsProxyTest.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.proxy.struts2; +package com.amazonaws.serverless.proxy.struts; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; @@ -18,7 +18,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.struts2.echoapp.EchoAction; +import com.amazonaws.serverless.proxy.struts.echoapp.EchoAction; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -33,7 +33,11 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -45,7 +49,7 @@ * Unit test class for the Struts2 AWS_PROXY default implementation */ @RunWith(Parameterized.class) -public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { +public class StrutsAwsProxyTest extends StrutsJUnit4TestCase { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); @@ -56,15 +60,15 @@ public class Struts2AwsProxyTest extends StrutsJUnit4TestCase { private static ObjectMapper objectMapper = new ObjectMapper(); - private final Struts2LambdaContainerHandler handler = Struts2LambdaContainerHandler + private final StrutsLambdaContainerHandler handler = StrutsLambdaContainerHandler .getAwsProxyHandler(); - private final Struts2LambdaContainerHandler httpApiHandler = Struts2LambdaContainerHandler + private final StrutsLambdaContainerHandler httpApiHandler = StrutsLambdaContainerHandler .getHttpApiV2ProxyHandler(); private static Context lambdaContext = new MockLambdaContext(); private String type; - public Struts2AwsProxyTest(String reqType) { + public StrutsAwsProxyTest(String reqType) { type = reqType; } diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java similarity index 96% rename from aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java index bfaa0a69..d64a54ec 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoAction.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.proxy.struts2.echoapp; +package com.amazonaws.serverless.proxy.struts.echoapp; import com.opensymphony.xwork2.ActionSupport; import org.apache.commons.io.IOUtils; diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java similarity index 98% rename from aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java rename to aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java index 1d9c1697..554156e9 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts2/echoapp/EchoRequestInfoAction.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.proxy.struts2.echoapp; +package com.amazonaws.serverless.proxy.struts.echoapp; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; diff --git a/aws-serverless-java-container-struts/src/test/resources/struts.xml b/aws-serverless-java-container-struts/src/test/resources/struts.xml index 0c5dd832..92070be8 100644 --- a/aws-serverless-java-container-struts/src/test/resources/struts.xml +++ b/aws-serverless-java-container-struts/src/test/resources/struts.xml @@ -7,7 +7,7 @@ - + message @@ -15,7 +15,7 @@ - diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index a2cb228b..240979c7 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ configurations { dependencies { - implementation ('com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)') { + implementation ('com.amazonaws.serverless:aws-serverless-java-container-struts:[1.0,)') { exclude group: 'org.apache.struts', module: 'struts2-core' exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 19204eac..e2957a69 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -9,7 +9,7 @@ \${version} jar - Serverless Struts2 API + Serverless Struts API https://github.com/awslabs/aws-serverless-java-container @@ -24,7 +24,7 @@ com.amazonaws.serverless - aws-serverless-java-container-struts2 + aws-serverless-java-container-struts ${project.version} @@ -101,12 +101,6 @@ \${log4j.version} - - org.apache.logging.log4j - log4j-slf4j-impl - \${log4j.version} - - com.amazonaws aws-lambda-java-log4j2 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index f429ce66..12fc9fc0 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -7,7 +7,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler; +import com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler; import org.junit.BeforeClass; import org.junit.Test; @@ -26,12 +26,12 @@ public class StreamLambdaHandlerTest { - private static Struts2LambdaHandler handler; + private static StrutsLambdaHandler handler; private static Context lambdaContext; @BeforeClass public static void setUp() { - handler = new Struts2LambdaHandler(); + handler = new StrutsLambdaHandler(); lambdaContext = new MockLambdaContext(); } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml index 2025da62..fe446ded 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml @@ -22,7 +22,7 @@ #set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Apache Struts2 API - ${groupId}::${artifactId} +Description: AWS Serverless Apache Struts API - ${groupId}::${artifactId} Globals: Api: EndpointConfiguration: REGIONAL @@ -31,7 +31,7 @@ Resources: ${resourceName}Function: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + Handler: com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest Runtime: java11 CodeUri: . MemorySize: 512 diff --git a/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties index d731ebe8..80acd0f4 100644 --- a/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties +++ b/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties @@ -1,3 +1,3 @@ groupId=test.service -artifactId=struts2-archetype-test +artifactId=struts-archetype-test version=1.0-SNAPSHOT diff --git a/samples/struts2/pet-store/README.md b/samples/struts/pet-store/README.md similarity index 91% rename from samples/struts2/pet-store/README.md rename to samples/struts/pet-store/README.md index 80ad76b6..e421ac4e 100644 --- a/samples/struts2/pet-store/README.md +++ b/samples/struts/pet-store/README.md @@ -1,5 +1,5 @@ -# Serverless Struts2 example -A basic pet store written with the [Apache Struts framework](https://struts.apache.org). The `Struts2LambdaHandler` object provided by the `aws-serverless-java-container-struts2` is the main entry point for Lambda. +# Serverless Struts example +A basic pet store written with the [Apache Struts framework](https://struts.apache.org). The `StrutsLambdaHandler` object provided by the `aws-serverless-java-container-struts` is the main entry point for Lambda. The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition @@ -29,7 +29,7 @@ Once the deployment is completed, the SAM CLI will print out the stack's outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -Key Struts2PetStoreApi +Key StrutsPetStoreApi Description URL for application Value https://n60c1ycwa2.execute-api.eu-central-1.amazonaws.com/pets ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/samples/struts2/pet-store/build.gradle b/samples/struts/pet-store/build.gradle similarity index 100% rename from samples/struts2/pet-store/build.gradle rename to samples/struts/pet-store/build.gradle diff --git a/samples/struts2/pet-store/pom.xml b/samples/struts/pet-store/pom.xml similarity index 98% rename from samples/struts2/pet-store/pom.xml rename to samples/struts/pet-store/pom.xml index 562c8fb8..4f0a1e8d 100644 --- a/samples/struts2/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -7,7 +7,7 @@ com.amazonaws.serverless.sample serverless-struts-example 1.0-SNAPSHOT - Struts2 example for the aws-serverless-java-container library + Struts example for the aws-serverless-java-container library Simple pet store written with the Apache Struts framework https://aws.amazon.com/lambda/ diff --git a/samples/struts2/pet-store/src/main/assembly/dist.xml b/samples/struts/pet-store/src/main/assembly/dist.xml similarity index 100% rename from samples/struts2/pet-store/src/main/assembly/dist.xml rename to samples/struts/pet-store/src/main/assembly/dist.xml diff --git a/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java similarity index 100% rename from samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java rename to samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java diff --git a/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java similarity index 100% rename from samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java rename to samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java diff --git a/samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java similarity index 100% rename from samples/struts2/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java rename to samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java diff --git a/samples/struts2/pet-store/src/main/resources/log4j2.xml b/samples/struts/pet-store/src/main/resources/log4j2.xml similarity index 100% rename from samples/struts2/pet-store/src/main/resources/log4j2.xml rename to samples/struts/pet-store/src/main/resources/log4j2.xml diff --git a/samples/struts2/pet-store/src/main/resources/struts.xml b/samples/struts/pet-store/src/main/resources/struts.xml similarity index 100% rename from samples/struts2/pet-store/src/main/resources/struts.xml rename to samples/struts/pet-store/src/main/resources/struts.xml diff --git a/samples/struts2/pet-store/template.yml b/samples/struts/pet-store/template.yml similarity index 84% rename from samples/struts2/pet-store/template.yml rename to samples/struts/pet-store/template.yml index a3e794e9..94902ac9 100644 --- a/samples/struts2/pet-store/template.yml +++ b/samples/struts/pet-store/template.yml @@ -11,7 +11,7 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.proxy.struts2.Struts2LambdaHandler::handleRequest + Handler: com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest Runtime: java11 CodeUri: . MemorySize: 256 @@ -25,8 +25,8 @@ Resources: PayloadFormatVersion: '1.0' Outputs: - Struts2PetStoreApi: + StrutsPetStoreApi: Description: URL for application Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' Export: - Name: Struts2PetStoreApi + Name: StrutsPetStoreApi From cd60e6d537a46ec71999d2a0833866238b7651ee Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Wed, 17 Aug 2022 13:04:09 +0200 Subject: [PATCH 0516/1214] Rename maven struts version property for Struts implementation without version number https://github.com/awslabs/aws-serverless-java-container/issues/471 --- aws-serverless-java-container-struts/pom.xml | 8 ++++---- .../src/main/resources/archetype-resources/pom.xml | 10 +++++----- samples/struts/pet-store/pom.xml | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 94388723..a30571ca 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 2.5.30 + 2.5.30 @@ -29,7 +29,7 @@ org.apache.struts struts2-core - ${struts2.version} + ${struts.version} commons-io @@ -40,14 +40,14 @@ org.apache.struts struts2-json-plugin - ${struts2.version} + ${struts.version} test org.apache.struts struts2-junit-plugin - ${struts2.version} + ${struts.version} test diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index e2957a69..05685d6d 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 2.5.30 + 2.5.30 2.13.3 4.13.2 2.17.2 @@ -37,25 +37,25 @@ org.apache.struts struts2-convention-plugin - \${struts2.version} + \${struts.version} org.apache.struts struts2-rest-plugin - \${struts2.version} + \${struts.version} org.apache.struts struts2-bean-validation-plugin - \${struts2.version} + \${struts.version} org.apache.struts struts2-junit-plugin - \${struts2.version} + \${struts.version} test diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 4f0a1e8d..751fa1a5 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.30 + 2.5.30 2.13.3 4.13.2 2.17.2 @@ -48,25 +48,25 @@ org.apache.struts struts2-convention-plugin - ${struts2.version} + ${struts.version} org.apache.struts struts2-rest-plugin - ${struts2.version} + ${struts.version} org.apache.struts struts2-bean-validation-plugin - ${struts2.version} + ${struts.version} org.apache.struts struts2-junit-plugin - ${struts2.version} + ${struts.version} test From c6a9a462db7f983d10e3c173a0fb708c69d09223 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Fri, 16 Sep 2022 22:46:13 +0200 Subject: [PATCH 0517/1214] Use latest available Apache Struts2 GA version 6.0.3 https://github.com/awslabs/aws-serverless-java-container/issues/471 --- aws-serverless-java-container-struts/pom.xml | 2 +- .../struts/StrutsLambdaContainerHandler.java | 2 +- .../proxy/struts/StrutsAwsProxyTest.java | 65 ++++++++++--------- .../src/test/resources/log4j2.xml | 17 +++++ .../archetype-resources/build.gradle | 14 ++-- .../resources/archetype-resources/pom.xml | 20 ++++-- .../src/main/resources/struts.xml | 2 +- samples/struts/pet-store/build.gradle | 12 ++-- samples/struts/pet-store/pom.xml | 6 +- 9 files changed, 85 insertions(+), 55 deletions(-) create mode 100644 aws-serverless-java-container-struts/src/test/resources/log4j2.xml diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index a30571ca..c39bf516 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 2.5.30 + 6.0.3 diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java index 42ff0aee..09c460cf 100644 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java +++ b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java @@ -121,7 +121,7 @@ protected void handleRequest(HttpServletRequest httpServletRequest, @Override public void initialize() throws ContainerInitializationException { - log.info("Initialize Struts2 Lambda Application ..."); + log.info("Initialize Struts Lambda Application ..."); Timer.start(TIMER_STRUTS_COLD_START_INIT); try { if (this.startupHandler != null) { diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java index b4f9ecf9..eb890cf5 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; -import org.apache.struts2.StrutsJUnit4TestCase; +import org.apache.struts2.StrutsRestTestCase; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -49,24 +49,25 @@ * Unit test class for the Struts2 AWS_PROXY default implementation */ @RunWith(Parameterized.class) -public class StrutsAwsProxyTest extends StrutsJUnit4TestCase { +public class StrutsAwsProxyTest extends StrutsRestTestCase { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); + private static final String HTTP_METHOD_GET = "GET"; + private static final String QUERY_STRING_MODE = "mode"; private static final String QUERY_STRING_KEY = "message"; private static final String QUERY_STRING_ENCODED_VALUE = "Hello Struts2"; private static final String USER_PRINCIPAL = "user1"; private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json; charset=UTF-8"; - private static ObjectMapper objectMapper = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private final StrutsLambdaContainerHandler handler = StrutsLambdaContainerHandler .getAwsProxyHandler(); private final StrutsLambdaContainerHandler httpApiHandler = StrutsLambdaContainerHandler .getHttpApiV2ProxyHandler(); - private static Context lambdaContext = new MockLambdaContext(); - - private String type; + private final Context lambdaContext = new MockLambdaContext(); + private final String type; public StrutsAwsProxyTest(String reqType) { type = reqType; @@ -92,8 +93,8 @@ private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, C @Test public void headers_getHeaders_echo() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "headers") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "headers") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .json(); @@ -106,7 +107,7 @@ public void headers_getHeaders_echo() { @Test public void context_servletResponse_setCustomHeader() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) .queryString("customHeader", "true") .json(); @@ -118,7 +119,7 @@ public void context_servletResponse_setCustomHeader() { @Test public void context_serverInfo_correctContext() { assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) .queryString(QUERY_STRING_KEY, "Hello Struts2") .header("Content-Type", "application/json") .queryString("contentType", "true"); @@ -131,8 +132,8 @@ public void context_serverInfo_correctContext() { @Test public void queryString_uriInfo_echo() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "query-string") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "query-string") .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) .json(); @@ -146,8 +147,8 @@ public void queryString_uriInfo_echo() { @Test public void requestScheme_valid_expectHttps() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "scheme") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "scheme") .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) .json(); @@ -161,8 +162,8 @@ public void requestScheme_valid_expectHttps() { @Test public void authorizer_securityContext_customPrincipalSuccess() { assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "principal") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "principal") .json() .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); @@ -175,7 +176,7 @@ public void authorizer_securityContext_customPrincipalSuccess() { @Test public void errors_unknownRoute_expect404() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", "GET"); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", HTTP_METHOD_GET); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); @@ -184,7 +185,7 @@ public void errors_unknownRoute_expect404() { @Test public void error_contentType_invalidContentType() { AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString("mode", "content-type") + .queryString(QUERY_STRING_MODE, "content-type") .header("Content-Type", "application/octet-stream") .body("asdasdasd"); @@ -195,7 +196,7 @@ public void error_contentType_invalidContentType() { @Test public void error_statusCode_methodNotAllowed() { AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString("mode", "not-allowed") + .queryString(QUERY_STRING_MODE, "not-allowed") .json(); AwsProxyResponse output = executeRequest(request, lambdaContext); @@ -209,7 +210,7 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "POST") .json() - .body(objectMapper.writeValueAsString(value)); + .body(OBJECT_MAPPER.writeValueAsString(value)); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -220,8 +221,8 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti @Test public void statusCode_responseStatusCode_customStatusCode() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "custom-status-code") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "custom-status-code") .queryString("status", "201") .json(); @@ -231,7 +232,7 @@ public void statusCode_responseStatusCode_customStatusCode() { @Test public void base64_binaryResponse_base64Encoding() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET"); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET); AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); @@ -241,7 +242,7 @@ public void base64_binaryResponse_base64Encoding() { @Test public void exception_mapException_mapToNotImplemented() { AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString("mode", "not-implemented"); + .queryString(QUERY_STRING_MODE, "not-implemented"); AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); @@ -251,7 +252,7 @@ public void exception_mapException_mapToNotImplemented() { @Test public void stripBasePath_route_shouldRouteCorrectly() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", HTTP_METHOD_GET) .json() .queryString(QUERY_STRING_KEY, "stripped"); handler.stripBasePath("/custompath"); @@ -263,7 +264,7 @@ public void stripBasePath_route_shouldRouteCorrectly() { @Test public void stripBasePath_route_shouldReturn404() { - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", "GET") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", HTTP_METHOD_GET) .json() .queryString("status", "201"); handler.stripBasePath("/custom"); @@ -275,8 +276,8 @@ public void stripBasePath_route_shouldReturn404() { @Test public void securityContext_injectPrincipal_expectPrincipalName() { assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "GET") - .queryString("mode", "principal") + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) + .queryString(QUERY_STRING_MODE, "principal") .authorizerPrincipal(USER_PRINCIPAL); AwsProxyResponse resp = executeRequest(request, lambdaContext); @@ -295,7 +296,7 @@ public void queryParam_encoding_expectUnencodedParam() { e.printStackTrace(); fail("Could not decode parameter"); } - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, decodedParam); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, decodedParam); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); @@ -306,7 +307,7 @@ public void queryParam_encoding_expectUnencodedParam() { public void queryParam_encoding_expectEncodedParam() { assumeTrue("API_GW".equals(type)); String paramValue = "p%2Fz%2B3"; - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "GET").queryString(QUERY_STRING_KEY, paramValue); + AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, paramValue); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); @@ -323,7 +324,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin TypeReference> typeRef = new TypeReference>() { }; - HashMap response = objectMapper.readValue(output.getBody(), typeRef); + HashMap response = OBJECT_MAPPER.readValue(output.getBody(), typeRef); assertNotNull(response.get(key)); assertEquals(value, response.get(key)); } catch (IOException e) { @@ -335,7 +336,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin private void validateSingleValueModel(AwsProxyResponse output, String value) { try { assertNotNull(output.getBody()); - assertEquals(value, objectMapper.readerFor(String.class).readValue(output.getBody())); + assertEquals(value, OBJECT_MAPPER.readerFor(String.class).readValue(output.getBody())); } catch (Exception e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); diff --git a/aws-serverless-java-container-struts/src/test/resources/log4j2.xml b/aws-serverless-java-container-struts/src/test/resources/log4j2.xml new file mode 100644 index 00000000..55ed0d21 --- /dev/null +++ b/aws-serverless-java-container-struts/src/test/resources/log4j2.xml @@ -0,0 +1,17 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n + + + + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 240979c7..b44a7dfa 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,22 +18,22 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:2.5.30') { + implementation ('org.apache.struts:struts2-convention-plugin:6.0.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:2.5.30') { + implementation ('org.apache.struts:struts2-rest-plugin:6.0.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:2.5.30') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:6.0.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0') { + implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:2.5.30') { + implementation ('org.apache.struts:struts2-core:6.0.3') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.hibernate:hibernate-validator:5.4.3.Final') + implementation ('org.hibernate:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3') implementation ('org.apache.logging.log4j:log4j-core:2.17.2') implementation ('org.apache.logging.log4j:log4j-api:2.17.2') @@ -41,7 +41,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:2.5.30') { + testImplementation('org.apache.struts:struts2-junit-plugin:6.0.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 05685d6d..e9d3b8b4 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,12 +15,19 @@ 1.8 1.8 - 2.5.30 + 6.0.3 2.13.3 4.13.2 - 2.17.2 + 2.18.0 + + + struts-staging + https://repository.apache.org/content/repositories/staging/ + + + com.amazonaws.serverless @@ -63,14 +70,14 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.3.0 + 1.4.0 org.hibernate hibernate-validator - 5.4.3.Final + 6.1.7.Final @@ -88,6 +95,11 @@ jackson-databind \${jackson.version} + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + \${jackson.version} + org.apache.logging.log4j diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml index 5b86eb97..f6975ffd 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml @@ -24,7 +24,7 @@ + class="org.apache.struts2.rest.handler.JacksonJsonHandler"/> diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 1d734194..a28ffc6c 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,12 +14,12 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', - 'org.apache.struts:struts2-convention-plugin:2.5.30', - 'org.apache.struts:struts2-rest-plugin:2.5.30', - 'org.apache.struts:struts2-bean-validation-plugin:2.5.30', - 'org.apache.struts:struts2-junit-plugin:2.5.30', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.3.0', - 'org.hibernate:hibernate-validator:5.4.3.Final', + 'org.apache.struts:struts2-convention-plugin:6.0.3', + 'org.apache.struts:struts2-rest-plugin:6.0.3', + 'org.apache.struts:struts2-bean-validation-plugin:6.0.3', + 'org.apache.struts:struts2-junit-plugin:6.0.3', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0', + 'org.hibernate:hibernate-validator:6.1.7.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.3', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 751fa1a5..bb307b01 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.5.30 + 6.0.3 2.13.3 4.13.2 2.17.2 @@ -74,14 +74,14 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.3.0 + 1.4.0 org.hibernate hibernate-validator - 5.4.3.Final + 6.1.7.Final From 4daafe8c96fac19c3f91256a8e8e5b8af0ba9cae Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sat, 17 Sep 2022 14:47:00 +0200 Subject: [PATCH 0518/1214] chore(deps): add missing jackson-dataformat-xml dependency (#471) --- .../src/main/resources/archetype-resources/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index b44a7dfa..c40547bb 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,6 +35,7 @@ dependencies { } implementation ('org.hibernate:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3') implementation ('org.apache.logging.log4j:log4j-core:2.17.2') implementation ('org.apache.logging.log4j:log4j-api:2.17.2') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') From c7fb0d1c1746239c639db58a1f563429a39f03df Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 21 Sep 2022 15:54:32 +0200 Subject: [PATCH 0519/1214] chore(deps): Update Spring boot dependency for Gradle sample aws well --- samples/springboot2/pet-store/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 60c4c2de..8a68214f 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.6.7') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', From effeade645f07df184f9800e1627f7c289acc374 Mon Sep 17 00:00:00 2001 From: Andy Boothe Date: Thu, 28 Jul 2022 23:16:41 -0500 Subject: [PATCH 0520/1214] feat: add single value headers and query string params (#315) --- .../proxy/model/AwsProxyRequest.java | 25 ++++- .../proxy/model/SingleValueHeaders.java | 24 ++++ .../proxy/model/AwsProxyRequestTest.java | 103 +++++++----------- 3 files changed, 83 insertions(+), 69 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/SingleValueHeaders.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index d361d674..440421a7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -12,13 +12,12 @@ */ package com.amazonaws.serverless.proxy.model; +import java.util.HashMap; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashMap; -import java.util.Map; - /** * Default implementation of the request object from an API Gateway AWS_PROXY integration */ @@ -33,7 +32,9 @@ public class AwsProxyRequest { private String resource; private AwsProxyRequestContext requestContext; private MultiValuedTreeMap multiValueQueryStringParameters; + private Map queryStringParameters; private Headers multiValueHeaders; + private SingleValueHeaders headers; private Map pathParameters; private String httpMethod; private Map stageVariables; @@ -113,21 +114,35 @@ public MultiValuedTreeMap getMultiValueQueryStringParameters() { return multiValueQueryStringParameters; } - public void setMultiValueQueryStringParameters( MultiValuedTreeMap multiValueQueryStringParameters) { this.multiValueQueryStringParameters = multiValueQueryStringParameters; } + public Map getQueryStringParameters() { + return queryStringParameters; + } + + public void setQueryStringParameters(Map queryStringParameters) { + this.queryStringParameters = queryStringParameters; + } + public Headers getMultiValueHeaders() { return multiValueHeaders; } - public void setMultiValueHeaders(Headers multiValueHeaders) { this.multiValueHeaders = multiValueHeaders; } + public SingleValueHeaders getHeaders() { + return headers; + } + + public void setHeaders(SingleValueHeaders headers) { + this.headers = headers; + } + public Map getPathParameters() { return pathParameters; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/SingleValueHeaders.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/SingleValueHeaders.java new file mode 100644 index 00000000..6dbf0393 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/SingleValueHeaders.java @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +import java.util.TreeMap; + +public class SingleValueHeaders extends TreeMap { + + private static final long serialVersionUID = 42L; + + public SingleValueHeaders() { + super(String.CASE_INSENSITIVE_ORDER); + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java index 50f5cf05..b06e04cf 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -1,75 +1,19 @@ package com.amazonaws.serverless.proxy.model; +import static junit.framework.TestCase.assertTrue; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import java.io.IOException; +import org.junit.Test; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; - -import java.io.IOException; - -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.*; public class AwsProxyRequestTest { private static final String CUSTOM_HEADER_KEY_LOWER_CASE = "custom-header"; private static final String CUSTOM_HEADER_VALUE = "123456"; - public static final String REQUEST_JSON = "{\n" + - " \"resource\": \"/api/{proxy+}\",\n" + - " \"path\": \"/api/endpoint\",\n" + - " \"httpMethod\": \"OPTIONS\",\n" + - " \"headers\": {\n" + - " \"Accept\": \"*/*\",\n" + - " \"User-Agent\": \"PostmanRuntime/7.1.1\",\n" + - " \"" + CUSTOM_HEADER_KEY_LOWER_CASE +"\":" + "\"" + CUSTOM_HEADER_VALUE + "\"\n" + - " },\n" + - " \"multiValueHeaders\": {\n" + - " \"Accept\": [\n" + - " \"*/*\"\n" + - " ],\n" + - " \"User-Agent\": [\n" + - " \"PostmanRuntime/7.1.1\"\n" + - " ],\n" + - " \"" + CUSTOM_HEADER_KEY_LOWER_CASE + "\": [\n" + - " \"" + CUSTOM_HEADER_VALUE + "\"\n" + - " ]\n" + - " },\n" + - " \"queryStringParameters\": null,\n" + - " \"multiValueQueryStringParameters\": null,\n" + - " \"pathParameters\": {\n" + - " \"proxy\": \"endpoint\"\n" + - " },\n" + - " \"stageVariables\": null,\n" + - " \"requestContext\": {\n" + - " \"resourceId\": null,\n" + - " \"resourcePath\": \"/api/{proxy+}\",\n" + - " \"httpMethod\": \"OPTIONS\",\n" + - " \"extendedRequestId\": null,\n" + - " \"requestTime\": \"15/Dec/2018:20:37:47 +0000\",\n" + - " \"path\": \"/api/endpoint\",\n" + - " \"accountId\": null,\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"stage\": \"stage_name\",\n" + - " \"domainPrefix\": null,\n" + - " \"requestTimeEpoch\": 1544906267828,\n" + - " \"requestId\": null,\n" + - " \"identity\": {\n" + - " \"cognitoIdentityPoolId\": null,\n" + - " \"accountId\": null,\n" + - " \"cognitoIdentityId\": null,\n" + - " \"caller\": null,\n" + - " \"sourceIp\": \"54.240.196.171\",\n" + - " \"accessKey\": null,\n" + - " \"cognitoAuthenticationType\": null,\n" + - " \"cognitoAuthenticationProvider\": null,\n" + - " \"userArn\": null,\n" + - " \"userAgent\": \"PostmanRuntime/7.1.1\",\n" + - " \"user\": null\n" + - " },\n" + - " \"domainName\": \"https://apiId.execute-api.eu-central-1.amazonaws.com/\",\n" + - " \"apiId\": \"apiId\"\n" + - " },\n" + - " \"body\": null,\n" + - " \"isBase64Encoded\": true\n" + - "}"; @Test public void deserialize_multiValuedHeaders_caseInsensitive() throws IOException { @@ -160,4 +104,35 @@ private String getRequestJson(boolean base64Encoded, String headerKey, String he " \"isBase64Encoded\": " + (base64Encoded?"true":"false") + "\n" + "}"; } + + @Test + public void deserialize_singleValuedHeaders() throws IOException { + AwsProxyRequest req = + new AwsProxyRequestBuilder().fromJsonString(getSingleValueRequestJson()).build(); + + assertThat(req.getHeaders().get("accept"), is("*")); + } + + /** + * Captured from a live request to an ALB with a Lambda integration with + * lambda.multi_value_headers.enabled=false. + */ + private String getSingleValueRequestJson() { + return "{\n" + " \"requestContext\": {\n" + " \"elb\": {\n" + + " \"targetGroupArn\": \"arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/prod-example-function/e77803ebb6d2c24\"\n" + + " }\n" + " },\n" + " \"httpMethod\": \"PUT\",\n" + + " \"path\": \"/path/to/resource\",\n" + " \"queryStringParameters\": {},\n" + + " \"headers\": {\n" + " \"accept\": \"*\",\n" + + " \"content-length\": \"17\",\n" + + " \"content-type\": \"application/json\",\n" + + " \"host\": \"stackoverflow.name\",\n" + + " \"user-agent\": \"curl/7.77.0\",\n" + + " \"x-amzn-trace-id\": \"Root=1-62e22402-3a5f246225e45edd7735c182\",\n" + + " \"x-forwarded-for\": \"24.14.13.186\",\n" + + " \"x-forwarded-port\": \"443\",\n" + + " \"x-forwarded-proto\": \"https\",\n" + + " \"x-jersey-tracing-accept\": \"true\"\n" + " },\n" + + " \"body\": \"{\\\"alpha\\\":\\\"bravo\\\"}\",\n" + + " \"isBase64Encoded\": false\n" + "} \n"; + } } From aab7e36337417329f92a357d2417925fed52391e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 21 Sep 2022 16:46:05 +0200 Subject: [PATCH 0521/1214] chore(deps): update Jackson version to 2.13.4 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 2 +- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 08c10203..641e1194 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 93dccc59..fb51be10 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.36 - 2.13.3 + 2.13.4 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 4fe67241..62864d91 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 678d2cf1..4e5993bb 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.13.3 + 2.13.4 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 4497f8c8..bafa639b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index c40547bb..8d2fb858 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') implementation ('org.apache.logging.log4j:log4j-core:2.17.2') implementation ('org.apache.logging.log4j:log4j-api:2.17.2') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index e9d3b8b4..cdfdaf66 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.0.3 - 2.13.3 + 2.13.4 4.13.2 2.18.0 diff --git a/pom.xml b/pom.xml index b752bb12..167d5e7a 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 7.1.0 - 2.13.3 + 2.13.4 1.7.36 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index e01cde9f..1083441f 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index ffdc2db8..926d79c7 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.36 - 2.13.3 + 2.13.4 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index dc6a63db..18639710 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index e46eff94..d064704d 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.13.3 + 2.13.4 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index d25e400e..aea0b9fe 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index a28ffc6c..f5b58c1a 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -20,7 +20,7 @@ dependencies { 'org.apache.struts:struts2-junit-plugin:6.0.3', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0', 'org.hibernate:hibernate-validator:6.1.7.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'org.apache.logging.log4j:log4j-core:2.17.2', 'org.apache.logging.log4j:log4j-api:2.17.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index bb307b01..4d457ec1 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.0.3 - 2.13.3 + 2.13.4 4.13.2 2.17.2 From afe6b97e315bc948a01e14de822c043b38113866 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 21 Sep 2022 17:34:03 +0200 Subject: [PATCH 0522/1214] chore(deps): update SLF4J to 2.0.2 and Log4J to 2.19.0 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 6 +++--- samples/struts/pet-store/pom.xml | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index bafa639b..8a7394cf 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.22', 'org.springframework:spring-context:5.3.22', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.2', - 'org.apache.logging.log4j:log4j-api:2.17.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', + 'org.apache.logging.log4j:log4j-core:2.19.0', + 'org.apache.logging.log4j:log4j-api:2.19.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index b3597de5..77334f2d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 5.3.22 4.13.2 - 2.17.2 + 2.19.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 8d2fb858..01368d93 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') - implementation ('org.apache.logging.log4j:log4j-core:2.17.2') - implementation ('org.apache.logging.log4j:log4j-api:2.17.2') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.17.2') + implementation ('org.apache.logging.log4j:log4j-core:2.19.0') + implementation ('org.apache.logging.log4j:log4j-api:2.19.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index cdfdaf66..7ced173a 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 6.0.3 2.13.4 4.13.2 - 2.18.0 + 2.19.0 diff --git a/pom.xml b/pom.xml index 167d5e7a..99563d4d 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 7.1.0 2.13.4 - 1.7.36 + 2.0.2 UTF-8 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index aea0b9fe..05c79cc6 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:5.3.22', 'org.springframework:spring-context:5.3.22', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', - 'org.apache.logging.log4j:log4j-core:2.17.2', - 'org.apache.logging.log4j:log4j-api:2.17.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', + 'org.apache.logging.log4j:log4j-core:2.19.0', + 'org.apache.logging.log4j:log4j-api:2.19.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', 'com.fasterxml.jackson.core:jackson-databind:2.13.4', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ea06bddf..645982b6 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -28,7 +28,7 @@ 1.8 5.3.22 4.13.2 - 2.17.2 + 2.19.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index f5b58c1a..67eb31db 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -21,9 +21,9 @@ dependencies { 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0', 'org.hibernate:hibernate-validator:6.1.7.Final', 'com.fasterxml.jackson.core:jackson-databind:2.13.4', - 'org.apache.logging.log4j:log4j-core:2.17.2', - 'org.apache.logging.log4j:log4j-api:2.17.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2', + 'org.apache.logging.log4j:log4j-core:2.19.0', + 'org.apache.logging.log4j:log4j-api:2.19.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 4d457ec1..178223d6 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 6.0.3 2.13.4 4.13.2 - 2.17.2 + 2.19.0 From a1f3156a207420d15c8bab56452f68da29e3ca95 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 21 Sep 2022 18:53:18 +0000 Subject: [PATCH 0523/1214] chore: release -prepare release aws-serverless-java-container-1.9 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f87eb119..d562841c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d5223458..939c70b6 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.9 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 03690328..07d7a0fd 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.9 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ed42b240..efc30c67 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.9 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 0779abd2..9902d27f 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9-SNAPSHOT + 1.9 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 5.3.22 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.9 diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index c39bf516..79f60fc1 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9-SNAPSHOT + 1.9 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8f0a225c..4226da7a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9-SNAPSHOT + 1.9 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index fea28b1f..c55b66d7 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9-SNAPSHOT + 1.9 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 723de360..3ca1019b 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9-SNAPSHOT + 1.9 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index ecf410f5..4a09c1b4 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9-SNAPSHOT + 1.9 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index 9eed0080..d261ef8d 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9-SNAPSHOT + 1.9 com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.9-SNAPSHOT + 1.9 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 diff --git a/pom.xml b/pom.xml index 99563d4d..be5a8bc9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9-SNAPSHOT + 1.9 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9 From 8b01a81f990ac1d06760fddaf8abbe66b0d9d14e Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 21 Sep 2022 18:53:20 +0000 Subject: [PATCH 0524/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index d562841c..927fdc9c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 939c70b6..da9f5795 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9 + 1.10-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 07d7a0fd..37114059 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index efc30c67..3a8130f7 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 9902d27f..2f0ec121 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9 + 1.10-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT 5.3.22 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 79f60fc1..e251dac8 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9 + 1.10-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 4226da7a..c13c0586 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index c55b66d7..ca3ad395 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 3ca1019b..83dc7974 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 4a09c1b4..1e7279db 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index d261ef8d..b91cfa4b 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.9 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD diff --git a/pom.xml b/pom.xml index be5a8bc9..07c22c82 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9 + 1.10-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9 + HEAD From 120c458b8e89971e3d910188f18e5a8f002fc38f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 21 Sep 2022 20:19:48 +0200 Subject: [PATCH 0525/1214] chore(deps): Update Jersey dependencies to 2.37 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index da9f5795..7c177c34 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.36 + 2.37 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 641e1194..f7af0b4f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,13 +13,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.36") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.37") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.36") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.37") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index fb51be10..99a75e72 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,7 @@ 1.8 1.8 - 2.36 + 2.37 2.13.4 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 1083441f..8392a2af 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -13,13 +13,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.36") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.37") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.36") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.37") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 926d79c7..44efd8ab 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.36 + 2.37 2.13.4 From 68a94486a02f0c1e804d0db4a743bad18e03c124 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 21 Sep 2022 21:39:20 +0200 Subject: [PATCH 0526/1214] docs: Remove duplicate link to Struts quick start --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4c0a4c99..ad346169 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serve * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) -* [Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) (outdated! - needs to be updated to latest Micronaut version) From 1ac487ce50b15caa9db0ea8ce9409fef7d037d9d Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Sun, 9 Oct 2022 21:02:32 +0200 Subject: [PATCH 0527/1214] Fix broken struts pet-store sample project https://github.com/awslabs/aws-serverless-java-container/issues/479 --- .../archetype-resources/build.gradle | 4 +- .../resources/archetype-resources/pom.xml | 4 +- samples/struts/pet-store/README.md | 17 ++- samples/struts/pet-store/build.gradle | 12 +- samples/struts/pet-store/pom.xml | 31 +++-- .../pet-store/src/main/resources/struts.xml | 2 +- samples/struts/pet-store/template.yml | 2 +- samples/struts/pet-store/test-event.json | 123 ++++++++++++++++++ 8 files changed, 169 insertions(+), 26 deletions(-) create mode 100644 samples/struts/pet-store/test-event.json diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 01368d93..595282f8 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -27,13 +27,13 @@ dependencies { implementation ('org.apache.struts:struts2-bean-validation-plugin:6.0.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0') { + implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('org.apache.struts:struts2-core:6.0.3') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } - implementation ('org.hibernate:hibernate-validator:6.1.7.Final') + implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 7ced173a..d4c321b1 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -70,12 +70,12 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.4.0 + 1.4.2 - org.hibernate + org.hibernate.validator hibernate-validator 6.1.7.Final diff --git a/samples/struts/pet-store/README.md b/samples/struts/pet-store/README.md index e421ac4e..bc5c047a 100644 --- a/samples/struts/pet-store/README.md +++ b/samples/struts/pet-store/README.md @@ -8,12 +8,21 @@ The application can be deployed in an AWS account using the [Serverless Applicat * [SAM CLI](https://github.com/awslabs/aws-sam-cli) * [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + ## Deployment In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package ``` -$ sam build +$ mvn package && sam build +``` + +### Test Local + +``` +$ sam local invoke -e test-event.json ``` +### Deploy Sample Application + This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen @@ -31,17 +40,17 @@ Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Key StrutsPetStoreApi Description URL for application -Value https://n60c1ycwa2.execute-api.eu-central-1.amazonaws.com/pets +Value https://xxxxxxxxxx.execute-api..amazonaws.com/pets ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ``` ## Test ### JSON Request: ``` -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets.json +$ curl https://xxxxxxxxxx.execute-api..amazonaws.com/pets.json ``` ### XML Request ``` -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets.xml +$ curl https://xxxxxxxxxx.execute-api..amazonaws.com/pets.xml ``` \ No newline at end of file diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 67eb31db..d204a211 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -13,17 +13,19 @@ configurations { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-struts2:[1.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', 'org.apache.struts:struts2-convention-plugin:6.0.3', 'org.apache.struts:struts2-rest-plugin:6.0.3', 'org.apache.struts:struts2-bean-validation-plugin:6.0.3', 'org.apache.struts:struts2-junit-plugin:6.0.3', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.0', - 'org.hibernate:hibernate-validator:6.1.7.Final', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', + 'org.hibernate.validator:hibernate-validator:6.1.7.Final', + 'org.glassfish:javax.el:3.0.0', + 'javax.el:javax.el-api:3.0.0', + 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 178223d6..91cbfd77 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.0.3 - 2.13.4 + 2.13.3 4.13.2 2.19.0 @@ -35,8 +35,8 @@ com.amazonaws.serverless - aws-serverless-java-container-struts2 - [1.6,) + aws-serverless-java-container-struts + [1.9,) @@ -74,15 +74,25 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.4.0 + 1.4.2 - org.hibernate + org.hibernate.validator hibernate-validator 6.1.7.Final + + org.glassfish + javax.el + 3.0.0 + + + javax.el + javax.el-api + 3.0.0 + com.fasterxml.jackson.core @@ -99,22 +109,21 @@ jackson-databind ${jackson.version} - - org.apache.logging.log4j - log4j-core - ${log4j.version} + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} org.apache.logging.log4j - log4j-api + log4j-core ${log4j.version} org.apache.logging.log4j - log4j-slf4j-impl + log4j-api ${log4j.version} diff --git a/samples/struts/pet-store/src/main/resources/struts.xml b/samples/struts/pet-store/src/main/resources/struts.xml index 038370d3..3f6724e5 100644 --- a/samples/struts/pet-store/src/main/resources/struts.xml +++ b/samples/struts/pet-store/src/main/resources/struts.xml @@ -23,7 +23,7 @@ + class="org.apache.struts2.rest.handler.JacksonJsonHandler"/> diff --git a/samples/struts/pet-store/template.yml b/samples/struts/pet-store/template.yml index 94902ac9..85870c6b 100644 --- a/samples/struts/pet-store/template.yml +++ b/samples/struts/pet-store/template.yml @@ -14,7 +14,7 @@ Resources: Handler: com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest Runtime: java11 CodeUri: . - MemorySize: 256 + MemorySize: 512 Policies: AWSLambdaBasicExecutionRole Timeout: 30 Events: diff --git a/samples/struts/pet-store/test-event.json b/samples/struts/pet-store/test-event.json new file mode 100644 index 00000000..5860f3e8 --- /dev/null +++ b/samples/struts/pet-store/test-event.json @@ -0,0 +1,123 @@ +{ + "body": "eyJ0ZXN0IjoiYm9keSJ9", + "resource": "/{proxy+}", + "path": "/pets.json", + "httpMethod": "GET", + "isBase64Encoded": true, + "queryStringParameters": { + "foo": "bar" + }, + "multiValueQueryStringParameters": { + "foo": [ + "bar" + ] + }, + "pathParameters": { + "proxy": "/path/to/resource" + }, + "stageVariables": { + "baz": "qux" + }, + "headers": { + "Accept": "application/json", + "Accept-Encoding": "gzip, deflate, sdch", + "Accept-Language": "en-US,en;q=0.8", + "Cache-Control": "max-age=0", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Custom User Agent String", + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "multiValueHeaders": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" + ], + "Accept-Encoding": [ + "gzip, deflate, sdch" + ], + "Accept-Language": [ + "en-US,en;q=0.8" + ], + "Cache-Control": [ + "max-age=0" + ], + "CloudFront-Forwarded-Proto": [ + "https" + ], + "CloudFront-Is-Desktop-Viewer": [ + "true" + ], + "CloudFront-Is-Mobile-Viewer": [ + "false" + ], + "CloudFront-Is-SmartTV-Viewer": [ + "false" + ], + "CloudFront-Is-Tablet-Viewer": [ + "false" + ], + "CloudFront-Viewer-Country": [ + "US" + ], + "Host": [ + "0123456789.execute-api.us-east-1.amazonaws.com" + ], + "Upgrade-Insecure-Requests": [ + "1" + ], + "User-Agent": [ + "Custom User Agent String" + ], + "Via": [ + "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)" + ], + "X-Amz-Cf-Id": [ + "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==" + ], + "X-Forwarded-For": [ + "127.0.0.1, 127.0.0.2" + ], + "X-Forwarded-Port": [ + "443" + ], + "X-Forwarded-Proto": [ + "https" + ] + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "123456", + "stage": "prod", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "requestTime": "09/Apr/2015:12:34:56 +0000", + "requestTimeEpoch": 1428582896000, + "identity": { + "cognitoIdentityPoolId": null, + "accountId": null, + "cognitoIdentityId": null, + "caller": null, + "accessKey": null, + "sourceIp": "127.0.0.1", + "cognitoAuthenticationType": null, + "cognitoAuthenticationProvider": null, + "userArn": null, + "userAgent": "Custom User Agent String", + "user": null + }, + "path": "/pets.json", + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "1234567890", + "protocol": "HTTP/1.1" + } +} \ No newline at end of file From f661147e6ec7bde419aa15e44d894045de3da551 Mon Sep 17 00:00:00 2001 From: Johannes Geppert Date: Mon, 10 Oct 2022 17:55:08 +0200 Subject: [PATCH 0528/1214] Revert downgrade of jackson lib https://github.com/awslabs/aws-serverless-java-container/issues/479 --- samples/struts/pet-store/build.gradle | 2 +- samples/struts/pet-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index d204a211..dd26cf2a 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -23,7 +23,7 @@ dependencies { 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', 'com.fasterxml.jackson.core:jackson-databind:2.13.3', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.3', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 91cbfd77..b4259b05 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.0.3 - 2.13.3 + 2.13.4 4.13.2 2.19.0 From b370c4a4ed53283b73e66ef729556c2791ef3e71 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Oct 2022 08:57:23 +0200 Subject: [PATCH 0529/1214] chore(deps): CVE-2022-42003 update Jackson databind version to 2.13.4.2 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 2 +- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 927fdc9c..d69814a3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -46,7 +46,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 7c177c34..d7346753 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -66,7 +66,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 3a8130f7..a8cb9e91 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -55,7 +55,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 test diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index e251dac8..83dacfda 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -62,7 +62,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index f7af0b4f..94533105 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 62864d91..2f3bcae2 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 8a7394cf..93a6e9b6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 595282f8..4b20eb87 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4.2') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 8392a2af..a16021ee 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 44efd8ab..04f7456b 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -78,7 +78,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 18639710..ff586e42 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index d064704d..49c85683 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -48,7 +48,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 05c79cc6..06b4d3f8 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index dd26cf2a..66bbec74 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,7 +22,7 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.3', + 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index b4259b05..a807c10f 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -107,7 +107,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} + ${jackson.version}.2 com.fasterxml.jackson.dataformat From 9320edddfb0432dbf8845605df07d8d0d8661ba5 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Oct 2022 08:58:10 +0200 Subject: [PATCH 0530/1214] chore(deps): CVE-2022-42889 explicitly set version for transitive commons-text dependency --- aws-serverless-java-container-struts/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 83dacfda..d7730d93 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -94,6 +94,11 @@ commons-io 2.11.0 + + org.apache.commons + commons-text + 1.10.0 + From 1996b822ca0f486313c99314ed7559dcfc98a5d0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 10 Nov 2022 18:47:44 +0100 Subject: [PATCH 0531/1214] fix: Spring Boot 2 sample template, partially reverts commit 0b92c8ec9c6d8955ee6e311e668282a754d80d7d (#484) --- samples/springboot2/pet-store/template.yml | 26 ++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/samples/springboot2/pet-store/template.yml b/samples/springboot2/pet-store/template.yml index 6e8ee653..c7a17276 100644 --- a/samples/springboot2/pet-store/template.yml +++ b/samples/springboot2/pet-store/template.yml @@ -17,18 +17,16 @@ Resources: MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole Timeout: 60 - FunctionUrlConfig: - AuthType: NONE -# Events: -# HttpApiEvent: -# Type: HttpApi -# Properties: -# TimeoutInMillis: 20000 -# PayloadFormatVersion: '1.0' + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' -#Outputs: -# SpringBootPetStoreApi: -# Description: URL for application -# Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' -# Export: -# Name: SpringBootPetStoreApi +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: SpringBootPetStoreApi From 61ca5658f9712121a4e0f99433e3082dffeeeac0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 10 Nov 2022 21:09:25 +0100 Subject: [PATCH 0532/1214] chore: update some Maven plugins to allow build with JDK17 --- aws-serverless-java-container-core/pom.xml | 1 - aws-serverless-java-container-jersey/pom.xml | 2 -- aws-serverless-java-container-spark/pom.xml | 1 - aws-serverless-java-container-spring/pom.xml | 1 - .../pom.xml | 1 - aws-serverless-java-container-struts/pom.xml | 1 - pom.xml | 15 +++++++--- spotbugs-excludeFilter.xml | 28 +++++++++++++++++++ 8 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 spotbugs-excludeFilter.xml diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index d69814a3..ccf943a3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -110,7 +110,6 @@ org.jacoco jacoco-maven-plugin - 0.8.6 ${basedir}/target/coverage-reports/jacoco-unit.exec ${basedir}/target/coverage-reports/jacoco-unit.exec diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d7346753..6600c111 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -107,7 +107,6 @@ org.jacoco jacoco-maven-plugin - 0.8.6 ${basedir}/target/coverage-reports/jacoco-unit.exec ${basedir}/target/coverage-reports/jacoco-unit.exec @@ -160,7 +159,6 @@ com.github.spotbugs spotbugs-maven-plugin - 4.2.0 Low + + High true ${project.build.directory}/spotbugs - + ${session.executionRootDirectory}/spotbugs-excludeFilter.xml com.h3xstream.findsecbugs findsecbugs-plugin - 1.7.1 + 1.12.0 + + org.jacoco + jacoco-maven-plugin + 0.8.8 + diff --git a/spotbugs-excludeFilter.xml b/spotbugs-excludeFilter.xml new file mode 100644 index 00000000..b26b1ad2 --- /dev/null +++ b/spotbugs-excludeFilter.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file From f92b42aa60811800aafc19fc105c13e95bd1ac2d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 11 Nov 2022 10:58:20 +0100 Subject: [PATCH 0533/1214] chore(deps): update Jackson version to 2.14.0 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-struts/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 2 +- samples/struts/pet-store/pom.xml | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ccf943a3..7047e9a5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -46,7 +46,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 6600c111..11c9ee9c 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -66,7 +66,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} true test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 3dc52fb6..0d672153 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -55,7 +55,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} test diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index fa9c9842..9ba43370 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -62,7 +62,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 94533105..381bc42e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 2f3bcae2..95cf50f9 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 93a6e9b6..457feec6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 4b20eb87..f2f7598c 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,7 +34,7 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.4.2') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.0') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') diff --git a/pom.xml b/pom.xml index 9b1487e8..09af4a99 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 7.3.0 - 2.13.4 + 2.14.0 2.0.2 UTF-8 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index a16021ee..10af02e0 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.amazonaws:aws-lambda-java-core:1.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 04f7456b..44efd8ab 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -78,7 +78,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index ff586e42..053d46ec 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 49c85683..d064704d 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -48,7 +48,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 06b4d3f8..aa50ac94 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 66bbec74..57b7e49f 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,7 +22,7 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2', + 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index a807c10f..b4259b05 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -107,7 +107,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version}.2 + ${jackson.version} com.fasterxml.jackson.dataformat From 329be189d868920b2d9d872bef570ea8da80929c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 11 Nov 2022 11:14:44 +0100 Subject: [PATCH 0534/1214] chore: replace ${session.executionRootDirectory} with ${project.parent.basedir} to fix CI build --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 09af4a99..741579cf 100644 --- a/pom.xml +++ b/pom.xml @@ -194,7 +194,7 @@ true ${project.build.directory}/spotbugs - ${session.executionRootDirectory}/spotbugs-excludeFilter.xml + ${project.parent.basedir}/spotbugs-excludeFilter.xml com.h3xstream.findsecbugs From f980a1b1073711c152683eecda8796b2f87ca571 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 11 Nov 2022 11:18:05 +0100 Subject: [PATCH 0535/1214] chore(deps): update Jackson version to 2.14.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 2 +- samples/struts/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 99a75e72..2ae636fa 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.37 - 2.13.4 + 2.14.0 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 4e5993bb..0381379f 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.13.4 + 2.14.0 2.9.1 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index f2f7598c..d37db592 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -35,7 +35,7 @@ dependencies { } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.0') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.0') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index d4c321b1..ef32c9b2 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.0.3 - 2.13.4 + 2.14.0 4.13.2 2.19.0 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 44efd8ab..e24ad822 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.37 - 2.13.4 + 2.14.0 diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index d064704d..e25f0f9e 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.13.4 + 2.14.0 2.9.1 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 57b7e49f..f7d6af5e 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -23,7 +23,7 @@ dependencies { 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', 'com.fasterxml.jackson.core:jackson-databind:2.14.0', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.4', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.0', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index b4259b05..3f6b1d7b 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.0.3 - 2.13.4 + 2.14.0 4.13.2 2.19.0 From 7ae7217f2332a35677ce6e9cb13e6105995dafa6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Nov 2022 12:02:14 +0100 Subject: [PATCH 0536/1214] chore(deps): Update Spring dependencies (framework to 5.2.23, security to 5.7.4, boot to 2.7.5) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7047e9a5..f5bae2f5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -90,7 +90,7 @@ org.springframework.security spring-security-web - 5.7.3 + 5.7.4 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 0d672153..b238a0d5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.22 - 5.7.3 + 5.3.23 + 5.7.4 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 069543dc..8768c373 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.10-SNAPSHOT - 5.3.22 - 2.7.3 - 5.7.3 + 5.3.23 + 2.7.5 + 5.7.4 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 457feec6..3e53cd64 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.22', - 'org.springframework:spring-context:5.3.22', + 'org.springframework:spring-webmvc:5.3.23', + 'org.springframework:spring-context:5.3.23', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 77334f2d..5491fbb6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.22 + 5.3.23 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 4a7199c8..73c0bdb6 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.3', + 'org.springframework.boot:spring-boot-starter-web:2.7.5', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 27cfc10c..9a0b4123 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.3 + 2.7.5 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index aa50ac94..838afd6a 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.22', - 'org.springframework:spring-context:5.3.22', + 'org.springframework:spring-webmvc:5.3.23', + 'org.springframework:spring-context:5.3.23', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 645982b6..2d1a472f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.22 + 5.3.23 4.13.2 2.19.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 8a68214f..22989c9e 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.3') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index b0e6720d..8f7150db 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.3 + 2.7.5 From b3f4e830dfda45f296dd6913960ca4867c20fd66 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Nov 2022 12:32:50 +0100 Subject: [PATCH 0537/1214] chore(build): update GitHub actions https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/ --- .../workflows/continuous-integration-workflow.yml | 15 ++++++++------- .github/workflows/release.yml | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index e1ae0e00..9b54c615 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -10,7 +10,7 @@ jobs: name: Build and test core runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest run: mvn -q clean install working-directory: ./aws-serverless-java-container-core @@ -19,12 +19,13 @@ jobs: name: Build and test Jersey runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest run: ./gha_build.sh jersey true true - name: Set up JDK 8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: + distribution: corretto java-version: 8 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 @@ -37,7 +38,7 @@ jobs: name: Build and test Spark runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest run: ./gha_build.sh spark true true @@ -45,7 +46,7 @@ jobs: name: Build and test Spring & SpringBoot runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with # Spring core 5.2 and above. SpringBoot 1.5 is deprecated @@ -61,7 +62,7 @@ jobs: name: Build and test SpringBoot 2 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest run: ./gha_build.sh springboot2 true true # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions @@ -78,6 +79,6 @@ jobs: name: Build and test Struts runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build latest run: ./gha_build.sh struts true true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 57fd9681..0e90ca33 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Configure Git User # may be removed after https://github.com/actions/checkout/issues/13 is resolved run: | git config user.email "${{ github.actor }}@users.noreply.github.com" From db5570a415466d225639e9a52db28b4e07f92cfa Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Nov 2022 14:49:50 +0100 Subject: [PATCH 0538/1214] chore(build): update GitHub actions https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/ --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 9b54c615..033e4d55 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -25,7 +25,7 @@ jobs: - name: Set up JDK 8 uses: actions/setup-java@v2 with: - distribution: corretto + distribution: 'corretto' java-version: 8 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 From 7844bc405e6493e46492f63de67dbb3816c5837d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Nov 2022 14:56:41 +0100 Subject: [PATCH 0539/1214] chore(build): update GitHub actions https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/ --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 033e4d55..2d88a197 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -25,7 +25,7 @@ jobs: - name: Set up JDK 8 uses: actions/setup-java@v2 with: - distribution: 'corretto' + distribution: 'temurin' # Corretto doesn't work right now https://github.com/actions/setup-java/issues/68 java-version: 8 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 From 789778302a7a70aa120261f17f5b910f457e00e6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 15 Nov 2022 14:58:36 +0100 Subject: [PATCH 0540/1214] chore(build): use Corretto instead of Temurin for building --- .github/workflows/continuous-integration-workflow.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2d88a197..0047dd19 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -23,9 +23,9 @@ jobs: - name: Build latest run: ./gha_build.sh jersey true true - name: Set up JDK 8 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: - distribution: 'temurin' # Corretto doesn't work right now https://github.com/actions/setup-java/issues/68 + distribution: 'corretto' java-version: 8 - name: Build Jersey 2.27 run: ./gha_build.sh jersey false false -Djersey.version=2.27 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e90ca33..64ec8e2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,9 +20,9 @@ jobs: git config user.email "${{ github.actor }}@users.noreply.github.com" git config user.name "${{ github.actor }}" - name: Set up Maven - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: - distribution: 'temurin' # Corretto isn't supported right now https://github.com/actions/setup-java/issues/68 + distribution: 'corretto' java-version: 8 server-id: sonatype-nexus-staging server-username: MAVEN_USERNAME From e5af738661f9dd7f40c75a8302dac8c3d30c461f Mon Sep 17 00:00:00 2001 From: James Eastham Date: Tue, 15 Nov 2022 14:17:42 +0000 Subject: [PATCH 0541/1214] Add link to Spring on Lambda YT playlist --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index ad346169..cb98d749 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,9 @@ public class StreamLambdaHandler implements RequestStreamHandler { } } ``` + +## Public Examples + +### Videos + +- [Spring on AWS Lambda](https://www.youtube.com/watch?v=A1rYiHTy9Lg&list=PLCOG9xkUD90IDm9tcY-5nMK6X6g8SD-Sz) YouTube Playlist from [@plantpowerjames](https://twitter.com/plantpowerjames) From 76fe0ec1e0ad20435aec9c96133a5674416fb4d0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 16 Nov 2022 07:53:49 +0100 Subject: [PATCH 0542/1214] chore(deps): update SLF4J to 2.0.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 741579cf..d5ff104b 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 7.3.0 2.14.0 - 2.0.2 + 2.0.3 UTF-8 From 24cd7cc32eeb5b6ce86dd06c4a23fb3eef5d739a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Dec 2022 15:55:17 +0100 Subject: [PATCH 0543/1214] chore(build): fix continuous integration (master branch got renamed to main a while ago) --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 0047dd19..6a8d438a 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -3,7 +3,7 @@ on: push: pull_request: branches: - - master + - main jobs: build_core: From 3928dce67b54241206251775ab9d8b51a6098cca Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Dec 2022 16:00:31 +0100 Subject: [PATCH 0544/1214] chore(build): allow to trigger continuous integration manually (add workflow_dispatch event) --- .github/workflows/continuous-integration-workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 6a8d438a..2aaf1761 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + workflow_dispatch: jobs: build_core: From 680b6f154c9d361c3ff316db746a09045fa39921 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Dec 2022 17:10:07 +0100 Subject: [PATCH 0545/1214] docs: add link to Java on AWS Lambda workshop --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index cb98d749..d4c836e2 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,10 @@ public class StreamLambdaHandler implements RequestStreamHandler { ## Public Examples +### Workshops + +- [Java on AWS Lambda](https://catalog.workshops.aws/java-on-aws-lambda) From Serverful to Serverless Java with AWS Lambda in 2 hours + ### Videos - [Spring on AWS Lambda](https://www.youtube.com/watch?v=A1rYiHTy9Lg&list=PLCOG9xkUD90IDm9tcY-5nMK6X6g8SD-Sz) YouTube Playlist from [@plantpowerjames](https://twitter.com/plantpowerjames) From 4bf3876dbc25a683fb35ea1f57b9ebf3be22836f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Duarte?= Date: Mon, 5 Dec 2022 09:10:08 +0000 Subject: [PATCH 0546/1214] Add ALB Context to API GW Payload V2 --- .../jaxrs/AwsProxySecurityContext.java | 4 +--- .../servlet/AwsProxyHttpServletRequest.java | 6 +++--- .../AwsProxyHttpServletResponseWriter.java | 3 ++- .../testutils/AwsProxyRequestBuilder.java | 8 ++++---- .../proxy/model/AwsProxyRequest.java | 5 ----- .../proxy/model/HttpApiV2ProxyRequest.java | 11 +++++++++++ .../model/HttpApiV2ProxyRequestContext.java | 10 ++++++++++ .../serverless/proxy/model/RequestSource.java | 18 ++++++++++++++++++ .../proxy/model/HttpApiV2ProxyRequestTest.java | 2 ++ 9 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/RequestSource.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 025dceac..b0582297 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -14,15 +14,13 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; +import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.SecurityContext; import java.security.Principal; -import static com.amazonaws.serverless.proxy.model.AwsProxyRequest.RequestSource.API_GATEWAY; - - /** * default implementation of the SecurityContext object. This class supports 3 API Gateway's authorization methods: * AWS_IAM, CUSTOM_AUTHORIZER, and COGNITO_USER_POOL (oidc). The Principal returned by the object depends on the authorization diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index eecda99c..61486bc7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -18,6 +18,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.Headers; +import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -49,7 +50,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; - /** * Implementation of the HttpServletRequest interface that supports AwsProxyRequest object. * This object is initialized with an AwsProxyRequest event and a SecurityContext generated @@ -204,7 +204,7 @@ public String getQueryString() { return this.generateQueryString( request.getMultiValueQueryStringParameters(), // ALB does not automatically decode parameters, so we don't want to re-encode them - request.getRequestSource() != AwsProxyRequest.RequestSource.ALB, + request.getRequestSource() != RequestSource.ALB, config.getUriEncoding()); } catch (ServletException e) { log.error("Could not generate query string", e); @@ -580,7 +580,7 @@ private List getHeaderValues(String key) { // special cases for referer and user agent headers List values = new ArrayList<>(); - if (request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + if (request.getRequestSource() == RequestSource.API_GATEWAY) { if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { values.add(request.getRequestContext().getIdentity().getCaller()); return values; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index de84b5c2..524a36f9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -20,6 +20,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.Headers; +import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.Response; @@ -73,7 +74,7 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, awsProxyResponse.setStatusCode(containerResponse.getStatus()); - if (containerResponse.getAwsProxyRequest() != null && containerResponse.getAwsProxyRequest().getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + if (containerResponse.getAwsProxyRequest() != null && containerResponse.getAwsProxyRequest().getRequestSource() == RequestSource.ALB) { awsProxyResponse.setStatusDescription(containerResponse.getStatus() + " " + Response.Status.fromStatusCode(containerResponse.getStatus()).getReasonPhrase()); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 998bf474..6fae6db7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -224,11 +224,11 @@ public AwsProxyRequestBuilder queryString(String key, String value) { this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); } - if (request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + if (request.getRequestSource() == RequestSource.API_GATEWAY) { this.request.getMultiValueQueryStringParameters().add(key, value); } // ALB does not decode parameters automatically like API Gateway. - if (request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + if (request.getRequestSource() == RequestSource.ALB) { try { //if (URLDecoder.decode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET).equals(value)) { // TODO: Assume we are always given an unencoded value, smarter check here to encode @@ -285,7 +285,7 @@ public AwsProxyRequestBuilder binaryBody(InputStream is) public AwsProxyRequestBuilder authorizerPrincipal(String principal) { - if (this.request.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) { + if (this.request.getRequestSource() == RequestSource.API_GATEWAY) { if (this.request.getRequestContext().getAuthorizer() == null) { this.request.getRequestContext().setAuthorizer(new ApiGatewayAuthorizerContext()); } @@ -295,7 +295,7 @@ public AwsProxyRequestBuilder authorizerPrincipal(String principal) { } this.request.getRequestContext().getAuthorizer().getClaims().setSubject(principal); } - if (this.request.getRequestSource() == AwsProxyRequest.RequestSource.ALB) { + if (this.request.getRequestSource() == RequestSource.ALB) { header("x-amzn-oidc-identity", principal); try { header( diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index 440421a7..075db0ac 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -192,9 +192,4 @@ public boolean isBase64Encoded() { public void setIsBase64Encoded(boolean base64Encoded) { isBase64Encoded = base64Encoded; } - - public static enum RequestSource { - ALB, - API_GATEWAY - } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java index c50298ee..023236cc 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequest.java @@ -13,9 +13,12 @@ package com.amazonaws.serverless.proxy.model; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; public class HttpApiV2ProxyRequest { private String version; @@ -127,4 +130,12 @@ public HttpApiV2ProxyRequestContext getRequestContext() { public void setRequestContext(HttpApiV2ProxyRequestContext requestContext) { this.requestContext = requestContext; } + + @JsonIgnore + public RequestSource getRequestSource() { + return Optional.ofNullable(getRequestContext()) + .map(HttpApiV2ProxyRequestContext::getElb) + .map(albContext -> RequestSource.ALB) + .orElse(RequestSource.API_GATEWAY); + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java index 738f692f..e5a5b9d2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestContext.java @@ -25,6 +25,7 @@ public class HttpApiV2ProxyRequestContext { private String stage; private String time; private long timeEpoch; + private AlbContext elb; private HttpApiV2HttpContext http; private HttpApiV2AuthorizerMap authorizer; @@ -117,4 +118,13 @@ public void setAuthorizer(HttpApiV2AuthorizerMap authorizer) { this.authorizer = authorizer; } + public AlbContext getElb() { + return this.elb; + } + + public void setElb(AlbContext context) { + this.elb = context; + } + + } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/RequestSource.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/RequestSource.java new file mode 100644 index 00000000..c819fdcc --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/RequestSource.java @@ -0,0 +1,18 @@ +/* + * Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.model; + +public enum RequestSource { + ALB, + API_GATEWAY +} \ No newline at end of file diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java index c673a59e..6e9aaecb 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -136,6 +136,7 @@ public void deserialize_fromJsonString_authorizerPopulatedCorrectly() { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); assertTrue(req.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey("claim1")); assertEquals(2, req.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().size()); + assertEquals(RequestSource.API_GATEWAY, req.getRequestSource()); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); @@ -177,6 +178,7 @@ public void deserialize_fromJsonString_isBase64EncodedPopulates() { assertFalse(req.isBase64Encoded()); req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); assertTrue(req.isBase64Encoded()); + assertEquals(RequestSource.API_GATEWAY, req.getRequestSource()); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); From ed30fd11b64c55fadb2c78206c540728d27898c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Duarte?= Date: Tue, 6 Dec 2022 18:23:14 +0000 Subject: [PATCH 0547/1214] Migrate to JUnit 5 --- aws-serverless-java-container-core/pom.xml | 23 ++ .../proxy/AsyncInitializationWrapperTest.java | 8 +- .../proxy/AwsProxyExceptionHandlerTest.java | 50 +-- .../AwsProxySecurityContextWriterTest.java | 12 +- .../serverless/proxy/RequestReaderTest.java | 12 +- .../serverless/proxy/ResponseWriterTest.java | 9 +- .../internal/LambdaContainerHandlerTest.java | 10 +- .../proxy/internal/SecurityUtilsTest.java | 8 +- .../jaxrs/AwsProxySecurityContextTest.java | 18 +- .../jaxrs/HttpApiV2SecurityContextTest.java | 10 +- ...ApacheCombinedServletLogFormatterTest.java | 64 ++-- .../internal/servlet/AwsAsyncContextTest.java | 12 +- .../servlet/AwsFilterChainManagerTest.java | 46 +-- ...HttpApiV2HttpServletRequestReaderTest.java | 8 +- .../servlet/AwsHttpServletRequestTest.java | 37 +-- .../servlet/AwsHttpServletResponseTest.java | 46 +-- .../internal/servlet/AwsHttpSessionTest.java | 20 +- .../AwsProxyHttpServletRequestFormTest.java | 49 ++- .../AwsProxyHttpServletRequestReaderTest.java | 24 +- .../AwsProxyHttpServletRequestTest.java | 284 +++++++++++------- .../AwsProxyRequestDispatcherTest.java | 36 ++- .../servlet/AwsServletContextTest.java | 47 +-- .../servlet/AwsServletRegistrationTest.java | 12 +- .../internal/servlet/FilterHolderTest.java | 6 +- ...vletLambdaContainerHandlerBuilderTest.java | 14 +- .../servlet/filters/UrlPathValidatorTest.java | 16 +- .../ApiGatewayAuthorizerContextTest.java | 6 +- .../proxy/model/AwsProxyRequestTest.java | 18 +- .../model/CognitoAuthorizerClaimsTest.java | 8 +- .../model/HttpApiV2ProxyRequestTest.java | 16 +- .../proxy/model/MultiValuedTreeMapTest.java | 12 +- aws-serverless-java-container-jersey/pom.xml | 7 +- .../proxy/jersey/JerseyAwsProxyTest.java | 271 ++++++++++------- .../proxy/jersey/JerseyInjectionTest.java | 9 +- .../proxy/jersey/JerseyParamEncodingTest.java | 173 ++++++----- aws-serverless-java-container-spark/pom.xml | 7 +- .../spark/HelloWorldSparkStreamTest.java | 31 +- .../proxy/spark/HelloWorldSparkTest.java | 51 ++-- .../proxy/spark/InitExceptionHandlerTest.java | 20 +- .../SparkLambdaContainerHandlerTest.java | 16 +- .../LambdaEmbeddedServerTest.java | 6 +- aws-serverless-java-container-spring/pom.xml | 7 +- .../serverless/proxy/spring/SlowAppTest.java | 10 +- .../proxy/spring/SpringAwsProxyTest.java | 229 ++++++++------ .../spring/SpringServletContextTest.java | 32 +- .../proxy/spring/StaticAppProxyTest.java | 7 +- .../extensibility/CustomServletTest.java | 10 +- .../spring/profile/SpringProfileTest.java | 18 +- .../pom.xml | 7 +- .../proxy/spring/SecurityAppTest.java | 8 +- .../proxy/spring/ServletAppTest.java | 86 +++--- .../serverless/proxy/spring/SlowAppTest.java | 11 +- .../proxy/spring/WebFluxAppTest.java | 36 +-- ...rlessServletEmbeddedServerFactoryTest.java | 6 +- aws-serverless-java-container-struts/pom.xml | 10 +- .../proxy/struts/StrutsAwsProxyTest.java | 133 +++++--- pom.xml | 41 ++- 57 files changed, 1246 insertions(+), 937 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f5bae2f5..0e777b78 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -79,6 +79,21 @@ 4.5.13 test + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + org.apache.httpcomponents httpcore @@ -107,6 +122,14 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + always + + org.jacoco jacoco-maven-plugin diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java index 3b8a7306..74a6b803 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapperTest.java @@ -1,24 +1,24 @@ package com.amazonaws.serverless.proxy; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.lang.management.ManagementFactory; import java.time.Clock; import java.time.Instant; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; public class AsyncInitializationWrapperTest { @Test - public void initCreate_noStartTime_setsCurrentTime() { + void initCreate_noStartTime_setsCurrentTime() { AsyncInitializationWrapper init = new AsyncInitializationWrapper(); long initTime = ManagementFactory.getRuntimeMXBean().getStartTime(); assertEquals(initTime, init.getActualStartTimeMs()); } @Test - public void initCreate_withStartTime_storesCustomStartTime() throws InterruptedException { + void initCreate_withStartTime_storesCustomStartTime() throws InterruptedException { long initTime = Instant.now().toEpochMilli(); Thread.sleep(500); AsyncInitializationWrapper init = new AsyncInitializationWrapper(initTime); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index cf86c57a..dd3417db 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -8,13 +8,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import javax.ws.rs.InternalServerErrorException; @@ -31,14 +31,14 @@ public class AwsProxyExceptionHandlerTest { private ObjectMapper objectMapper; - @Before + @BeforeEach public void setUp() { exceptionHandler = new AwsProxyExceptionHandler(); objectMapper = new ObjectMapper(); } @Test - public void typedHandle_InvalidRequestEventException_500State() { + void typedHandle_InvalidRequestEventException_500State() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null)); assertNotNull(resp); @@ -46,7 +46,7 @@ public void typedHandle_InvalidRequestEventException_500State() { } @Test - public void typedHandle_InvalidRequestEventException_responseString() + void typedHandle_InvalidRequestEventException_responseString() throws JsonProcessingException { AwsProxyResponse resp = exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null)); @@ -56,7 +56,7 @@ public void typedHandle_InvalidRequestEventException_responseString() } @Test - public void typedHandle_InvalidRequestEventException_jsonContentTypeHeader() { + void typedHandle_InvalidRequestEventException_jsonContentTypeHeader() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null)); assertNotNull(resp); @@ -65,7 +65,7 @@ public void typedHandle_InvalidRequestEventException_jsonContentTypeHeader() { } @Test - public void typedHandle_InvalidResponseObjectException_502State() { + void typedHandle_InvalidResponseObjectException_502State() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null)); assertNotNull(resp); @@ -73,7 +73,7 @@ public void typedHandle_InvalidResponseObjectException_502State() { } @Test - public void typedHandle_InvalidResponseObjectException_responseString() + void typedHandle_InvalidResponseObjectException_responseString() throws JsonProcessingException { AwsProxyResponse resp = exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null)); @@ -83,7 +83,7 @@ public void typedHandle_InvalidResponseObjectException_responseString() } @Test - public void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { + void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { AwsProxyResponse resp = exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null)); assertNotNull(resp); @@ -92,7 +92,7 @@ public void typedHandle_InvalidResponseObjectException_jsonContentTypeHeader() { } @Test - public void typedHandle_InternalServerErrorException_500State() { + void typedHandle_InternalServerErrorException_500State() { // Needed to mock InternalServerErrorException because it leverages RuntimeDelegate to set an internal // response object. InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); @@ -105,7 +105,7 @@ public void typedHandle_InternalServerErrorException_500State() { } @Test - public void typedHandle_InternalServerErrorException_responseString() + void typedHandle_InternalServerErrorException_responseString() throws JsonProcessingException { InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); @@ -118,7 +118,7 @@ public void typedHandle_InternalServerErrorException_responseString() } @Test - public void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { + void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); @@ -130,7 +130,7 @@ public void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { } @Test - public void typedHandle_NullPointerException_responseObject() + void typedHandle_NullPointerException_responseObject() throws JsonProcessingException { AwsProxyResponse resp = exceptionHandler.handle(new NullPointerException()); @@ -143,7 +143,7 @@ public void typedHandle_NullPointerException_responseObject() } @Test - public void streamHandle_InvalidRequestEventException_500State() + void streamHandle_InvalidRequestEventException_500State() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null), respStream); @@ -156,7 +156,7 @@ public void streamHandle_InvalidRequestEventException_500State() } @Test - public void streamHandle_InvalidRequestEventException_responseString() + void streamHandle_InvalidRequestEventException_responseString() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null), respStream); @@ -170,7 +170,7 @@ public void streamHandle_InvalidRequestEventException_responseString() } @Test - public void streamHandle_InvalidRequestEventException_jsonContentTypeHeader() + void streamHandle_InvalidRequestEventException_jsonContentTypeHeader() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null), respStream); @@ -184,7 +184,7 @@ public void streamHandle_InvalidRequestEventException_jsonContentTypeHeader() } @Test - public void streamHandle_InvalidResponseObjectException_502State() + void streamHandle_InvalidResponseObjectException_502State() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null), respStream); @@ -197,7 +197,7 @@ public void streamHandle_InvalidResponseObjectException_502State() } @Test - public void streamHandle_InvalidResponseObjectException_responseString() + void streamHandle_InvalidResponseObjectException_responseString() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null), respStream); @@ -211,7 +211,7 @@ public void streamHandle_InvalidResponseObjectException_responseString() } @Test - public void streamHandle_InvalidResponseObjectException_jsonContentTypeHeader() + void streamHandle_InvalidResponseObjectException_jsonContentTypeHeader() throws IOException { ByteArrayOutputStream respStream = new ByteArrayOutputStream(); exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null), respStream); @@ -225,17 +225,17 @@ public void streamHandle_InvalidResponseObjectException_jsonContentTypeHeader() } @Test - public void errorMessage_InternalServerError_staticString() { + void errorMessage_InternalServerError_staticString() { assertEquals("Internal Server Error", AwsProxyExceptionHandler.INTERNAL_SERVER_ERROR); } @Test - public void errorMessage_GatewayTimeout_staticString() { + void errorMessage_GatewayTimeout_staticString() { assertEquals("Gateway timeout", AwsProxyExceptionHandler.GATEWAY_TIMEOUT_ERROR); } @Test - public void getErrorJson_ErrorModel_validJson() + void getErrorJson_ErrorModel_validJson() throws IOException { String output = exceptionHandler.getErrorJson(INVALID_RESPONSE_MESSAGE); assertNotNull(output); @@ -245,7 +245,7 @@ public void getErrorJson_ErrorModel_validJson() } @Test - public void getErrorJson_JsonParsinException_validJson() + void getErrorJson_JsonParsinException_validJson() throws IOException { ObjectMapper mockMapper = mock(ObjectMapper.class); JsonProcessingException exception = mock(JsonProcessingException.class); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java index 6255344a..34af09df 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java @@ -4,32 +4,32 @@ import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import javax.ws.rs.core.SecurityContext; import java.lang.reflect.Method; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsProxySecurityContextWriterTest { private AwsProxySecurityContextWriter writer; - @Before + @BeforeEach public void setUp() { writer = new AwsProxySecurityContextWriter(); } @Test - public void write_returnClass_securityContext() + void write_returnClass_securityContext() throws NoSuchMethodException { Method writeMethod = writer.getClass().getMethod("writeSecurityContext", AwsProxyRequest.class, Context.class); assertEquals(SecurityContext.class, writeMethod.getReturnType()); } @Test - public void write_noAuth_emptySecurityContext() { + void write_noAuth_emptySecurityContext() { AwsProxyRequest request = new AwsProxyRequestBuilder("/test").build(); SecurityContext context = writer.writeSecurityContext(request, null); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java index fb0d25f4..3afe72f9 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/RequestReaderTest.java @@ -4,9 +4,9 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class RequestReaderTest { @@ -17,14 +17,14 @@ public class RequestReaderTest { private static final AwsProxyHttpServletRequestReader requestReader = new AwsProxyHttpServletRequestReader(); @Test - public void defaultConfig_doNotStripBasePath() { + void defaultConfig_doNotStripBasePath() { ContainerConfig config = ContainerConfig.defaultConfig(); assertFalse(config.isStripBasePath()); assertNull(config.getServiceBasePath()); } @Test - public void setServiceBasePath_addSlashes() { + void setServiceBasePath_addSlashes() { ContainerConfig config = new ContainerConfig(); config.setServiceBasePath(BASE_PATH_MAPPING); @@ -35,7 +35,7 @@ public void setServiceBasePath_addSlashes() { } @Test - public void requestReader_stripBasePath() { + void requestReader_stripBasePath() { ContainerConfig config = ContainerConfig.defaultConfig(); String requestPath = "/" + BASE_PATH_MAPPING + ORDERS_URL; @@ -55,7 +55,7 @@ public void requestReader_stripBasePath() { } @Test - public void requestReader_doubleBasePath() { + void requestReader_doubleBasePath() { ContainerConfig config = ContainerConfig.defaultConfig(); config.setStripBasePath(true); config.setServiceBasePath(BASE_PATH_MAPPING); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java index 863ea583..48c54462 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java @@ -1,16 +1,15 @@ package com.amazonaws.serverless.proxy; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; -import java.nio.ByteBuffer; - -import static junit.framework.TestCase.assertTrue; -import static org.junit.Assert.assertFalse; public class ResponseWriterTest { private static int[][] NAUGHTY_STRINGS = { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java index 8b10520c..31a2c575 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java @@ -11,12 +11,12 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; import org.apache.http.impl.execchain.RequestAbortedException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class LambdaContainerHandlerTest { private boolean isRuntimeException = false; @@ -29,7 +29,7 @@ public class LambdaContainerHandlerTest { ); @Test - public void throwRuntime_returnsUnwrappedException() { + void throwRuntime_returnsUnwrappedException() { try { isRuntimeException = true; throwException = true; @@ -44,7 +44,7 @@ public void throwRuntime_returnsUnwrappedException() { } @Test - public void throwNonRuntime_returnsWrappedException() { + void throwNonRuntime_returnsWrappedException() { try { isRuntimeException = false; throwException = true; @@ -61,7 +61,7 @@ public void throwNonRuntime_returnsWrappedException() { } @Test - public void noException_returnsResponse() { + void noException_returnsResponse() { throwException = false; LambdaContainerHandler.getContainerConfig().setDisableExceptionMapper(false); AwsProxyResponse resp = handler.proxy(new AwsProxyRequestBuilder("/test", "GET").build(), new MockLambdaContext()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java index 2e8fb5c2..acf48d9c 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/SecurityUtilsTest.java @@ -1,13 +1,11 @@ package com.amazonaws.serverless.proxy.internal; -import org.junit.Test; - import java.util.HashMap; import java.util.Map; -import static junit.framework.TestCase.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; public class SecurityUtilsTest { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index db1b9c10..ed89bf86 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -2,7 +2,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.security.Principal; @@ -10,7 +10,7 @@ import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.ALB_IDENTITY_HEADER; import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.AUTH_SCHEME_COGNITO_POOL; import static com.amazonaws.serverless.proxy.internal.jaxrs.AwsProxySecurityContext.AUTH_SCHEME_CUSTOM; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsProxySecurityContextTest { private static final String CLAIM_KEY = "custom:claim"; @@ -27,21 +27,21 @@ public class AwsProxySecurityContextTest { .build(); @Test - public void localVars_constructor_nullValues() { + void localVars_constructor_nullValues() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, null); assertNull(context.getEvent()); assertNull(context.getLambdaContext()); } @Test - public void localVars_constructor_ValidRequest() { + void localVars_constructor_ValidRequest() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_NO_AUTH); assertEquals(REQUEST_NO_AUTH, context.getEvent()); assertNull(context.getLambdaContext()); } @Test - public void alb_noAuth_expectEmptyScheme() { + void alb_noAuth_expectEmptyScheme() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, ALB_REQUEST_NO_AUTH); assertEquals(ALB_REQUEST_NO_AUTH, context.getEvent()); assertNull(context.getLambdaContext()); @@ -50,21 +50,21 @@ public void alb_noAuth_expectEmptyScheme() { } @Test - public void authScheme_getAuthenticationScheme_userPool() { + void authScheme_getAuthenticationScheme_userPool() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); assertNotNull(context.getAuthenticationScheme()); assertEquals(AUTH_SCHEME_COGNITO_POOL, context.getAuthenticationScheme()); } @Test - public void authScheme_getPrincipal_userPool() { + void authScheme_getPrincipal_userPool() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); assertEquals(AUTH_SCHEME_COGNITO_POOL, context.getAuthenticationScheme()); assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); } @Test - public void alb_cognitoAuth_expectCustomSchemeAndCorrectPrincipal() { + void alb_cognitoAuth_expectCustomSchemeAndCorrectPrincipal() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, ALB_REQUEST_COGNITO_USER_POOL); assertTrue(context.isSecure()); assertEquals(AUTH_SCHEME_CUSTOM, context.getAuthenticationScheme()); @@ -72,7 +72,7 @@ public void alb_cognitoAuth_expectCustomSchemeAndCorrectPrincipal() { } @Test - public void userPool_getClaims_retrieveCustomClaim() { + void userPool_getClaims_retrieveCustomClaim() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); Principal userPrincipal = context.getUserPrincipal(); assertNotNull(userPrincipal.getName()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java index ae2dcdb5..0fda7b97 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java @@ -3,12 +3,12 @@ import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class HttpApiV2SecurityContextTest { private static final String JWT_SUB_VALUE = "1234567890"; @@ -24,7 +24,7 @@ public class HttpApiV2SecurityContextTest { AwsHttpApiV2SecurityContextWriter contextWriter = new AwsHttpApiV2SecurityContextWriter(); @Test - public void getAuthenticationScheme_nullAuth_nullSchema() { + void getAuthenticationScheme_nullAuth_nullSchema() { SecurityContext ctx = contextWriter.writeSecurityContext(EMPTY_AUTH, null); assertNull(ctx.getAuthenticationScheme()); assertNull(ctx.getUserPrincipal()); @@ -32,7 +32,7 @@ public void getAuthenticationScheme_nullAuth_nullSchema() { } @Test - public void getAuthenticationScheme_jwtAuth_correctSchema() { + void getAuthenticationScheme_jwtAuth_correctSchema() { SecurityContext ctx = contextWriter.writeSecurityContext(BASIC_AUTH, null); assertEquals(AwsHttpApiV2SecurityContext.AUTH_SCHEME_JWT, ctx.getAuthenticationScheme()); assertTrue(ctx.isSecure()); @@ -40,7 +40,7 @@ public void getAuthenticationScheme_jwtAuth_correctSchema() { } @Test - public void getPrincipal_parseJwt_returnsSub() { + void getPrincipal_parseJwt_returnsSub() { SecurityContext ctx = contextWriter.writeSecurityContext(JWT_AUTH, null); assertEquals(AwsHttpApiV2SecurityContext.AUTH_SCHEME_JWT, ctx.getAuthenticationScheme()); assertTrue(ctx.isSecure()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java index 0d12a511..e0793268 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java @@ -4,8 +4,8 @@ import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -17,8 +17,8 @@ import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; -import static org.mockito.Matchers.eq; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -31,7 +31,7 @@ public class ApacheCombinedServletLogFormatterTest { private AwsProxyRequest proxyRequest; private AwsProxyRequestContext context; - @Before + @BeforeEach public void setup() { proxyRequest = new AwsProxyRequest(); Clock fixedClock = Clock.fixed(Instant.ofEpochSecond(665888523L), ZoneId.of("UTC")); @@ -48,40 +48,40 @@ public void setup() { sut = new ApacheCombinedServletLogFormatter(fixedClock); } - @Test - public void logsCurrentTimeWhenContextNull() { - // given - proxyRequest.setRequestContext(null); + @Test + void logsCurrentTimeWhenContextNull() { + // given + proxyRequest.setRequestContext(null); - // when - String actual = sut.format(mockServletRequest, mockServletResponse, null); + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); - // then - assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); - } + // then + assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); + } - @Test - public void logsCurrentTimeWhenRequestTimeZero() { - // given - context.setRequestTimeEpoch(0); + @Test + void logsCurrentTimeWhenRequestTimeZero() { + // given + context.setRequestTimeEpoch(0); - // when - String actual = sut.format(mockServletRequest, mockServletResponse, null); + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); - // then - assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); - } + // then + assertThat(actual, containsString("[07/02/1991:01:02:03Z]")); + } - @Test - public void logsRequestTimeWhenRequestTimeEpochGreaterThanZero() { - // given - context.setRequestTimeEpoch(1563023494000L); + @Test + void logsRequestTimeWhenRequestTimeEpochGreaterThanZero() { + // given + context.setRequestTimeEpoch(1563023494000L); - // when - String actual = sut.format(mockServletRequest, mockServletResponse, null); + // when + String actual = sut.format(mockServletRequest, mockServletResponse, null); - // then - assertThat(actual, containsString("[13/07/2019:13:11:34Z]")); - } + // then + assertThat(actual, containsString("[13/07/2019:13:11:34Z]")); + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index f379ff32..b5b79bba 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -10,7 +10,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.AsyncContext; import javax.servlet.Servlet; @@ -21,8 +21,8 @@ import java.io.IOException; import java.util.concurrent.CountDownLatch; -import static junit.framework.TestCase.assertNotNull; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class AwsAsyncContextTest { private MockLambdaContext lambdaCtx = new MockLambdaContext(); @@ -33,7 +33,7 @@ public class AwsAsyncContextTest { private AwsServletContext ctx = getCtx(); @Test - public void dispatch_sendsToCorrectServlet() { + void dispatch_sendsToCorrectServlet() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); req.setServletContext(ctx); @@ -59,8 +59,8 @@ public void dispatch_sendsToCorrectServlet() { } @Test - public void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { - AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest) reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); + void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { + AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest)reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); req.setServletContext(ctx); req.setContainerHandler(handler); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 8bc75354..882aa085 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -3,8 +3,8 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +14,7 @@ import java.util.EnumSet; import java.util.concurrent.CountDownLatch; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsFilterChainManagerTest { private static final String REQUEST_CUSTOM_ATTRIBUTE_NAME = "X-Custom-Attribute"; @@ -26,7 +26,7 @@ public class AwsFilterChainManagerTest { private Logger log = LoggerFactory.getLogger(AwsFilterChainManagerTest.class); - @BeforeClass + @BeforeAll public static void setUp() { servletContext = new AwsServletContext( null);//AwsServletContext.getInstance(lambdaContext, null); @@ -41,7 +41,7 @@ public static void setUp() { } @Test - public void paths_pathMatches_validPaths() { + void paths_pathMatches_validPaths() { assertTrue(chainManager.pathMatches("/users/123123123", "/users/*")); assertTrue(chainManager.pathMatches("/apis/123/methods", "/apis/*")); assertTrue(chainManager.pathMatches("/very/long/path/with/sub/resources", "/*")); @@ -52,7 +52,7 @@ public void paths_pathMatches_validPaths() { } @Test - public void paths_pathMatches_invalidPaths() { + void paths_pathMatches_invalidPaths() { // I expect we'd want to run filters on these requests, especially the ones that look invalid assertTrue(chainManager.pathMatches("_%Garbled%20Path_%", "/*")); assertTrue(chainManager.pathMatches("", "/*")); @@ -61,7 +61,7 @@ public void paths_pathMatches_invalidPaths() { } @Test - public void cacheKey_compare_samePath() { + void cacheKey_compare_samePath() { FilterChainManager.TargetCacheKey cacheKey = new FilterChainManager.TargetCacheKey(); cacheKey.setDispatcherType(DispatcherType.REQUEST); cacheKey.setTargetPath("/first/path"); @@ -71,11 +71,11 @@ public void cacheKey_compare_samePath() { secondCacheKey.setTargetPath("/first/path"); assertEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); - assertTrue(cacheKey.equals(secondCacheKey)); + assertEquals(cacheKey, secondCacheKey); } @Test - public void cacheKey_compare_differentDispatcher() { + void cacheKey_compare_differentDispatcher() { FilterChainManager.TargetCacheKey cacheKey = new FilterChainManager.TargetCacheKey(); cacheKey.setDispatcherType(DispatcherType.REQUEST); cacheKey.setTargetPath("/first/path"); @@ -85,11 +85,11 @@ public void cacheKey_compare_differentDispatcher() { secondCacheKey.setTargetPath("/first/path"); assertNotEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); - assertFalse(cacheKey.equals(secondCacheKey)); + assertNotEquals(cacheKey, secondCacheKey); } @Test - public void cacheKey_compare_additionalChars() { + void cacheKey_compare_additionalChars() { FilterChainManager.TargetCacheKey cacheKey = new FilterChainManager.TargetCacheKey(); cacheKey.setDispatcherType(DispatcherType.REQUEST); cacheKey.setTargetPath("/first/path"); @@ -98,21 +98,21 @@ public void cacheKey_compare_additionalChars() { secondCacheKey.setDispatcherType(DispatcherType.REQUEST); secondCacheKey.setTargetPath("/first/path/"); assertEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); - assertTrue(cacheKey.equals(secondCacheKey)); + assertEquals(cacheKey, secondCacheKey); secondCacheKey.setTargetPath(" /first/path"); assertEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); - assertTrue(cacheKey.equals(secondCacheKey)); + assertEquals(cacheKey, secondCacheKey); secondCacheKey.setTargetPath("first/path/"); assertEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); - assertTrue(cacheKey.equals(secondCacheKey)); + assertEquals(cacheKey, secondCacheKey); } @Test - public void filterChain_getFilterChain_subsetOfFilters() { + void filterChain_getFilterChain_subsetOfFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( - new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); @@ -135,9 +135,9 @@ public void filterChain_getFilterChain_subsetOfFilters() { } @Test - public void filterChain_matchMultipleTimes_expectSameMatch() { + void filterChain_matchMultipleTimes_expectSameMatch() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( - new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); @@ -145,7 +145,7 @@ public void filterChain_matchMultipleTimes_expectSameMatch() { assertEquals("Filter1", fcHolder.getFilter(0).getFilterName()); AwsProxyHttpServletRequest req2 = new AwsProxyHttpServletRequest( - new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2, null); @@ -154,9 +154,9 @@ public void filterChain_matchMultipleTimes_expectSameMatch() { } @Test - public void filerChain_executeMultipleFilters_expectRunEachTime() { + void filerChain_executeMultipleFilters_expectRunEachTime() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( - new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req.setServletContext(servletContext); FilterChainHolder fcHolder = chainManager.getFilterChain(req, null); @@ -180,7 +180,7 @@ public void filerChain_executeMultipleFilters_expectRunEachTime() { log.debug("Starting second request"); AwsProxyHttpServletRequest req2 = new AwsProxyHttpServletRequest( - new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null + new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); req2.setServletContext(servletContext); FilterChainHolder fcHolder2 = chainManager.getFilterChain(req2, null); @@ -205,7 +205,7 @@ public void filerChain_executeMultipleFilters_expectRunEachTime() { } @Test - public void filterChain_getFilterChain_multipleFilters() { + void filterChain_getFilterChain_multipleFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/second/important", "GET").build(), lambdaContext, null ); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java index 37ba3059..e35fedb7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -5,23 +5,23 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsHttpApiV2HttpServletRequestReaderTest { private AwsHttpApiV2HttpServletRequestReader reader = new AwsHttpApiV2HttpServletRequestReader(); @Test - public void reflection_getRequestClass_returnsCorrectType() { + void reflection_getRequestClass_returnsCorrectType() { assertSame(HttpApiV2ProxyRequest.class, reader.getRequestClass()); } @Test - public void baseRequest_read_populatesSuccessfully() { + void baseRequest_read_populatesSuccessfully() { HttpApiV2ProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET") .referer("localhost") .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36") diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 5372dfa9..35903333 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -7,13 +7,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import java.util.Base64; import java.util.List; @@ -41,7 +41,7 @@ public class AwsHttpServletRequestTest { private static ContainerConfig config = ContainerConfig.defaultConfig(); @Test - public void headers_parseHeaderValue_multiValue() { + void headers_parseHeaderValue_multiValue() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(contentTypeRequest, mockContext, null, config); // I'm also using this to double-check that I can get a header ignoring case List values = request.parseHeaderValue(request.getHeader("content-type")); @@ -55,7 +55,7 @@ public void headers_parseHeaderValue_multiValue() { } @Test - public void headers_parseHeaderValue_validMultipleCookie() { + void headers_parseHeaderValue_validMultipleCookie() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(validCookieRequest, mockContext, null, config); List values = request.parseHeaderValue(request.getHeader(HttpHeaders.COOKIE), ";", ","); @@ -67,7 +67,7 @@ public void headers_parseHeaderValue_validMultipleCookie() { } @Test - public void headers_parseHeaderValue_complexAccept() { + void headers_parseHeaderValue_complexAccept() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null, config); List values = request.parseHeaderValue(request.getHeader(HttpHeaders.ACCEPT), ",", ";"); @@ -75,8 +75,8 @@ public void headers_parseHeaderValue_complexAccept() { } @Test - public void headers_parseHeaderValue_encodedContentWithEquals() { - AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null,null,null); + void headers_parseHeaderValue_encodedContentWithEquals() { + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null, null, null); String value = Base64.getUrlEncoder().encodeToString("a".getBytes()); @@ -86,11 +86,11 @@ public void headers_parseHeaderValue_encodedContentWithEquals() { } @Test - public void headers_parseHeaderValue_base64EncodedCookieValue() { + void headers_parseHeaderValue_base64EncodedCookieValue() { String value = Base64.getUrlEncoder().encodeToString("a".getBytes()); String cookieValue = "jwt=" + value + "; secondValue=second"; AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").header(HttpHeaders.COOKIE, cookieValue).build(); - AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req,null,null); + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req, null, null); Cookie[] cookies = context.getCookies(); @@ -100,10 +100,10 @@ public void headers_parseHeaderValue_base64EncodedCookieValue() { } @Test - public void headers_parseHeaderValue_cookieWithSeparatorInValue() { + void headers_parseHeaderValue_cookieWithSeparatorInValue() { String cookieValue = "jwt==test; secondValue=second"; AwsProxyRequest req = new AwsProxyRequestBuilder("/test", "GET").header(HttpHeaders.COOKIE, cookieValue).build(); - AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req,null,null); + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(req, null, null); Cookie[] cookies = context.getCookies(); @@ -113,8 +113,8 @@ public void headers_parseHeaderValue_cookieWithSeparatorInValue() { } @Test - public void headers_parseHeaderValue_headerWithPaddingButNotBase64Encoded() { - AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null,null,null); + void headers_parseHeaderValue_headerWithPaddingButNotBase64Encoded() { + AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null, null, null); List result = context.parseHeaderValue("hello="); assertTrue(result.size() > 0); @@ -123,7 +123,7 @@ public void headers_parseHeaderValue_headerWithPaddingButNotBase64Encoded() { } @Test - public void queryString_generateQueryString_validQuery() { + void queryString_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config); String parsedString = null; @@ -139,8 +139,9 @@ public void queryString_generateQueryString_validQuery() { } @Test - public void queryString_generateQueryString_nullParameterIsEmpty() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryStringNullValue, mockContext, null, config);String parsedString = null; + void queryString_generateQueryString_nullParameterIsEmpty() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryStringNullValue, mockContext, null, config); + String parsedString = null; try { parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); } catch (ServletException e) { @@ -152,7 +153,7 @@ public void queryString_generateQueryString_nullParameterIsEmpty() { } @Test - public void queryStringWithEncodedParams_generateQueryString_validQuery() { + void queryStringWithEncodedParams_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); String parsedString = null; @@ -168,7 +169,7 @@ public void queryStringWithEncodedParams_generateQueryString_validQuery() { } @Test - public void queryStringWithMultipleValues_generateQueryString_validQuery() { + void queryStringWithMultipleValues_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(multipleParams, mockContext, null, config); String parsedString = null; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 4731a035..8a1d8f1e 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -4,7 +4,7 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.model.Headers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.Cookie; import javax.ws.rs.core.HttpHeaders; @@ -21,7 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsHttpServletResponseTest { @@ -40,7 +40,7 @@ public class AwsHttpServletResponseTest { private static final String CONTENT_TYPE_WITH_CHARSET = "application/json; charset=UTF-8"; @Test - public void cookie_addCookie_verifyPath() { + void cookie_addCookie_verifyPath() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie pathCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); pathCookie.setPath(COOKIE_PATH); @@ -53,7 +53,7 @@ public void cookie_addCookie_verifyPath() { } @Test - public void cookie_addCookie_verifySecure() { + void cookie_addCookie_verifySecure() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie secureCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); secureCookie.setSecure(true); @@ -66,7 +66,7 @@ public void cookie_addCookie_verifySecure() { } @Test - public void cookie_addCookie_verifyDomain() { + void cookie_addCookie_verifyDomain() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie domainCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); domainCookie.setDomain(COOKIE_DOMAIN); @@ -79,7 +79,7 @@ public void cookie_addCookie_verifyDomain() { } @Test - public void cookie_addCookie_defaultMaxAgeIsNegative() { + void cookie_addCookie_defaultMaxAgeIsNegative() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); maxAgeCookie.setDomain(COOKIE_DOMAIN); @@ -92,7 +92,7 @@ public void cookie_addCookie_defaultMaxAgeIsNegative() { } @Test - public void cookie_addCookie_positiveMaxAgeIsPresent() { + void cookie_addCookie_positiveMaxAgeIsPresent() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); maxAgeCookie.setMaxAge(MAX_AGE_VALUE); @@ -108,7 +108,7 @@ public void cookie_addCookie_positiveMaxAgeIsPresent() { } @Test - public void cookie_addCookie_positiveMaxAgeExpiresDate() { + void cookie_addCookie_positiveMaxAgeExpiresDate() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie maxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); maxAgeCookie.setMaxAge(MAX_AGE_VALUE); @@ -132,7 +132,7 @@ public void cookie_addCookie_positiveMaxAgeExpiresDate() { } @Test - public void cookie_addCookieWithoutMaxAge_expectNoExpires() { + void cookie_addCookieWithoutMaxAge_expectNoExpires() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); Cookie simpleCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); resp.addCookie(simpleCookie); @@ -143,7 +143,7 @@ public void cookie_addCookieWithoutMaxAge_expectNoExpires() { } @Test - public void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { + void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); resp.addHeader("content-type", "application/xml"); @@ -154,7 +154,7 @@ public void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { } @Test - public void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() { + void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.addCookie(new Cookie(COOKIE_NAME, COOKIE_VALUE)); resp.addCookie(new Cookie("Second", "test")); @@ -165,7 +165,7 @@ public void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() } @Test - public void releaseLatch_flushBuffer_expectFlushToWriteAndRelease() { + void releaseLatch_flushBuffer_expectFlushToWriteAndRelease() { CountDownLatch respLatch = new CountDownLatch(1); AwsHttpServletResponse resp = new AwsHttpServletResponse(null, respLatch); String respBody = "Test resp"; @@ -200,7 +200,7 @@ public void releaseLatch_flushBuffer_expectFlushToWriteAndRelease() { } @Test - public void dateHeader_addDateHeader_expectMultipleHeaders() { + void dateHeader_addDateHeader_expectMultipleHeaders() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.addDateHeader("Date", Instant.now().toEpochMilli()); resp.addDateHeader("Date", Instant.now().toEpochMilli() - 1000); @@ -209,7 +209,7 @@ public void dateHeader_addDateHeader_expectMultipleHeaders() { } @Test - public void dateHeader_setDateHeader_expectSingleHeader() { + void dateHeader_setDateHeader_expectSingleHeader() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setDateHeader("Date", Instant.now().toEpochMilli()); resp.setDateHeader("Date", Instant.now().toEpochMilli() - 1000); @@ -218,7 +218,7 @@ public void dateHeader_setDateHeader_expectSingleHeader() { } @Test - public void response_reset_expectEmptyHeadersAndBody() { + void response_reset_expectEmptyHeadersAndBody() { CountDownLatch respLatch = new CountDownLatch(1); AwsHttpServletResponse resp = new AwsHttpServletResponse(null, respLatch); String body = "My Body"; @@ -240,7 +240,7 @@ public void response_reset_expectEmptyHeadersAndBody() { } @Test - public void headers_setIntHeader_expectSingleHeaderValue() { + void headers_setIntHeader_expectSingleHeaderValue() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setIntHeader("Test", 15); resp.setIntHeader("Test", 34); @@ -251,7 +251,7 @@ public void headers_setIntHeader_expectSingleHeaderValue() { } @Test - public void headers_addIntHeader_expectMultipleHeaderValues() { + void headers_addIntHeader_expectMultipleHeaderValues() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.addIntHeader("Test", 15); resp.addIntHeader("Test", 34); @@ -262,7 +262,7 @@ public void headers_addIntHeader_expectMultipleHeaderValues() { } @Test - public void characterEncoding_setCharacterEncoding() { + void characterEncoding_setCharacterEncoding() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setContentType("application/json"); resp.setCharacterEncoding("UTF-8"); @@ -272,7 +272,7 @@ public void characterEncoding_setCharacterEncoding() { } @Test - public void characterEncoding_setContentType() { + void characterEncoding_setContentType() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setContentType("application/json; charset=utf-8"); resp.setCharacterEncoding("UTF-8"); @@ -283,7 +283,7 @@ public void characterEncoding_setContentType() { } @Test - public void characterEncoding_setContentTypeAndsetCharacterEncoding() { + void characterEncoding_setContentTypeAndsetCharacterEncoding() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setContentType("application/json"); resp.setCharacterEncoding("UTF-8"); @@ -294,7 +294,7 @@ public void characterEncoding_setContentTypeAndsetCharacterEncoding() { } @Test - public void characterEncoding_setCharacterEncodingAndsetContentType() { + void characterEncoding_setCharacterEncodingAndsetContentType() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setCharacterEncoding("UTF-8"); resp.setContentType("application/json"); @@ -305,7 +305,7 @@ public void characterEncoding_setCharacterEncodingAndsetContentType() { } @Test - public void characterEncoding_setCharacterEncodingInContentType_characterEncodingPopulatedCorrectly() { + void characterEncoding_setCharacterEncodingInContentType_characterEncodingPopulatedCorrectly() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setContentType(CONTENT_TYPE_WITH_CHARSET); @@ -315,7 +315,7 @@ public void characterEncoding_setCharacterEncodingInContentType_characterEncodin } @Test - public void characterEncoding_setCharacterEncodingInContentType_overridesDefault() { + void characterEncoding_setCharacterEncodingInContentType_overridesDefault() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); resp.setCharacterEncoding(ContainerConfig.DEFAULT_CONTENT_CHARSET); resp.setContentType(CONTENT_TYPE_WITH_CHARSET); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java index bb9e0d47..77dd4bd3 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java @@ -1,18 +1,16 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.Instant; import java.util.Enumeration; -import static junit.framework.TestCase.assertTrue; -import static junit.framework.TestCase.fail; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsHttpSessionTest { @Test - public void new_withNullId_throwsException() { + void new_withNullId_throwsException() { try { AwsHttpSession session = new AwsHttpSession(null); } catch (RuntimeException e) { @@ -23,13 +21,13 @@ public void new_withNullId_throwsException() { } @Test - public void new_withValidId_setsIdCorrectly() { + void new_withValidId_setsIdCorrectly() { AwsHttpSession session = new AwsHttpSession("id"); assertEquals("id", session.getId()); } @Test - public void new_creationTimePopulatedCorrectly() { + void new_creationTimePopulatedCorrectly() { AwsHttpSession session = new AwsHttpSession("id"); assertTrue(session.getCreationTime() > Instant.now().getEpochSecond() - 1); assertEquals(AwsHttpSession.SESSION_DURATION_SEC, session.getMaxInactiveInterval()); @@ -37,7 +35,7 @@ public void new_creationTimePopulatedCorrectly() { } @Test - public void values_throwsUnsupportedOperationException() { + void values_throwsUnsupportedOperationException() { int exCount = 0; AwsHttpSession sess = new AwsHttpSession("id"); @@ -65,7 +63,7 @@ public void values_throwsUnsupportedOperationException() { } @Test - public void attributes_dataStoredCorrectly() throws InterruptedException { + void attributes_dataStoredCorrectly() throws InterruptedException { AwsHttpSession sess = new AwsHttpSession("id"); sess.setAttribute("test", "test"); sess.setAttribute("test2", "test2"); @@ -76,7 +74,7 @@ public void attributes_dataStoredCorrectly() throws InterruptedException { attrsCnt++; } assertEquals(2, attrsCnt); - assertEquals(sess.getAttribute("test"), "test"); + assertEquals("test", sess.getAttribute("test")); sess.removeAttribute("test2"); attrs = sess.getAttributeNames(); attrsCnt = 0; @@ -94,7 +92,7 @@ public void attributes_dataStoredCorrectly() throws InterruptedException { } @Test - public void validSession_expectCorrectValidationOrInvalidation() throws InterruptedException { + void validSession_expectCorrectValidationOrInvalidation() throws InterruptedException { AwsHttpSession sess = new AwsHttpSession("id"); assertTrue(sess.isValid()); assertTrue(sess.isNew()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 838ea660..a185a1f8 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -8,7 +8,7 @@ import org.apache.http.HttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -22,10 +22,7 @@ import java.util.Map; import java.util.Random; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.*; public class AwsProxyHttpServletRequestFormTest { @@ -55,12 +52,12 @@ public class AwsProxyHttpServletRequestFormTest { private static final String ENCODED_FORM_ENTITY = PART_KEY_1 + "=" + ENCODED_VALUE + "&" + PART_KEY_2 + "=" + PART_VALUE_2; @Test - public void postForm_getParam_getEncodedFullValue() { + void postForm_getParam_getEncodedFullValue() { try { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED) - .body(ENCODED_FORM_ENTITY) - .build(); + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED) + .body(ENCODED_FORM_ENTITY) + .build(); HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); assertNotNull(request.getParts()); @@ -71,32 +68,32 @@ public void postForm_getParam_getEncodedFullValue() { } @Test - public void postForm_getParts_parsing() { + void postForm_getParts_parsing() { try { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(MULTIPART_FORM_DATA.getContentType().getName(), MULTIPART_FORM_DATA.getContentType().getValue()) - //.header(formData.getContentEncoding().getName(), formData.getContentEncoding().getValue()) - .body(IOUtils.toString(MULTIPART_FORM_DATA.getContent())) - .build(); + .header(MULTIPART_FORM_DATA.getContentType().getName(), MULTIPART_FORM_DATA.getContentType().getValue()) + //.header(formData.getContentEncoding().getName(), formData.getContentEncoding().getValue()) + .body(IOUtils.toString(MULTIPART_FORM_DATA.getContent(), Charset.defaultCharset())) + .build(); HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); assertNotNull(request.getParts()); assertEquals(2, request.getParts().size()); - assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream())); - assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream())); + assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream(), Charset.defaultCharset())); + assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream(), Charset.defaultCharset())); } catch (IOException | ServletException e) { fail(e.getMessage()); } } @Test - public void multipart_getParts_binary() { + void multipart_getParts_binary() { try { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(MULTIPART_BINARY_DATA.getContentType().getName(), MULTIPART_BINARY_DATA.getContentType().getValue()) - .header(HttpHeaders.CONTENT_LENGTH, MULTIPART_BINARY_DATA.getContentLength() + "") - .binaryBody(MULTIPART_BINARY_DATA.getContent()) - .build(); + .header(MULTIPART_BINARY_DATA.getContentType().getName(), MULTIPART_BINARY_DATA.getContentType().getValue()) + .header(HttpHeaders.CONTENT_LENGTH, MULTIPART_BINARY_DATA.getContentLength() + "") + .binaryBody(MULTIPART_BINARY_DATA.getContent()) + .build(); HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); assertNotNull(request.getParts()); @@ -105,17 +102,17 @@ public void multipart_getParts_binary() { assertEquals(FILE_SIZE, request.getPart(FILE_KEY).getSize()); assertEquals(FILE_KEY, request.getPart(FILE_KEY).getName()); assertEquals(FILE_NAME, request.getPart(FILE_KEY).getSubmittedFileName()); - assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream())); - assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream())); + assertEquals(PART_VALUE_1, IOUtils.toString(request.getPart(PART_KEY_1).getInputStream(), Charset.defaultCharset())); + assertEquals(PART_VALUE_2, IOUtils.toString(request.getPart(PART_KEY_2).getInputStream(), Charset.defaultCharset())); } catch (IOException | ServletException e) { fail(e.getMessage()); } } @Test - public void postForm_getParamsBase64Encoded_expectAllParams() { + void postForm_getParamsBase64Encoded_expectAllParams() { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); proxyRequest.setBody(Base64.getEncoder().encodeToString(ENCODED_FORM_ENTITY.getBytes(Charset.defaultCharset()))); proxyRequest.setIsBase64Encoded(true); @@ -131,7 +128,7 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { * issue #340 */ @Test - public void postForm_emptyParamPresent() { + void postForm_emptyParamPresent() { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); String body = PART_KEY_1 + "=" + "&" + PART_KEY_2 + "=" + PART_VALUE_2; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 166bfb47..486e923a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -7,14 +7,14 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; import java.lang.reflect.Method; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsProxyHttpServletRequestReaderTest { @@ -26,7 +26,7 @@ public class AwsProxyHttpServletRequestReaderTest { private static final String DECODED_REQUEST_PATH = "/foo/bar/Some Thing"; @Test - public void readRequest_validAwsProxy_populatedRequest() { + void readRequest_validAwsProxy_populatedRequest() { AwsProxyRequest request = new AwsProxyRequestBuilder("/path", "GET").header(TEST_HEADER_KEY, TEST_HEADER_VALUE).build(); try { HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); @@ -39,7 +39,7 @@ public void readRequest_validAwsProxy_populatedRequest() { } @Test - public void readRequest_urlDecode_expectDecodedPath() { + void readRequest_urlDecode_expectDecodedPath() { AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").build(); try { HttpServletRequest servletRequest = reader.readRequest(request, null, null, ContainerConfig.defaultConfig()); @@ -54,7 +54,7 @@ public void readRequest_urlDecode_expectDecodedPath() { } @Test - public void readRequest_contentCharset_doesNotOverrideRequestCharset() { + void readRequest_contentCharset_doesNotOverrideRequestCharset() { String requestCharset = "application/json; charset=UTF-8"; AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, requestCharset).build(); try { @@ -70,7 +70,7 @@ public void readRequest_contentCharset_doesNotOverrideRequestCharset() { } @Test - public void readRequest_contentCharset_setsDefaultCharsetWhenNotSpecified() { + void readRequest_contentCharset_setsDefaultCharsetWhenNotSpecified() { String requestCharset = "application/json"; AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, requestCharset).build(); try { @@ -87,7 +87,7 @@ public void readRequest_contentCharset_setsDefaultCharsetWhenNotSpecified() { } @Test - public void readRequest_contentCharset_appendsCharsetToComplextContentType() { + void readRequest_contentCharset_appendsCharsetToComplextContentType() { String contentType = "multipart/form-data; boundary=something"; AwsProxyRequest request = new AwsProxyRequestBuilder(ENCODED_REQUEST_PATH, "GET").header(HttpHeaders.CONTENT_TYPE, contentType).build(); try { @@ -104,7 +104,7 @@ public void readRequest_contentCharset_appendsCharsetToComplextContentType() { } @Test - public void readRequest_validEventEmptyPath_expectException() { + void readRequest_validEventEmptyPath_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder(null, "GET").build(); HttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); @@ -116,7 +116,7 @@ public void readRequest_validEventEmptyPath_expectException() { } @Test - public void readRequest_invalidEventEmptyMethod_expectException() { + void readRequest_invalidEventEmptyMethod_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", null).build(); reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); @@ -127,7 +127,7 @@ public void readRequest_invalidEventEmptyMethod_expectException() { } @Test - public void readRequest_invalidEventEmptyContext_expectException() { + void readRequest_invalidEventEmptyContext_expectException() { try { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); req.setRequestContext(null); @@ -139,7 +139,7 @@ public void readRequest_invalidEventEmptyContext_expectException() { } @Test - public void readRequest_nullHeaders_expectSuccess() { + void readRequest_nullHeaders_expectSuccess() { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); req.setMultiValueHeaders(null); try { @@ -153,7 +153,7 @@ public void readRequest_nullHeaders_expectSuccess() { } @Test - public void readRequest_emptyHeaders_expectSuccess() { + void readRequest_emptyHeaders_expectSuccess() { AwsProxyRequest req = new AwsProxyRequestBuilder("/path", "GET").build(); try { HttpServletRequest servletReq = reader.readRequest(req, null, null, ContainerConfig.defaultConfig()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index de23d855..73c07a8f 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -5,9 +5,8 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; @@ -22,10 +21,9 @@ import java.time.ZonedDateTime; import java.util.*; -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.assumeFalse; -@RunWith(Parameterized.class) public class AwsProxyHttpServletRequestTest { private String requestType; @@ -66,6 +64,7 @@ public class AwsProxyHttpServletRequestTest { .header(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()), MediaType.APPLICATION_JSON); private static final AwsProxyRequestBuilder REQUEST_NULL_QUERY_STRING; + static { AwsProxyRequest awsProxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); awsProxyRequest.setMultiValueQueryStringParameters(null); @@ -78,13 +77,12 @@ public class AwsProxyHttpServletRequestTest { .queryString(FORM_PARAM_NAME, ""); - public AwsProxyHttpServletRequestTest(String type) { + public void initAwsProxyHttpServletRequestTest(String type) { requestType = type; } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API", "WRAP" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API", "WRAP"}); } private HttpServletRequest getRequest(AwsProxyRequestBuilder req, Context lambdaCtx, SecurityContext securityCtx) { @@ -104,16 +102,20 @@ private HttpServletRequest getRequest(AwsProxyRequestBuilder req, Context lambda } - @Test - public void headers_getHeader_validRequest() { + @MethodSource("data") + @ParameterizedTest + void headers_getHeader_validRequest(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(CUSTOM_HEADER_VALUE, request.getHeader(CUSTOM_HEADER_KEY)); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); } - @Test - public void headers_getRefererAndUserAgent_returnsContextValues() { + @MethodSource("data") + @ParameterizedTest + void headers_getRefererAndUserAgent_returnsContextValues(String type) { + initAwsProxyHttpServletRequestTest(type); assumeFalse("ALB".equals(requestType)); HttpServletRequest request = getRequest(REQUEST_USER_AGENT_REFERER, null, null); assertNotNull(request.getHeader("Referer")); @@ -125,45 +127,57 @@ public void headers_getRefererAndUserAgent_returnsContextValues() { assertEquals(USER_AGENT, request.getHeader("user-agent")); } - @Test - public void formParams_getParameter_validForm() { + @MethodSource("data") + @ParameterizedTest + void formParams_getParameter_validForm(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED, null, null); assertNotNull(request); assertNotNull(request.getParameter(FORM_PARAM_NAME)); assertEquals(FORM_PARAM_NAME_VALUE, request.getParameter(FORM_PARAM_NAME)); } - @Test - public void formParams_getParameter_null() { + @MethodSource("data") + @ParameterizedTest + void formParams_getParameter_null(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_INVALID_FORM_URLENCODED, null, null); assertNotNull(request); assertNull(request.getParameter(FORM_PARAM_NAME)); } - @Test - public void formParams_getParameter_multipleParams() { + @MethodSource("data") + @ParameterizedTest + void formParams_getParameter_multipleParams(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(2, request.getParameterValues(FORM_PARAM_NAME).length); } - @Test - public void formParams_getParameter_queryStringPrecendence() { + @MethodSource("data") + @ParameterizedTest + void formParams_getParameter_queryStringPrecendence(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(2, request.getParameterValues(FORM_PARAM_NAME).length); assertEquals(QUERY_STRING_NAME_VALUE, request.getParameter(FORM_PARAM_NAME)); } - @Test - public void dateHeader_noDate_returnNegativeOne() { + @MethodSource("data") + @ParameterizedTest + void dateHeader_noDate_returnNegativeOne(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED_AND_QUERY, null, null); assertNotNull(request); assertEquals(-1L, request.getDateHeader(HttpHeaders.DATE)); } - @Test - public void dateHeader_correctDate_parseToCorrectLong() { + @MethodSource("data") + @ParameterizedTest + void dateHeader_correctDate_parseToCorrectLong(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_WITH_DATE, null, null); assertNotNull(request); @@ -172,32 +186,40 @@ public void dateHeader_correctDate_parseToCorrectLong() { assertEquals(-1L, request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE)); } - @Test - public void scheme_getScheme_https() { + @MethodSource("data") + @ParameterizedTest + void scheme_getScheme_https(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_FORM_URLENCODED, null, null); assertNotNull(request); assertNotNull(request.getScheme()); assertEquals("https", request.getScheme()); } - @Test - public void scheme_getScheme_http() { + @MethodSource("data") + @ParameterizedTest + void scheme_getScheme_http(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getScheme()); assertEquals(REQUEST_SCHEME_HTTP, request.getScheme()); } - @Test - public void cookie_getCookies_noCookies() { + @MethodSource("data") + @ParameterizedTest + void cookie_getCookies_noCookies(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(0, request.getCookies().length); } - @Test - public void cookie_getCookies_singleCookie() { + @MethodSource("data") + @ParameterizedTest + void cookie_getCookies_singleCookie(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_SINGLE_COOKIE, null, null); assertNotNull(request); assertNotNull(request.getCookies()); @@ -206,8 +228,10 @@ public void cookie_getCookies_singleCookie() { assertEquals(FORM_PARAM_NAME_VALUE, request.getCookies()[0].getValue()); } - @Test - public void cookie_getCookies_multipleCookies() { + @MethodSource("data") + @ParameterizedTest + void cookie_getCookies_multipleCookies(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_MULTIPLE_COOKIES, null, null); assertNotNull(request); assertNotNull(request.getCookies()); @@ -218,47 +242,59 @@ public void cookie_getCookies_multipleCookies() { assertEquals(FORM_PARAM_NAME_VALUE, request.getCookies()[1].getValue()); } - @Test - public void cookie_getCookies_emptyCookies() { + @MethodSource("data") + @ParameterizedTest + void cookie_getCookies_emptyCookies(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_MALFORMED_COOKIE, null, null); assertNotNull(request); assertNotNull(request.getCookies()); assertEquals(0, request.getCookies().length); } - @Test - public void queryParameters_getParameterMap_null() { + @MethodSource("data") + @ParameterizedTest + void queryParameters_getParameterMap_null(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_NULL_QUERY_STRING, null, null); assertNotNull(request); assertEquals(0, request.getParameterMap().size()); } - @Test - public void queryParameters_getParameterMap_nonNull() { + @MethodSource("data") + @ParameterizedTest + void queryParameters_getParameterMap_nonNull(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_QUERY, null, null); assertNotNull(request); assertEquals(1, request.getParameterMap().size()); assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(FORM_PARAM_NAME)[0]); } - @Test - public void queryParameters_getParameterMap_nonNull_EmptyParamValue() { + @MethodSource("data") + @ParameterizedTest + void queryParameters_getParameterMap_nonNull_EmptyParamValue(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_QUERY_EMPTY_VALUE, null, null); assertNotNull(request); assertEquals(1, request.getParameterMap().size()); assertEquals("", request.getParameterMap().get(FORM_PARAM_NAME)[0]); } - @Test - public void queryParameters_getParameterNames_null() { + @MethodSource("data") + @ParameterizedTest + void queryParameters_getParameterNames_null(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_NULL_QUERY_STRING, null, null); List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); assertEquals(0, parameterNames.size()); } - @Test - public void queryParameters_getParameterNames_notNull() { + @MethodSource("data") + @ParameterizedTest + void queryParameters_getParameterNames_notNull(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_QUERY, null, null); List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); @@ -266,8 +302,10 @@ public void queryParameters_getParameterNames_notNull() { assertTrue(parameterNames.contains(FORM_PARAM_NAME)); } - @Test - public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { + @MethodSource("data") + @ParameterizedTest + void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_MULTIPLE_FORM_AND_QUERY, null, null); Map params = request.getParameterMap(); @@ -287,23 +325,27 @@ public void queryParameter_getParameterMap_avoidDuplicationOnMultipleCalls() { assertEquals(1, params.get(FORM_PARAM_TEST).length); } - @Test - public void charEncoding_getEncoding_expectNoEncodingWithoutContentType() { - HttpServletRequest request = getRequest(REQUEST_SINGLE_COOKIE, null, null); - try { - request.setCharacterEncoding(StandardCharsets.UTF_8.name()); - // we have not specified a content type so the encoding will not be set - assertNull(request.getCharacterEncoding()); - assertNull(request.getContentType()); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - fail("Unsupported encoding"); + @MethodSource("data") + @ParameterizedTest + void charEncoding_getEncoding_expectNoEncodingWithoutContentType(String type) { + initAwsProxyHttpServletRequestTest(type); + HttpServletRequest request = getRequest(REQUEST_SINGLE_COOKIE, null, null); + try { + request.setCharacterEncoding(StandardCharsets.UTF_8.name()); + // we have not specified a content type so the encoding will not be set + assertNull(request.getCharacterEncoding()); + assertNull(request.getContentType()); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + fail("Unsupported encoding"); - } + } } - @Test - public void charEncoding_getEncoding_expectContentTypeOnly() { + @MethodSource("data") + @ParameterizedTest + void charEncoding_getEncoding_expectContentTypeOnly(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); // we have not specified a content type so the encoding will not be set assertNull(request.getCharacterEncoding()); @@ -320,11 +362,13 @@ public void charEncoding_getEncoding_expectContentTypeOnly() { } } - @Test - public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() { + @MethodSource("data") + @ParameterizedTest + void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(getRequestWithHeaders(), null, null); // we have not specified a content type so the encoding will not be set - assertEquals(null, request.getCharacterEncoding()); + assertNull(request.getCharacterEncoding()); assertEquals(MediaType.APPLICATION_JSON, request.getContentType()); try { @@ -346,8 +390,10 @@ public void charEncoding_addCharEncodingTwice_expectSingleMediaTypeAndEncoding() } } - @Test - public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { + @MethodSource("data") + @ParameterizedTest + void contentType_lowerCaseHeaderKey_expectUpdatedMediaType(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest request = getRequest(REQUEST_WITH_LOWERCASE_HEADER, null, null); try { request.setCharacterEncoding(StandardCharsets.UTF_8.name()); @@ -361,8 +407,10 @@ public void contentType_lowerCaseHeaderKey_expectUpdatedMediaType() { } } - @Test - public void contentType_duplicateCase_expectSingleContentTypeHeader() { + @MethodSource("data") + @ParameterizedTest + void contentType_duplicateCase_expectSingleContentTypeHeader(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyRequest = getRequestWithHeaders(); HttpServletRequest request = getRequest(proxyRequest, null, null); @@ -376,8 +424,10 @@ public void contentType_duplicateCase_expectSingleContentTypeHeader() { } } - @Test - public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { + @MethodSource("data") + @ParameterizedTest + void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting(String type) { + initAwsProxyHttpServletRequestTest(type); assumeFalse("ALB".equals(requestType)); AwsProxyRequestBuilder req = getRequestWithHeaders(); req.apiId("test-id"); @@ -397,8 +447,10 @@ public void requestURL_getUrl_expectHttpSchemaAndLocalhostForLocalTesting() { LambdaContainerHandler.getContainerConfig().getCustomDomainNames().remove("localhost"); } - @Test - public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { + @MethodSource("data") + @ParameterizedTest + void requestURL_getUrlWithCustomBasePath_expectCustomBasePath(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); LambdaContainerHandler.getContainerConfig().setServiceBasePath("test"); HttpServletRequest servletRequest = getRequest(req, null, null); @@ -407,8 +459,10 @@ public void requestURL_getUrlWithCustomBasePath_expectCustomBasePath() { LambdaContainerHandler.getContainerConfig().setServiceBasePath(null); } - @Test - public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { + @MethodSource("data") + @ParameterizedTest + void requestURL_getUrlWithContextPath_expectStageAsContextPath(String type) { + initAwsProxyHttpServletRequestTest(type); assumeFalse("ALB".equals(requestType)); AwsProxyRequestBuilder req = getRequestWithHeaders(); req.stage("test-stage"); @@ -420,8 +474,10 @@ public void requestURL_getUrlWithContextPath_expectStageAsContextPath() { LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } - @Test - public void getLocales_emptyAcceptHeader_expectDefaultLocale() { + @MethodSource("data") + @ParameterizedTest + void getLocales_emptyAcceptHeader_expectDefaultLocale(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); @@ -434,8 +490,10 @@ public void getLocales_emptyAcceptHeader_expectDefaultLocale() { assertEquals(1, localesNo); } - @Test - public void getLocales_validAcceptHeader_expectSingleLocale() { + @MethodSource("data") + @ParameterizedTest + void getLocales_validAcceptHeader_expectSingleLocale(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH"); HttpServletRequest servletRequest = getRequest(req, null, null); @@ -449,8 +507,10 @@ public void getLocales_validAcceptHeader_expectSingleLocale() { assertEquals(1, localesNo); } - @Test - public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { + @MethodSource("data") + @ParameterizedTest + void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); HttpServletRequest servletRequest = getRequest(req, null, null); @@ -470,8 +530,10 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList() { assertEquals(new Locale("fr-CH"), servletRequest.getLocale()); } - @Test - public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered() { + @MethodSource("data") + @ParameterizedTest + void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); HttpServletRequest servletRequest = getRequest(req, null, null); @@ -488,8 +550,10 @@ public void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrde assertEquals(new Locale("*"), localesList.get(4)); } - @Test - public void nullQueryString_expectNoExceptions() { + @MethodSource("data") + @ParameterizedTest + void nullQueryString_expectNoExceptions(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); HttpServletRequest servletReq = getRequest(req, null, null); assertNull(servletReq.getQueryString()); @@ -499,8 +563,10 @@ public void nullQueryString_expectNoExceptions() { assertNull(servletReq.getParameterValues("param")); } - @Test - public void inputStream_emptyBody_expectNullInputStream() { + @MethodSource("data") + @ParameterizedTest + void inputStream_emptyBody_expectNullInputStream(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); assertNull(proxyReq.build().getBody()); HttpServletRequest req = getRequest(proxyReq, null, null); @@ -514,37 +580,47 @@ public void inputStream_emptyBody_expectNullInputStream() { } } - @Test - public void getHeaders_emptyHeaders_expectEmptyEnumeration() { + @MethodSource("data") + @ParameterizedTest + void getHeaders_emptyHeaders_expectEmptyEnumeration(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/hello", "GET"); HttpServletRequest req = getRequest(proxyReq, null, null); assertFalse(req.getHeaders("param").hasMoreElements()); } - @Test - public void getServerPort_defaultPort_expect443() { + @MethodSource("data") + @ParameterizedTest + void getServerPort_defaultPort_expect443(String type) { + initAwsProxyHttpServletRequestTest(type); HttpServletRequest req = getRequest(getRequestWithHeaders(), null, null); assertEquals(443, req.getServerPort()); } - @Test - public void getServerPort_customPortFromHeader_expectCustomPort() { + @MethodSource("data") + @ParameterizedTest + void getServerPort_customPortFromHeader_expectCustomPort(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); proxyReq.header(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "80"); HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(80, req.getServerPort()); } - @Test - public void getServerPort_invalidCustomPortFromHeader_expectDefaultPort() { + @MethodSource("data") + @ParameterizedTest + void getServerPort_invalidCustomPortFromHeader_expectDefaultPort(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = getRequestWithHeaders(); proxyReq.header(AwsProxyHttpServletRequest.PORT_HEADER_NAME, "7200"); HttpServletRequest req = getRequest(proxyReq, null, null); assertEquals(443, req.getServerPort()); } - @Test - public void serverName_emptyHeaders_doesNotThrowNullPointer() { + @MethodSource("data") + @ParameterizedTest + void serverName_emptyHeaders_doesNotThrowNullPointer(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/test", "GET"); proxyReq.multiValueHeaders(null); HttpServletRequest servletReq = getRequest(proxyReq, null, null); @@ -552,8 +628,10 @@ public void serverName_emptyHeaders_doesNotThrowNullPointer() { assertTrue(serverName.startsWith("null.execute-api")); } - @Test - public void serverName_hostHeader_returnsHostHeaderOnly() { + @MethodSource("data") + @ParameterizedTest + void serverName_hostHeader_returnsHostHeaderOnly(String type) { + initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder proxyReq = new AwsProxyRequestBuilder("/test", "GET") .header(HttpHeaders.HOST, "testapi.com"); LambdaContainerHandler.getContainerConfig().addCustomDomain("testapi.com"); @@ -564,8 +642,8 @@ public void serverName_hostHeader_returnsHostHeaderOnly() { private AwsProxyRequestBuilder getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP); + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header(AwsProxyHttpServletRequest.CF_PROTOCOL_HEADER_NAME, REQUEST_SCHEME_HTTP); } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java index d061a111..03c06ad2 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java @@ -10,7 +10,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper; import javax.servlet.Servlet; @@ -21,9 +21,7 @@ import java.nio.charset.Charset; import java.util.concurrent.CountDownLatch; -import static junit.framework.TestCase.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; public class AwsProxyRequestDispatcherTest { public static final String FORWARD_PATH = "/newpath"; @@ -31,9 +29,9 @@ public class AwsProxyRequestDispatcherTest { @Test - public void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { + void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest, null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); dispatcher.setRequestPath(servletRequest, FORWARD_PATH); @@ -41,9 +39,9 @@ public void setPath_forwardByPath_proxyRequestObjectInPropertyReferencesSameProx } @Test - public void setPathForWrappedRequest_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { + void setPathForWrappedRequest_forwardByPath_proxyRequestObjectInPropertyReferencesSameProxyRequest() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest, null, new MockLambdaContext(), ContainerConfig.defaultConfig()); SecurityContextHolderAwareRequestWrapper springSecurityRequest = new SecurityContextHolderAwareRequestWrapper(servletRequest, "ADMIN"); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); @@ -52,7 +50,7 @@ public void setPathForWrappedRequest_forwardByPath_proxyRequestObjectInPropertyR } @Test - public void setPathForWrappedRequestWithoutGatewayEvent_forwardByPath_throwsException() { + void setPathForWrappedRequestWithoutGatewayEvent_forwardByPath_throwsException() { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); AwsProxyHttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyRequest, new MockLambdaContext(), null); SecurityContextHolderAwareRequestWrapper springSecurityRequest = new SecurityContextHolderAwareRequestWrapper(servletRequest, "ADMIN"); @@ -68,9 +66,9 @@ public void setPathForWrappedRequestWithoutGatewayEvent_forwardByPath_throwsExce } @Test - public void forwardRequest_nullHandler_throwsIllegalStateException() throws InvalidRequestEventException { + void forwardRequest_nullHandler_throwsIllegalStateException() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest, null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, null); try { dispatcher.forward(servletRequest, new AwsHttpServletResponse(servletRequest, new CountDownLatch(1))); @@ -86,9 +84,9 @@ public void forwardRequest_nullHandler_throwsIllegalStateException() throws Inva } @Test - public void forwardRequest_committedResponse_throwsIllegalStateException() throws InvalidRequestEventException { + void forwardRequest_committedResponse_throwsIllegalStateException() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest, null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); @@ -107,9 +105,9 @@ public void forwardRequest_committedResponse_throwsIllegalStateException() throw } @Test - public void forwardRequest_partiallyWrittenResponse_resetsBuffer() throws InvalidRequestEventException { + void forwardRequest_partiallyWrittenResponse_resetsBuffer() throws InvalidRequestEventException { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest,null, new MockLambdaContext(), ContainerConfig.defaultConfig()); + HttpServletRequest servletRequest = requestReader.readRequest(proxyRequest, null, new MockLambdaContext(), ContainerConfig.defaultConfig()); AwsProxyRequestDispatcher dispatcher = new AwsProxyRequestDispatcher(FORWARD_PATH, false, mockLambdaHandler(null)); AwsHttpServletResponse resp = new AwsHttpServletResponse(servletRequest, new CountDownLatch(1)); @@ -127,12 +125,12 @@ public void forwardRequest_partiallyWrittenResponse_resetsBuffer() throws Invali } @Test - public void include_addsToResponse_appendsCorrectly() throws InvalidRequestEventException, IOException { + void include_addsToResponse_appendsCorrectly() throws InvalidRequestEventException, IOException { final String firstPart = "first"; final String secondPart = "second"; AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res)-> { + AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res) -> { if (req.getAttribute("cnt") == null) { res.getOutputStream().write(firstPart.getBytes()); req.setAttribute("cnt", 1); @@ -147,13 +145,13 @@ public void include_addsToResponse_appendsCorrectly() throws InvalidRequestEvent } @Test - public void include_appendsNewHeader_cannotAppendNewHeaders() throws InvalidRequestEventException, IOException { + void include_appendsNewHeader_cannotAppendNewHeaders() throws InvalidRequestEventException, IOException { final String firstPart = "first"; final String secondPart = "second"; final String headerKey = "X-Custom-Header"; AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res)-> { + AwsProxyResponse resp = mockLambdaHandler((AwsProxyHttpServletRequest req, AwsHttpServletResponse res) -> { if (req.getAttribute("cnt") == null) { res.getOutputStream().write(firstPart.getBytes()); req.setAttribute("cnt", 1); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 07628f18..5c84bca3 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -4,9 +4,9 @@ import com.amazonaws.serverless.proxy.internal.servlet.filters.UrlPathValidator; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -21,13 +21,13 @@ import java.nio.file.Paths; import java.util.concurrent.CountDownLatch; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsServletContextTest { private static String TMP_DIR = System.getProperty("java.io.tmpdir"); private static final AwsServletContext STATIC_CTX = new AwsServletContext(null); - @BeforeClass + @BeforeAll public static void setUp() { LambdaContainerHandler.getContainerConfig().addValidFilePath("/private/var/task"); File tmpFile = new File(TMP_DIR); @@ -40,8 +40,9 @@ public static void setUp() { LambdaContainerHandler.getContainerConfig().addValidFilePath("C:\\MyTestFolder"); } - @Test @Ignore - public void getMimeType_disabledPath_expectException() { + @Test + @Disabled + void getMimeType_disabledPath_expectException() { AwsServletContext ctx = new AwsServletContext(null); try { assertNull(ctx.getMimeType("/usr/local/lib/nothing")); @@ -54,13 +55,13 @@ public void getMimeType_disabledPath_expectException() { } @Test - public void getMimeType_nonExistentFileInTaskPath_expectNull() { + void getMimeType_nonExistentFileInTaskPath_expectNull() { AwsServletContext ctx = new AwsServletContext(null); assertNull(ctx.getMimeType("/var/task/nothing")); } @Test - public void getMimeType_mimeTypeOfCorrectFile_expectMime() { + void getMimeType_mimeTypeOfCorrectFile_expectMime() { String tmpFilePath = TMP_DIR + "test_text.txt"; AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType(tmpFilePath); @@ -71,7 +72,7 @@ public void getMimeType_mimeTypeOfCorrectFile_expectMime() { } @Test - public void getMimeType_unknownExtension_expectAppOctetStream() { + void getMimeType_unknownExtension_expectAppOctetStream() { AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType("myfile.unkext"); assertEquals("application/octet-stream", mimeType); @@ -79,7 +80,7 @@ public void getMimeType_unknownExtension_expectAppOctetStream() { @Test - public void addFilter_nonExistentFilterClass_expectException() { + void addFilter_nonExistentFilterClass_expectException() { AwsServletContext ctx = new AwsServletContext(null); String filterClass = "com.amazonaws.serverless.TestingFilterClassNonExistent"; try { @@ -92,7 +93,7 @@ public void addFilter_nonExistentFilterClass_expectException() { } @Test - public void addFilter_doesNotImplementFilter_expectException() { + void addFilter_doesNotImplementFilter_expectException() { AwsServletContext ctx = new AwsServletContext(null); try { ctx.addFilter("filter", this.getClass().getName()); @@ -104,7 +105,7 @@ public void addFilter_doesNotImplementFilter_expectException() { } @Test - public void addFilter_validFilter_expectSuccess() { + void addFilter_validFilter_expectSuccess() { AwsServletContext ctx = new AwsServletContext(null); FilterRegistration.Dynamic reg = ctx.addFilter("filter", UrlPathValidator.class.getName()); assertNotNull(reg); @@ -118,7 +119,7 @@ public void addFilter_validFilter_expectSuccess() { } @Test - public void addFilter_validFilter_expectSuccessWithCustomFilterName() { + void addFilter_validFilter_expectSuccessWithCustomFilterName() { AwsServletContext ctx = new AwsServletContext(null); FilterRegistration.Dynamic reg = ctx.addFilter("filter", TestFilter.class.getName()); assertNotNull(reg); @@ -132,18 +133,18 @@ public void addFilter_validFilter_expectSuccessWithCustomFilterName() { } @Test - public void getContextPath_expectEmpty() { + void getContextPath_expectEmpty() { assertEquals("", STATIC_CTX.getContextPath()); } @Test - public void getContext_returnsSameContext() { + void getContext_returnsSameContext() { assertEquals(STATIC_CTX, STATIC_CTX.getContext("1")); assertEquals(STATIC_CTX, STATIC_CTX.getContext("2")); } @Test - public void getVersions_expectStaticVersions() { + void getVersions_expectStaticVersions() { assertEquals(AwsServletContext.SERVLET_API_MAJOR_VERSION, STATIC_CTX.getMajorVersion()); assertEquals(AwsServletContext.SERVLET_API_MINOR_VERSION, STATIC_CTX.getMinorVersion()); assertEquals(AwsServletContext.SERVLET_API_MAJOR_VERSION, STATIC_CTX.getEffectiveMajorVersion()); @@ -151,7 +152,7 @@ public void getVersions_expectStaticVersions() { } @Test - public void startAsync_expectPopulatedAsyncContext() { + void startAsync_expectPopulatedAsyncContext() { HttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/", "GET").build(), null, @@ -164,7 +165,7 @@ public void startAsync_expectPopulatedAsyncContext() { } @Test - public void startAsyncWithNewRequest_expectPopulatedAsyncContext() { + void startAsyncWithNewRequest_expectPopulatedAsyncContext() { HttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/", "GET").build(), null, @@ -182,7 +183,7 @@ public void startAsyncWithNewRequest_expectPopulatedAsyncContext() { } @Test - public void unsupportedOperations_expectExceptions() { + void unsupportedOperations_expectExceptions() { int exCount = 0; try { STATIC_CTX.getResourcePaths("1"); @@ -194,13 +195,13 @@ public void unsupportedOperations_expectExceptions() { } catch (UnsupportedOperationException e) { exCount++; } - assertEquals(2, exCount); + assertEquals(2, exCount); assertNull(STATIC_CTX.getServletRegistration("1")); } @Test - public void servletMappings_expectCorrectServlet() { + void servletMappings_expectCorrectServlet() { AwsServletContext ctx = new AwsServletContext(null); TestServlet srv1 = new TestServlet("srv1"); TestServlet srv2 = new TestServlet("srv2"); @@ -223,7 +224,7 @@ public void servletMappings_expectCorrectServlet() { } @Test - public void addServlet_callsDefaultConstructor() throws ServletException { + void addServlet_callsDefaultConstructor() throws ServletException { AwsServletContext ctx = new AwsServletContext(null); ctx.addServlet("srv1", TestServlet.class); assertNotNull(ctx.getServlet("srv1")); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java index b823da10..105abc61 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java @@ -1,6 +1,6 @@ package com.amazonaws.serverless.proxy.internal.servlet; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.*; @@ -10,12 +10,12 @@ import java.util.Map; import java.util.Set; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class AwsServletRegistrationTest { @Test - public void getMappings_singleMapping_savedCorrectly() { + void getMappings_singleMapping_savedCorrectly() { ServletRegistration.Dynamic reg = new AwsServletRegistration("test", null, new AwsServletContext(null)); reg.addMapping("/"); assertEquals(1, reg.getMappings().size()); @@ -27,7 +27,7 @@ public void getMappings_singleMapping_savedCorrectly() { } @Test - public void metadata_savedAndReturnedCorrectly() { + void metadata_savedAndReturnedCorrectly() { ServletRegistration.Dynamic reg = new AwsServletRegistration("test", null, new AwsServletContext(null)); assertEquals("test", reg.getName()); reg.setLoadOnStartup(2); @@ -40,7 +40,7 @@ public void metadata_savedAndReturnedCorrectly() { } @Test - public void setInitParameter_savedCorrectly() { + void setInitParameter_savedCorrectly() { ServletRegistration.Dynamic reg = new AwsServletRegistration("test", null, new AwsServletContext(null)); assertTrue(reg.setInitParameter("param", "value")); assertFalse(reg.setInitParameter("param", "value")); @@ -55,7 +55,7 @@ public void setInitParameter_savedCorrectly() { } @Test - public void servletConfig_populatesConfig() throws ServletException { + void servletConfig_populatesConfig() throws ServletException { AwsServletContext servletCtx = new AwsServletContext(null); TestServlet servlet = new TestServlet(); ServletRegistration.Dynamic reg = new AwsServletRegistration("test", servlet, servletCtx); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java index 6c39c8d8..1180a5d1 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolderTest.java @@ -3,15 +3,15 @@ import com.amazonaws.serverless.proxy.internal.servlet.filters.UrlPathValidator; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class FilterHolderTest { private static Context lambdaContext = new MockLambdaContext(); @Test - public void annotation_filterRegistration_pathValidator() { + void annotation_filterRegistration_pathValidator() { FilterHolder holder = new FilterHolder(new UrlPathValidator(), new AwsServletContext(null)); assertTrue(holder.isAnnotated()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java index 1481afc7..5ae5aae0 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java @@ -6,17 +6,17 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class ServletLambdaContainerHandlerBuilderTest { @Test - public void validation_throwsException() { + void validation_throwsException() { TestBuilder testBuilder = new TestBuilder(); try { testBuilder.validate(); @@ -27,21 +27,21 @@ public void validation_throwsException() { } @Test - public void additionalMethod_testSetter() { + void additionalMethod_testSetter() { TestBuilder test = new TestBuilder().exceptionHandler(new AwsProxyExceptionHandler()).name("test"); assertEquals("test", test.getName()); } @Test - public void defaultProxy_setsValuesCorrectly() { + void defaultProxy_setsValuesCorrectly() { TestBuilder test = new TestBuilder().defaultProxy().name("test"); assertNotNull(test.initializationWrapper); assertTrue(test.exceptionHandler instanceof AwsProxyExceptionHandler); assertTrue(test.requestReader instanceof AwsProxyHttpServletRequestReader); assertTrue(test.responseWriter instanceof AwsProxyHttpServletResponseWriter); assertTrue(test.securityContextWriter instanceof AwsProxySecurityContextWriter); - assertSame(test.requestTypeClass, AwsProxyRequest.class); - assertSame(test.responseTypeClass, AwsProxyResponse.class); + assertSame(AwsProxyRequest.class, test.requestTypeClass); + assertSame(AwsProxyResponse.class, test.responseTypeClass); assertEquals("test", test.name); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java index beb273d5..11a018eb 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java @@ -5,7 +5,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.FilterHolder; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; @@ -17,12 +17,12 @@ import java.util.HashMap; import java.util.Map; -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; public class UrlPathValidatorTest { @Test - public void init_noConfig_setsDefaultStatusCode() { + void init_noConfig_setsDefaultStatusCode() { UrlPathValidator pathValidator = new UrlPathValidator(); try { pathValidator.init(null); @@ -34,7 +34,7 @@ public void init_noConfig_setsDefaultStatusCode() { } @Test - public void init_withConfig_setsCorrectStatusCode() { + void init_withConfig_setsCorrectStatusCode() { UrlPathValidator pathValidator = new UrlPathValidator(); Map params = new HashMap<>(); params.put(UrlPathValidator.PARAM_INVALID_STATUS_CODE, "401"); @@ -49,7 +49,7 @@ public void init_withConfig_setsCorrectStatusCode() { } @Test - public void init_withWrongConfig_setsDefaultStatusCode() { + void init_withWrongConfig_setsDefaultStatusCode() { UrlPathValidator pathValidator = new UrlPathValidator(); Map params = new HashMap<>(); params.put(UrlPathValidator.PARAM_INVALID_STATUS_CODE, "hello"); @@ -64,7 +64,7 @@ public void init_withWrongConfig_setsDefaultStatusCode() { } @Test - public void doFilter_invalidRelativePathUri_setsDefaultStatusCode() { + void doFilter_invalidRelativePathUri_setsDefaultStatusCode() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("../..", "GET").build(), null, null); AwsHttpServletResponse resp = new AwsHttpServletResponse(req, null); UrlPathValidator pathValidator = new UrlPathValidator(); @@ -79,7 +79,7 @@ public void doFilter_invalidRelativePathUri_setsDefaultStatusCode() { } @Test - public void doFilter_invalidUri_setsDefaultStatusCode() { + void doFilter_invalidUri_setsDefaultStatusCode() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("wonkyprotocol://˝Ó#\u0009", "GET").build(), null, null); AwsHttpServletResponse resp = new AwsHttpServletResponse(req, null); UrlPathValidator pathValidator = new UrlPathValidator(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java index 87ab0ed7..196552c1 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/ApiGatewayAuthorizerContextTest.java @@ -2,11 +2,11 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class ApiGatewayAuthorizerContextTest { private static final String FIELD_NAME_1 = "CUSTOM_FIELD_1"; @@ -60,7 +60,7 @@ public class ApiGatewayAuthorizerContextTest { + "}"; @Test - public void authorizerContext_serialize_customValues() { + void authorizerContext_serialize_customValues() { try { AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString(AUTHORIZER_REQUEST).build(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java index b06e04cf..6d0aa9ee 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -1,13 +1,11 @@ package com.amazonaws.serverless.proxy.model; -import static junit.framework.TestCase.assertTrue; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; + import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,7 +14,7 @@ public class AwsProxyRequestTest { private static final String CUSTOM_HEADER_VALUE = "123456"; @Test - public void deserialize_multiValuedHeaders_caseInsensitive() throws IOException { + void deserialize_multiValuedHeaders_caseInsensitive() throws IOException { AwsProxyRequest req = new AwsProxyRequestBuilder() .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); assertNotNull(req.getMultiValueHeaders().get(CUSTOM_HEADER_KEY_LOWER_CASE.toUpperCase())); @@ -25,7 +23,7 @@ public void deserialize_multiValuedHeaders_caseInsensitive() throws IOException } @Test - public void deserialize_base64Encoded_readsBoolCorrectly() throws IOException { + void deserialize_base64Encoded_readsBoolCorrectly() throws IOException { AwsProxyRequest req = new AwsProxyRequestBuilder() .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); assertTrue(req.isBase64Encoded()); @@ -35,7 +33,7 @@ public void deserialize_base64Encoded_readsBoolCorrectly() throws IOException { } @Test - public void serialize_base64Encoded_fieldContainsIsPrefix() throws IOException { + void serialize_base64Encoded_fieldContainsIsPrefix() throws IOException { AwsProxyRequest req = new AwsProxyRequestBuilder() .fromJsonString(getRequestJson(true, CUSTOM_HEADER_KEY_LOWER_CASE, CUSTOM_HEADER_VALUE)).build(); ObjectMapper mapper = new ObjectMapper(); @@ -106,9 +104,9 @@ private String getRequestJson(boolean base64Encoded, String headerKey, String he } @Test - public void deserialize_singleValuedHeaders() throws IOException { + void deserialize_singleValuedHeaders() throws IOException { AwsProxyRequest req = - new AwsProxyRequestBuilder().fromJsonString(getSingleValueRequestJson()).build(); + new AwsProxyRequestBuilder().fromJsonString(getSingleValueRequestJson()).build(); assertThat(req.getHeaders().get("accept"), is("*")); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java index 55b5d936..1ad2314b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/CognitoAuthorizerClaimsTest.java @@ -2,14 +2,14 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class CognitoAuthorizerClaimsTest { @@ -77,7 +77,7 @@ public class CognitoAuthorizerClaimsTest { @Test - public void claims_serialize_validJsonString() { + void claims_serialize_validJsonString() { try { AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString(USER_POOLS_REQUEST).build(); @@ -90,7 +90,7 @@ public void claims_serialize_validJsonString() { } @Test - public void claims_dateParse_issueTime() { + void claims_dateParse_issueTime() { try { AwsProxyRequest req = new AwsProxyRequestBuilder().fromJsonString(USER_POOLS_REQUEST).build(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java index c673a59e..5a0943d0 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -2,11 +2,11 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class HttpApiV2ProxyRequestTest { @@ -128,10 +128,10 @@ public class HttpApiV2ProxyRequestTest { " \"body\": \"Hello from Lambda\",\n" + " \"isBase64Encoded\": false,\n" + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + - " }\n";; + " }\n"; @Test - public void deserialize_fromJsonString_authorizerPopulatedCorrectly() { + void deserialize_fromJsonString_authorizerPopulatedCorrectly() { try { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); assertTrue(req.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey("claim1")); @@ -143,7 +143,7 @@ public void deserialize_fromJsonString_authorizerPopulatedCorrectly() { } @Test - public void deserialize_fromJsonString_authorizerEmptyMap() { + void deserialize_fromJsonString_authorizerEmptyMap() { try { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); assertNotNull(req.getRequestContext().getAuthorizer()); @@ -156,7 +156,7 @@ public void deserialize_fromJsonString_authorizerEmptyMap() { } @Test - public void deserialize_fromJsonString_lambdaAuthorizer() { + void deserialize_fromJsonString_lambdaAuthorizer() { try { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(LAMBDA_AUTHORIZER, HttpApiV2ProxyRequest.class); assertNotNull(req.getRequestContext().getAuthorizer()); @@ -171,7 +171,7 @@ public void deserialize_fromJsonString_lambdaAuthorizer() { } @Test - public void deserialize_fromJsonString_isBase64EncodedPopulates() { + void deserialize_fromJsonString_isBase64EncodedPopulates() { try { HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); assertFalse(req.isBase64Encoded()); @@ -184,7 +184,7 @@ public void deserialize_fromJsonString_isBase64EncodedPopulates() { } @Test - public void serialize_toJsonString_authorizerPopulatesCorrectly() { + void serialize_toJsonString_authorizerPopulatesCorrectly() { HttpApiV2ProxyRequest req = new HttpApiV2ProxyRequest(); req.setBase64Encoded(false); req.setRequestContext(new HttpApiV2ProxyRequestContext()); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java index edc6d281..c2566cbe 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMapTest.java @@ -1,17 +1,15 @@ package com.amazonaws.serverless.proxy.model; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.*; public class MultiValuedTreeMapTest { @Test - public void add_sameNameCaseSensitive_expectBothValues() { + void add_sameNameCaseSensitive_expectBothValues() { MultiValuedTreeMap map = new MultiValuedTreeMap<>(); map.add("Test", "test"); map.add("Test", "test2"); @@ -28,7 +26,7 @@ public void add_sameNameCaseSensitive_expectBothValues() { } @Test - public void add_sameNameCaseInsensitive_expectOneValue() { + void add_sameNameCaseInsensitive_expectOneValue() { Headers map = new Headers(); map.add("Test", "test"); assertNotNull(map.get("Test")); @@ -41,7 +39,7 @@ public void add_sameNameCaseInsensitive_expectOneValue() { } @Test - public void addFirst_sameNameKey_ExpectFirstReplaced() { + void addFirst_sameNameKey_ExpectFirstReplaced() { MultiValuedTreeMap map = new MultiValuedTreeMap<>(); map.add("Test", "test1"); map.add("Test", "test2"); diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 11c9ee9c..2d491078 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -100,6 +100,11 @@ ${jersey.version} test + + org.junit.jupiter + junit-jupiter + test + @@ -151,7 +156,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.9 + 2.22.2 always diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index dbcaac40..17955532 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -30,9 +30,8 @@ import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -42,16 +41,15 @@ import java.util.Collection; import java.util.UUID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assumptions.assumeTrue; /** * Unit test class for the Jersey AWS_PROXY default implementation */ -@RunWith(Parameterized.class) public class JerseyAwsProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; @@ -62,43 +60,42 @@ public class JerseyAwsProxyTest { private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") - .register(LoggingFeature.class) - .register(ServletRequestFilter.class) - .register(MultiPartFeature.class) - .register(new ResourceBinder()) - .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + .register(LoggingFeature.class) + .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static ResourceConfig httpApiApp = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") - .register(LoggingFeature.class) - .register(ServletRequestFilter.class) - .register(MultiPartFeature.class) - .register(new ResourceBinder()) - .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + .register(LoggingFeature.class) + .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static ResourceConfig appWithoutRegisteredDependencies = new ResourceConfig() - .packages("com.amazonaws.serverless.proxy.jersey") - .register(LoggingFeature.class) - .register(ServletRequestFilter.class) - .register(MultiPartFeature.class) - .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); + .packages("com.amazonaws.serverless.proxy.jersey") + .register(LoggingFeature.class) + .register(ServletRequestFilter.class) + .register(MultiPartFeature.class) + .property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY); private static JerseyLambdaContainerHandler handler; private static JerseyLambdaContainerHandler httpApiHandler; private static JerseyLambdaContainerHandler handlerWithoutRegisteredDependencies - = JerseyLambdaContainerHandler.getAwsProxyHandler(appWithoutRegisteredDependencies); + = JerseyLambdaContainerHandler.getAwsProxyHandler(appWithoutRegisteredDependencies); private static Context lambdaContext = new MockLambdaContext(); private String type; - public JerseyAwsProxyTest(String reqType) { + public void initJerseyAwsProxyTest(String reqType) { type = reqType; } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { @@ -140,11 +137,13 @@ private JerseyLambdaContainerHandler getHandler() { } } - @Test - public void headers_getHeaders_echo() { + @MethodSource("data") + @ParameterizedTest + void headers_getHeaders_echo(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/headers", "GET") - .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -153,11 +152,13 @@ public void headers_getHeaders_echo() { validateMapResponseModel(output); } - @Test - public void headers_servletRequest_echo() { + @MethodSource("data") + @ParameterizedTest + void headers_servletRequest_echo(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-headers", "GET") - .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -166,31 +167,37 @@ public void headers_servletRequest_echo() { validateMapResponseModel(output); } - @Test - public void headers_servletRequest_failedDependencyInjection_expectInternalServerError() { + @MethodSource("data") + @ParameterizedTest + void headers_servletRequest_failedDependencyInjection_expectInternalServerError(String reqType) { + initJerseyAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequest request = getRequestBuilder("/echo/servlet-headers", "GET") - .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .build(); + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .build(); AwsProxyResponse output = handlerWithoutRegisteredDependencies.proxy(request, lambdaContext); assertEquals("application/json", output.getMultiValueHeaders().getFirst("Content-Type")); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), output.getStatusCode()); } - @Test - public void context_servletResponse_setCustomHeader() { + @MethodSource("data") + @ParameterizedTest + void context_servletResponse_setCustomHeader(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-response", "GET") - .json(); + .json(); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertTrue(output.getMultiValueHeaders().containsKey(EchoJerseyResource.SERVLET_RESP_HEADER_KEY)); } - @Test - public void context_serverInfo_correctContext() { + @MethodSource("data") + @ParameterizedTest + void context_serverInfo_correctContext(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/servlet-context", "GET"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -199,10 +206,12 @@ public void context_serverInfo_correctContext() { validateSingleValueModel(output, AwsServletContext.SERVER_INFO); } - @Test - public void requestScheme_valid_expectHttps() { + @MethodSource("data") + @ParameterizedTest + void requestScheme_valid_expectHttps(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/scheme", "GET") - .json(); + .json(); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -211,10 +220,12 @@ public void requestScheme_valid_expectHttps() { validateSingleValueModel(output, "https"); } - @Test - public void requestFilter_injectsServletRequest_expectCustomAttribute() { + @MethodSource("data") + @ParameterizedTest + void requestFilter_injectsServletRequest_expectCustomAttribute(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/filter-attribute", "GET") - .json(); + .json(); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -223,12 +234,14 @@ public void requestFilter_injectsServletRequest_expectCustomAttribute() { validateSingleValueModel(output, ServletRequestFilter.FILTER_ATTRIBUTE_VALUE); } - @Test - public void authorizer_securityContext_customPrincipalSuccess() { + @MethodSource("data") + @ParameterizedTest + void authorizer_securityContext_customPrincipalSuccess(String reqType) { + initJerseyAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); // TODO: We should figure out a way to run this for HTTP_API too AwsProxyRequestBuilder request = getRequestBuilder("/echo/authorizer-principal", "GET") - .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); + .json() + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -236,14 +249,16 @@ public void authorizer_securityContext_customPrincipalSuccess() { validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } - @Test - public void authorizer_securityContext_customAuthorizerContextSuccess() { + @MethodSource("data") + @ParameterizedTest + void authorizer_securityContext_customAuthorizerContextSuccess(String reqType) { + initJerseyAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = getRequestBuilder("/echo/authorizer-context", "GET") - .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) - .authorizerContextValue(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .queryString("key", CUSTOM_HEADER_KEY); + .json() + .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID) + .authorizerContextValue(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) + .queryString("key", CUSTOM_HEADER_KEY); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -252,41 +267,49 @@ public void authorizer_securityContext_customAuthorizerContextSuccess() { validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } - @Test - public void errors_unknownRoute_expect404() { + @MethodSource("data") + @ParameterizedTest + void errors_unknownRoute_expect404(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/test33", "GET"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } - @Test - public void error_contentType_invalidContentType() { + @MethodSource("data") + @ParameterizedTest + void error_contentType_invalidContentType(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/json-body", "POST") - .header("Content-Type", "application/octet-stream") - .body("asdasdasd"); + .header("Content-Type", "application/octet-stream") + .body("asdasdasd"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(415, output.getStatusCode()); } - @Test - public void error_statusCode_methodNotAllowed() { + @MethodSource("data") + @ParameterizedTest + void error_statusCode_methodNotAllowed(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/status-code", "POST") - .json() - .queryString("status", "201"); + .json() + .queryString("status", "201"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(405, output.getStatusCode()); } - @Test - public void responseBody_responseWriter_validBody() throws JsonProcessingException { + @MethodSource("data") + @ParameterizedTest + void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { + initJerseyAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); AwsProxyRequestBuilder request = getRequestBuilder("/echo/json-body", "POST") - .json() - .body(objectMapper.writeValueAsString(singleValueModel)); + .json() + .body(objectMapper.writeValueAsString(singleValueModel)); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -295,18 +318,22 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } - @Test - public void statusCode_responseStatusCode_customStatusCode() { + @MethodSource("data") + @ParameterizedTest + void statusCode_responseStatusCode_customStatusCode(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/status-code", "GET") - .json() - .queryString("status", "201"); + .json() + .queryString("status", "201"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); } - @Test - public void base64_binaryResponse_base64Encoding() { + @MethodSource("data") + @ParameterizedTest + void base64_binaryResponse_base64Encoding(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/binary", "GET"); AwsProxyResponse response = executeRequest(request, lambdaContext); @@ -314,8 +341,10 @@ public void base64_binaryResponse_base64Encoding() { assertTrue(Base64.isBase64(response.getBody())); } - @Test - public void exception_mapException_mapToNotImplemented() { + @MethodSource("data") + @ParameterizedTest + void exception_mapException_mapToNotImplemented(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/exception", "GET"); AwsProxyResponse response = executeRequest(request, lambdaContext); @@ -324,24 +353,28 @@ public void exception_mapException_mapToNotImplemented() { assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); } - @Test - public void stripBasePath_route_shouldRouteCorrectly() { + @MethodSource("data") + @ParameterizedTest + void stripBasePath_route_shouldRouteCorrectly(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") - .json() - .queryString("status", "201"); + .json() + .queryString("status", "201"); getHandler().stripBasePath("/custompath"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(201, output.getStatusCode()); getHandler().stripBasePath(""); } - @Test - public void stripBasePath_route_shouldReturn404WithStageAsContext() { + @MethodSource("data") + @ParameterizedTest + void stripBasePath_route_shouldReturn404WithStageAsContext(String reqType) { + initJerseyAwsProxyTest(reqType); assumeTrue(!"ALB".equals(type)); AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") - .stage("prod") - .json() - .queryString("status", "201"); + .stage("prod") + .json() + .queryString("status", "201"); getHandler().stripBasePath("/custompath"); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); AwsProxyResponse output = executeRequest(request, lambdaContext); @@ -350,57 +383,67 @@ public void stripBasePath_route_shouldReturn404WithStageAsContext() { LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } - @Test - public void stripBasePath_route_shouldReturn404() { + @MethodSource("data") + @ParameterizedTest + void stripBasePath_route_shouldReturn404(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/custompath/echo/status-code", "GET") - .json() - .queryString("status", "201"); + .json() + .queryString("status", "201"); getHandler().stripBasePath("/custom"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); getHandler().stripBasePath(""); } - @Test - public void securityContext_injectPrincipal_expectPrincipalName() { + @MethodSource("data") + @ParameterizedTest + void securityContext_injectPrincipal_expectPrincipalName(String reqType) { + initJerseyAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = getRequestBuilder("/echo/security-context", "GET") - .authorizerPrincipal(USER_PRINCIPAL); + .authorizerPrincipal(USER_PRINCIPAL); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, USER_PRINCIPAL); } - @Test - public void emptyStream_putNullBody_expectPutToSucceed() { + @MethodSource("data") + @ParameterizedTest + void emptyStream_putNullBody_expectPutToSucceed(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/empty-stream/" + CUSTOM_HEADER_KEY + "/test/2", "PUT") - .nullBody() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, CUSTOM_HEADER_KEY); } - @Test - public void refererHeader_headerParam_expectCorrectInjection() { + @MethodSource("data") + @ParameterizedTest + void refererHeader_headerParam_expectCorrectInjection(String reqType) { + initJerseyAwsProxyTest(reqType); String refererValue = "test-referer"; AwsProxyRequestBuilder request = getRequestBuilder("/echo/referer-header", "GET") - .nullBody() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header("Referer", refererValue); + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header("Referer", refererValue); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, refererValue); } - @Test - public void textPlainContent_plain_responseHonorsContentType() { + @MethodSource("data") + @ParameterizedTest + void textPlainContent_plain_responseHonorsContentType(String reqType) { + initJerseyAwsProxyTest(reqType); AwsProxyRequestBuilder req = getRequestBuilder("/echo/plain", "GET") - .nullBody() - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); + .nullBody() + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); AwsProxyResponse resp = executeRequest(req, lambdaContext); assertEquals(200, resp.getStatusCode()); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java index e8e86270..cfbe5c9b 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java @@ -12,16 +12,15 @@ */ package com.amazonaws.serverless.proxy.jersey; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import javax.inject.Singleton; import org.glassfish.jersey.internal.inject.AbstractBinder; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; -import org.junit.Test; - +import org.junit.jupiter.api.Test; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; @@ -47,7 +46,7 @@ protected void configure() { app); @Test - public void can_get_injected_resources() throws Exception { + void can_get_injected_resources() throws Exception { JerseyInjectionTest instance1 = handler.getInjectionManager().getInstance(JerseyInjectionTest.class); assertNotNull(instance1); diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index e736cbc1..25bb26bd 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -14,10 +14,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.ws.rs.core.MediaType; @@ -27,12 +26,11 @@ import java.util.Arrays; import java.util.Collection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.fail; -@RunWith(Parameterized.class) public class JerseyParamEncodingTest { private static final String SIMPLE_ENCODED_PARAM = "p/z+3"; @@ -40,55 +38,54 @@ public class JerseyParamEncodingTest { private static final String QUERY_STRING_KEY = "identifier"; private static final String QUERY_STRING_NON_ENCODED_VALUE = "Space Test"; private static final String QUERY_STRING_ENCODED_VALUE = "Space%20Test"; - private static final byte[] FILE_CONTENTS = new byte[] { - (byte)47, (byte)85, (byte)135, (byte)12, (byte)53, (byte)7, (byte)158, (byte)212, (byte)55, (byte)193, (byte)149, (byte)3, (byte)166, (byte)181, - (byte)151, (byte)84, (byte)122, (byte)200, (byte)244, (byte)5, (byte)115, (byte)159, (byte)66, (byte)64, (byte)143, (byte)211, (byte)13, (byte)63, - (byte)235, (byte)184, (byte)51, (byte)49, (byte)143, (byte)167, (byte)231, (byte)31, (byte)78, (byte)234, (byte)145, (byte)105, (byte)190, (byte)170, - (byte)49, (byte)135, (byte)175, (byte)106, (byte)25, (byte)86, (byte)145, (byte)181, (byte)156, (byte)23, (byte)153, (byte)99, (byte)175, (byte)63, - (byte)43, (byte)208, (byte)5, (byte)16, (byte)140, (byte)103, (byte)146, (byte)254, (byte)155, (byte)97, (byte)53, (byte)100, (byte)137, (byte)6, - (byte)62, (byte)101, (byte)189, (byte)137, (byte)140, (byte)5, (byte)110, (byte)218, (byte)113, (byte)132, (byte)36, (byte)188, (byte)19, (byte)168, - (byte)93, (byte)169, (byte)124, (byte)253, (byte)201, (byte)233, (byte)21, (byte)80, (byte)4, (byte)56, (byte)0, (byte)204, (byte)205, (byte)232, - (byte)213, (byte)253, (byte)232, (byte)91, (byte)153, (byte)169, (byte)82, (byte)247, (byte)78, (byte)71, (byte)188, (byte)71, (byte)23, (byte)171, - (byte)232, (byte)26, (byte)146, (byte)189, (byte)145, (byte)82, (byte)79, (byte)148, (byte)1, (byte)201, (byte)243, (byte)73, (byte)98, (byte)65, - (byte)236, (byte)177, (byte)211, (byte)106, (byte)105, (byte)46, (byte)204, (byte)214, (byte)55, (byte)182, (byte)55, (byte)149, (byte)221, (byte)52, - (byte)186, (byte)122, (byte)255, (byte)195, (byte)60, (byte)146, (byte)21, (byte)212, (byte)139, (byte)38, (byte)146, (byte)166, (byte)14, (byte)174, - (byte)242, (byte)145, (byte)16, (byte)44, (byte)68, (byte)89, (byte)25, (byte)219, (byte)62, (byte)227, (byte)6, (byte)89, (byte)194, (byte)146, (byte)93, - (byte)167, (byte)230, (byte)90, (byte)59, (byte)35, (byte)136, (byte)37, (byte)196, (byte)118, (byte)16, (byte)28, (byte)107, (byte)105, (byte)87, - (byte)195, (byte)86, (byte)87, (byte)180, (byte)176, (byte)118, (byte)6, (byte)29, (byte)26, (byte)51, (byte)94, (byte)21, (byte)23, (byte)32, (byte)156, - (byte)150, (byte)204, (byte)53, (byte)110, (byte)134, (byte)153, (byte)138, (byte)247, (byte)98, (byte)135, (byte)249, (byte)119, (byte)121, (byte)2, - (byte)42, (byte)62, (byte)198, (byte)197, (byte)112, (byte)153, (byte)244, (byte)174, (byte)145, (byte)54, (byte)246, (byte)44, (byte)198, (byte)50, - (byte)2, (byte)37, (byte)102, (byte)50, (byte)103, (byte)207, (byte)81, (byte)62, (byte)138, (byte)164, (byte)140, (byte)64, (byte)247, (byte)115, - (byte)40, (byte)41, (byte)252, (byte)54, (byte)189, (byte)207, (byte)124, (byte)147, (byte)122, (byte)243, (byte)83, (byte)34, (byte)160, (byte)64, (byte)189, (byte)226, (byte)202, (byte)181, (byte)55, (byte)158, (byte)121, (byte)78, (byte)143, (byte)41, (byte)58, (byte)27, (byte)77, (byte)186, (byte)214, (byte)23, (byte)132, (byte)100, (byte)180, (byte)26, (byte)37, (byte)247, (byte)254, (byte)97, (byte)214, (byte)57, (byte)30, (byte)46, (byte)96, (byte)44, (byte)138, (byte)15, (byte)162, (byte)93, (byte)222, (byte)239, (byte)189, (byte)72, (byte)15, (byte)79, (byte)136, (byte)210, (byte)44, (byte)233, (byte)99, (byte)72, (byte)234, (byte)225, (byte)245, (byte)27, (byte)111, (byte)175, (byte)132, (byte)112, (byte)135, (byte)253, (byte)66, (byte)215, (byte)168, (byte)156, (byte)168, (byte)79, (byte)78, (byte)140, (byte)14, (byte)129, (byte)37, (byte)238, (byte)196, (byte)34, (byte)245, (byte)141, (byte)148, (byte)161, (byte)29, (byte)110, (byte)32, (byte)255, (byte)247, (byte)52, (byte)48, (byte)102, (byte)42, (byte)54, (byte)97, (byte)185, (byte)10, (byte)114, (byte)225, (byte)247, (byte)254, (byte)108, (byte)116, (byte)73, (byte)84, (byte)242, (byte)86, (byte)15, (byte)72, (byte)68, (byte)172, (byte)74, (byte)107, (byte)103, (byte)222, (byte)246, (byte)152, (byte)67, (byte)12, (byte)104, (byte)245, (byte)20, (byte)112, (byte)94, (byte)197, (byte)201, (byte)89, (byte)182, (byte)214, (byte)6, (byte)182, (byte)165, (byte)209, (byte)79, (byte)192, (byte)211, (byte)163, (byte)208, (byte)12, (byte)73, (byte)53, (byte)99, (byte)59, (byte)182, (byte)186, (byte)48, (byte)184, (byte)215, (byte)22, (byte)24, (byte)233, (byte)109, (byte)206, (byte)59, (byte)0, (byte)118, (byte)141, (byte)25, (byte)50, (byte)242, (byte)247, (byte)240, (byte)238, (byte)127, (byte)236, (byte)241, (byte)224, (byte)20, (byte)61, (byte)65, (byte)148, (byte)120, (byte)192, (byte)99, (byte)172, (byte)194, (byte)135, (byte)61, (byte)147, (byte)251, (byte)161, (byte)219, (byte)252, (byte)187, (byte)154, (byte)115, (byte)193, (byte)118, (byte)167, (byte)130, (byte)174, (byte)211, (byte)236, (byte)141, (byte)14, (byte)8, (byte)244, (byte)110, (byte)66, (byte)210, (byte)110, (byte)236, (byte)255, (byte)25, (byte)16, (byte)134, (byte)70, (byte)196, (byte)163, (byte)30, (byte)177, (byte)238, (byte)225, (byte)237, (byte)12, (byte)14, (byte)215, (byte)40, (byte)77, (byte)206, (byte)76, (byte)122, (byte)205, (byte)20, (byte)183, (byte)106, (byte)230, (byte)230, (byte)123, (byte)209, (byte)77, (byte)102, (byte)65, (byte)241, (byte)41, (byte)213, (byte)219, (byte)79, (byte)37, (byte)61, (byte)10, (byte)154, (byte)19, (byte)93, (byte)33, (byte)72, (byte)105, (byte)247, (byte)221, (byte)145, (byte)179, (byte)69, (byte)38, (byte)234, (byte)163, (byte)218, (byte)131, (byte)179, (byte)30, (byte)114, (byte)150, (byte)106, (byte)17, (byte)187, (byte)229, (byte)106, (byte)7, (byte)112 + private static final byte[] FILE_CONTENTS = new byte[]{ + (byte)47, (byte)85, (byte)135, (byte)12, (byte)53, (byte)7, (byte)158, (byte)212, (byte)55, (byte)193, (byte)149, (byte)3, (byte)166, (byte)181, + (byte)151, (byte)84, (byte)122, (byte)200, (byte)244, (byte)5, (byte)115, (byte)159, (byte)66, (byte)64, (byte)143, (byte)211, (byte)13, (byte)63, + (byte)235, (byte)184, (byte)51, (byte)49, (byte)143, (byte)167, (byte)231, (byte)31, (byte)78, (byte)234, (byte)145, (byte)105, (byte)190, (byte)170, + (byte)49, (byte)135, (byte)175, (byte)106, (byte)25, (byte)86, (byte)145, (byte)181, (byte)156, (byte)23, (byte)153, (byte)99, (byte)175, (byte)63, + (byte)43, (byte)208, (byte)5, (byte)16, (byte)140, (byte)103, (byte)146, (byte)254, (byte)155, (byte)97, (byte)53, (byte)100, (byte)137, (byte)6, + (byte)62, (byte)101, (byte)189, (byte)137, (byte)140, (byte)5, (byte)110, (byte)218, (byte)113, (byte)132, (byte)36, (byte)188, (byte)19, (byte)168, + (byte)93, (byte)169, (byte)124, (byte)253, (byte)201, (byte)233, (byte)21, (byte)80, (byte)4, (byte)56, (byte)0, (byte)204, (byte)205, (byte)232, + (byte)213, (byte)253, (byte)232, (byte)91, (byte)153, (byte)169, (byte)82, (byte)247, (byte)78, (byte)71, (byte)188, (byte)71, (byte)23, (byte)171, + (byte)232, (byte)26, (byte)146, (byte)189, (byte)145, (byte)82, (byte)79, (byte)148, (byte)1, (byte)201, (byte)243, (byte)73, (byte)98, (byte)65, + (byte)236, (byte)177, (byte)211, (byte)106, (byte)105, (byte)46, (byte)204, (byte)214, (byte)55, (byte)182, (byte)55, (byte)149, (byte)221, (byte)52, + (byte)186, (byte)122, (byte)255, (byte)195, (byte)60, (byte)146, (byte)21, (byte)212, (byte)139, (byte)38, (byte)146, (byte)166, (byte)14, (byte)174, + (byte)242, (byte)145, (byte)16, (byte)44, (byte)68, (byte)89, (byte)25, (byte)219, (byte)62, (byte)227, (byte)6, (byte)89, (byte)194, (byte)146, (byte)93, + (byte)167, (byte)230, (byte)90, (byte)59, (byte)35, (byte)136, (byte)37, (byte)196, (byte)118, (byte)16, (byte)28, (byte)107, (byte)105, (byte)87, + (byte)195, (byte)86, (byte)87, (byte)180, (byte)176, (byte)118, (byte)6, (byte)29, (byte)26, (byte)51, (byte)94, (byte)21, (byte)23, (byte)32, (byte)156, + (byte)150, (byte)204, (byte)53, (byte)110, (byte)134, (byte)153, (byte)138, (byte)247, (byte)98, (byte)135, (byte)249, (byte)119, (byte)121, (byte)2, + (byte)42, (byte)62, (byte)198, (byte)197, (byte)112, (byte)153, (byte)244, (byte)174, (byte)145, (byte)54, (byte)246, (byte)44, (byte)198, (byte)50, + (byte)2, (byte)37, (byte)102, (byte)50, (byte)103, (byte)207, (byte)81, (byte)62, (byte)138, (byte)164, (byte)140, (byte)64, (byte)247, (byte)115, + (byte)40, (byte)41, (byte)252, (byte)54, (byte)189, (byte)207, (byte)124, (byte)147, (byte)122, (byte)243, (byte)83, (byte)34, (byte)160, (byte)64, (byte)189, (byte)226, (byte)202, (byte)181, (byte)55, (byte)158, (byte)121, (byte)78, (byte)143, (byte)41, (byte)58, (byte)27, (byte)77, (byte)186, (byte)214, (byte)23, (byte)132, (byte)100, (byte)180, (byte)26, (byte)37, (byte)247, (byte)254, (byte)97, (byte)214, (byte)57, (byte)30, (byte)46, (byte)96, (byte)44, (byte)138, (byte)15, (byte)162, (byte)93, (byte)222, (byte)239, (byte)189, (byte)72, (byte)15, (byte)79, (byte)136, (byte)210, (byte)44, (byte)233, (byte)99, (byte)72, (byte)234, (byte)225, (byte)245, (byte)27, (byte)111, (byte)175, (byte)132, (byte)112, (byte)135, (byte)253, (byte)66, (byte)215, (byte)168, (byte)156, (byte)168, (byte)79, (byte)78, (byte)140, (byte)14, (byte)129, (byte)37, (byte)238, (byte)196, (byte)34, (byte)245, (byte)141, (byte)148, (byte)161, (byte)29, (byte)110, (byte)32, (byte)255, (byte)247, (byte)52, (byte)48, (byte)102, (byte)42, (byte)54, (byte)97, (byte)185, (byte)10, (byte)114, (byte)225, (byte)247, (byte)254, (byte)108, (byte)116, (byte)73, (byte)84, (byte)242, (byte)86, (byte)15, (byte)72, (byte)68, (byte)172, (byte)74, (byte)107, (byte)103, (byte)222, (byte)246, (byte)152, (byte)67, (byte)12, (byte)104, (byte)245, (byte)20, (byte)112, (byte)94, (byte)197, (byte)201, (byte)89, (byte)182, (byte)214, (byte)6, (byte)182, (byte)165, (byte)209, (byte)79, (byte)192, (byte)211, (byte)163, (byte)208, (byte)12, (byte)73, (byte)53, (byte)99, (byte)59, (byte)182, (byte)186, (byte)48, (byte)184, (byte)215, (byte)22, (byte)24, (byte)233, (byte)109, (byte)206, (byte)59, (byte)0, (byte)118, (byte)141, (byte)25, (byte)50, (byte)242, (byte)247, (byte)240, (byte)238, (byte)127, (byte)236, (byte)241, (byte)224, (byte)20, (byte)61, (byte)65, (byte)148, (byte)120, (byte)192, (byte)99, (byte)172, (byte)194, (byte)135, (byte)61, (byte)147, (byte)251, (byte)161, (byte)219, (byte)252, (byte)187, (byte)154, (byte)115, (byte)193, (byte)118, (byte)167, (byte)130, (byte)174, (byte)211, (byte)236, (byte)141, (byte)14, (byte)8, (byte)244, (byte)110, (byte)66, (byte)210, (byte)110, (byte)236, (byte)255, (byte)25, (byte)16, (byte)134, (byte)70, (byte)196, (byte)163, (byte)30, (byte)177, (byte)238, (byte)225, (byte)237, (byte)12, (byte)14, (byte)215, (byte)40, (byte)77, (byte)206, (byte)76, (byte)122, (byte)205, (byte)20, (byte)183, (byte)106, (byte)230, (byte)230, (byte)123, (byte)209, (byte)77, (byte)102, (byte)65, (byte)241, (byte)41, (byte)213, (byte)219, (byte)79, (byte)37, (byte)61, (byte)10, (byte)154, (byte)19, (byte)93, (byte)33, (byte)72, (byte)105, (byte)247, (byte)221, (byte)145, (byte)179, (byte)69, (byte)38, (byte)234, (byte)163, (byte)218, (byte)131, (byte)179, (byte)30, (byte)114, (byte)150, (byte)106, (byte)17, (byte)187, (byte)229, (byte)106, (byte)7, (byte)112 }; private static ObjectMapper objectMapper = new ObjectMapper(); private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") - .register(MultiPartFeature.class) - .register(new ResourceBinder()) - .property("jersey.config.server.tracing.type", "ALL") - .property("jersey.config.server.tracing.threshold", "VERBOSE"); + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property("jersey.config.server.tracing.type", "ALL") + .property("jersey.config.server.tracing.threshold", "VERBOSE"); private static JerseyLambdaContainerHandler handler; private static ResourceConfig httpApiApp = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey") - .register(MultiPartFeature.class) - .register(new ResourceBinder()) - .property("jersey.config.server.tracing.type", "ALL") - .property("jersey.config.server.tracing.threshold", "VERBOSE"); + .register(MultiPartFeature.class) + .register(new ResourceBinder()) + .property("jersey.config.server.tracing.type", "ALL") + .property("jersey.config.server.tracing.threshold", "VERBOSE"); private static JerseyLambdaContainerHandler httpApiHandler; private static Context lambdaContext = new MockLambdaContext(); private String type; - public JerseyParamEncodingTest(String reqType) { + public void initJerseyParamEncodingTest(String reqType) { type = reqType; LambdaContainerHandler.getContainerConfig().addBinaryContentTypes(MediaType.MULTIPART_FORM_DATA); } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } private AwsProxyRequestBuilder getRequestBuilder(String path, String method) { @@ -117,11 +114,13 @@ private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, C } } - @Test - public void queryString_uriInfo_echo() { + @MethodSource("data") + @ParameterizedTest + void queryString_uriInfo_echo(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -130,11 +129,13 @@ public void queryString_uriInfo_echo() { validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } - @Test - public void queryString_notEncoded_echo() { + @MethodSource("data") + @ParameterizedTest + void queryString_notEncoded_echo(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -143,12 +144,14 @@ public void queryString_notEncoded_echo() { validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } - @Test - @Ignore("We expect to only receive decoded values from API Gateway") - public void queryString_encoded_echo() { + @ParameterizedTest + @Disabled("We expect to only receive decoded values from API Gateway") + @MethodSource("data") + void queryString_encoded_echo(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/query-string", "GET") - .json() - .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE); + .json() + .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -157,8 +160,10 @@ public void queryString_encoded_echo() { validateMapResponseModel(output, QUERY_STRING_KEY, QUERY_STRING_NON_ENCODED_VALUE); } - @Test - public void simpleQueryParam_encoding_expectDecodedParam() { + @MethodSource("data") + @ParameterizedTest + void simpleQueryParam_encoding_expectDecodedParam(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM); AwsProxyResponse resp = executeRequest(request, lambdaContext); @@ -166,8 +171,10 @@ public void simpleQueryParam_encoding_expectDecodedParam() { validateSingleValueModel(resp, SIMPLE_ENCODED_PARAM); } - @Test - public void jsonQueryParam_encoding_expectDecodedParam() { + @MethodSource("data") + @ParameterizedTest + void jsonQueryParam_encoding_expectDecodedParam(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/decoded-param", "GET").queryString("param", JSON_ENCODED_PARAM); AwsProxyResponse resp = executeRequest(request, lambdaContext); @@ -175,8 +182,10 @@ public void jsonQueryParam_encoding_expectDecodedParam() { validateSingleValueModel(resp, JSON_ENCODED_PARAM); } - @Test - public void simpleQueryParam_encoding_expectEncodedParam() { + @MethodSource("data") + @ParameterizedTest + void simpleQueryParam_encoding_expectEncodedParam(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", SIMPLE_ENCODED_PARAM); String encodedVal = ""; try { @@ -189,8 +198,10 @@ public void simpleQueryParam_encoding_expectEncodedParam() { validateSingleValueModel(resp, encodedVal); } - @Test - public void jsonQueryParam_encoding_expectEncodedParam() { + @MethodSource("data") + @ParameterizedTest + void jsonQueryParam_encoding_expectEncodedParam(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", JSON_ENCODED_PARAM); String encodedVal = ""; try { @@ -203,52 +214,62 @@ public void jsonQueryParam_encoding_expectEncodedParam() { validateSingleValueModel(resp, encodedVal); } - @Test - public void queryParam_encoding_expectFullyEncodedUrl() { + @MethodSource("data") + @ParameterizedTest + void queryParam_encoding_expectFullyEncodedUrl(String reqType) { + initJerseyParamEncodingTest(reqType); String paramValue = "/+="; AwsProxyRequestBuilder request = getRequestBuilder("/echo/encoded-param", "GET").queryString("param", paramValue); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); - assertEquals(resp.getStatusCode(), 200); + assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, "%2F%2B%3D"); } - @Test - public void pathParam_encoded_routesToCorrectPath() { + @MethodSource("data") + @ParameterizedTest + void pathParam_encoded_routesToCorrectPath(String reqType) { + initJerseyParamEncodingTest(reqType); String encodedParam = "http%3A%2F%2Fhelloresource.com"; String path = "/echo/encoded-path/" + encodedParam; AwsProxyRequestBuilder request = getRequestBuilder(path, "GET"); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); - assertEquals(resp.getStatusCode(), 200); + assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, encodedParam); } - @Test - public void pathParam_encoded_returns404() { + @MethodSource("data") + @ParameterizedTest + void pathParam_encoded_returns404(String reqType) { + initJerseyParamEncodingTest(reqType); String encodedParam = "http://helloresource.com"; String path = "/echo/encoded-path/" + encodedParam; AwsProxyRequestBuilder request = getRequestBuilder(path, "GET"); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); - assertEquals(resp.getStatusCode(), 404); + assertEquals(404, resp.getStatusCode()); } - @Test - @Ignore - public void queryParam_listOfString_expectCorrectLength() { + @ParameterizedTest + @Disabled + @MethodSource("data") + void queryParam_listOfString_expectCorrectLength(String reqType) { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/list-query-string", "GET").queryString("list", "v1,v2,v3"); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); - assertEquals(resp.getStatusCode(), 200); + assertEquals(200, resp.getStatusCode()); validateSingleValueModel(resp, "3"); } - @Test - public void multipart_getFileSize_expectCorrectLength() - throws IOException { + @MethodSource("data") + @ParameterizedTest + void multipart_getFileSize_expectCorrectLength(String reqType) + throws IOException { + initJerseyParamEncodingTest(reqType); AwsProxyRequestBuilder request = getRequestBuilder("/echo/file-size", "POST") - .formFilePart("file", "myfile.jpg", FILE_CONTENTS); + .formFilePart("file", "myfile.jpg", FILE_CONTENTS); AwsProxyResponse resp = executeRequest(request, lambdaContext); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 9da5aa34..f5ea6b86 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -33,6 +33,11 @@ spark-core ${spark.version} + + org.junit.jupiter + junit-jupiter + test + @@ -84,7 +89,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.9 + 2.22.2 always diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index 0c41f91f..56087ed6 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -10,10 +10,9 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.AfterClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import spark.Spark; import javax.servlet.http.Cookie; @@ -23,15 +22,12 @@ import java.util.Arrays; import java.util.Collection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.*; import static spark.Spark.get; // This class doesn't actually test Spark. Instead it tests the proxyStream method of the // LambdaContainerHandler object. We use the Spark implementation for this because it's the // fastest to start -@RunWith(Parameterized.class) public class HelloWorldSparkStreamTest { private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "My Header Value"; @@ -47,7 +43,7 @@ public class HelloWorldSparkStreamTest { private String type; - public HelloWorldSparkStreamTest(String reqType) { + public void initHelloWorldSparkStreamTest(String reqType) { type = reqType; try { switch (type) { @@ -70,9 +66,8 @@ public HelloWorldSparkStreamTest(String reqType) { } } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } private AwsProxyRequestBuilder getRequestBuilder() { @@ -97,13 +92,15 @@ private ByteArrayOutputStream executeRequest(AwsProxyRequestBuilder requestBuild return os; } - @AfterClass + @AfterAll public static void stopSpark() { Spark.stop(); } - @Test - public void helloRequest_basicStream_populatesOutputSuccessfully() { + @MethodSource("data") + @ParameterizedTest + void helloRequest_basicStream_populatesOutputSuccessfully(String reqType) { + initHelloWorldSparkStreamTest(reqType); try { ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path("/hello"), new MockLambdaContext()); AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); @@ -118,8 +115,10 @@ public void helloRequest_basicStream_populatesOutputSuccessfully() { } } - @Test - public void nullPathRequest_doesntFail_expectA404() { + @MethodSource("data") + @ParameterizedTest + void nullPathRequest_doesntFail_expectA404(String reqType) { + initHelloWorldSparkStreamTest(reqType); try { ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path(null), new MockLambdaContext()); AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 108eeabe..5402b6a9 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -7,11 +7,10 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import spark.Spark; import javax.servlet.http.Cookie; @@ -20,11 +19,10 @@ import java.util.Arrays; import java.util.Collection; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static spark.Spark.get; -@RunWith(Parameterized.class) public class HelloWorldSparkTest { private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; private static final String CUSTOM_HEADER_VALUE = "My Header Value"; @@ -41,13 +39,12 @@ public class HelloWorldSparkTest { private boolean isAlb; - public HelloWorldSparkTest(boolean alb) { + public void initHelloWorldSparkTest(boolean alb) { isAlb = alb; } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { false, true }); + return Arrays.asList(new Object[]{false, true}); } private AwsProxyRequestBuilder getRequestBuilder() { @@ -57,7 +54,7 @@ private AwsProxyRequestBuilder getRequestBuilder() { return builder; } - @BeforeClass + @BeforeAll public static void initializeServer() { try { handler = SparkLambdaContainerHandler.getAwsProxyHandler(); @@ -70,13 +67,15 @@ public static void initializeServer() { } } - @AfterClass + @AfterAll public static void stopSpark() { Spark.stop(); } - @Test - public void basicServer_handleRequest_emptyFilters() { + @MethodSource("data") + @ParameterizedTest + void basicServer_handleRequest_emptyFilters(boolean alb) { + initHelloWorldSparkTest(alb); AwsProxyRequest req = getRequestBuilder().method("GET").path("/hello").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); @@ -86,8 +85,10 @@ public void basicServer_handleRequest_emptyFilters() { assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } - @Test - public void addCookie_setCookieOnResponse_validCustomCookie() { + @MethodSource("data") + @ParameterizedTest + void addCookie_setCookieOnResponse_validCustomCookie(boolean alb) { + initHelloWorldSparkTest(alb); AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); @@ -98,8 +99,10 @@ public void addCookie_setCookieOnResponse_validCustomCookie() { assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); } - @Test - public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { + @MethodSource("data") + @ParameterizedTest + void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues(boolean alb) { + initHelloWorldSparkTest(alb); AwsProxyRequest req = getRequestBuilder().method("GET").path("/multi-cookie").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); @@ -113,8 +116,10 @@ public void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues() { assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); } - @Test - public void rootResource_basicRequest_expectSuccess() { + @MethodSource("data") + @ParameterizedTest + void rootResource_basicRequest_expectSuccess(boolean alb) { + initHelloWorldSparkTest(alb); AwsProxyRequest req = getRequestBuilder().method("GET").path("/").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); @@ -124,8 +129,10 @@ public void rootResource_basicRequest_expectSuccess() { assertEquals(BODY_TEXT_RESPONSE, response.getBody()); } - @Test - public void readCookie_customDomainName_expectValidCookie() { + @MethodSource("data") + @ParameterizedTest + void readCookie_customDomainName_expectValidCookie(boolean alb) { + initHelloWorldSparkTest(alb); AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie-read").cookie(READ_COOKIE_NAME, "test").build(); AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); assertEquals("test", response.getBody()); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java index 6042899e..92c84a49 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java @@ -11,15 +11,13 @@ import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; -import org.junit.AfterClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; import spark.Spark; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.anyString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; @@ -33,11 +31,11 @@ public class InitExceptionHandlerTest { private static LambdaEmbeddedServer embeddedServer = mock(LambdaEmbeddedServer.class); @Test - public void initException_mockException_expectHandlerToRun() { + void initException_mockException_expectHandlerToRun() { try { - when(embeddedServer.ignite(anyString(), anyInt(), anyObject(), anyInt(), anyInt(), anyInt())) - .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null)); + when(embeddedServer.ignite(anyString(), anyInt(), any(), anyInt(), anyInt(), anyInt())) + .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null)); LambdaEmbeddedServerFactory serverFactory = new LambdaEmbeddedServerFactory(embeddedServer); new SparkLambdaContainerHandler<>(AwsProxyRequest.class, AwsProxyResponse.class, @@ -56,7 +54,7 @@ public void initException_mockException_expectHandlerToRun() { } - @AfterClass + @AfterAll public static void stopSpark() { // un-mock the embedded server to avoid blocking other tests reset(embeddedServer); diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index c778bd57..52f2a538 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -9,8 +9,8 @@ import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; import com.amazonaws.serverless.proxy.spark.filter.UnauthenticatedFilter; -import org.junit.AfterClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; import spark.Spark; import javax.servlet.DispatcherType; @@ -18,7 +18,7 @@ import java.util.EnumSet; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static spark.Spark.get; @@ -26,11 +26,11 @@ public class SparkLambdaContainerHandlerTest { private static final String RESPONSE_BODY_TEXT = "hello"; @Test - public void filters_onStartupMethod_executeFilters() { + void filters_onStartupMethod_executeFilters() { SparkLambdaContainerHandler handler = null; try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); + handler = SparkLambdaContainerHandler.getAwsProxyHandler(); } catch (ContainerInitializationException e) { e.printStackTrace(); fail(); @@ -62,7 +62,7 @@ public void filters_onStartupMethod_executeFilters() { } @Test - public void filters_unauthenticatedFilter_stopRequestProcessing() { + void filters_unauthenticatedFilter_stopRequestProcessing() { SparkLambdaContainerHandler handler = null; try { @@ -97,7 +97,7 @@ public void filters_unauthenticatedFilter_stopRequestProcessing() { // now we test with the custom header, this should stop request processing in the // filter and return an unauthenticated response AwsProxyRequest unauthReq = new AwsProxyRequestBuilder().method("GET").path("/unauth") - .header(UnauthenticatedFilter.HEADER_NAME, "1").build(); + .header(UnauthenticatedFilter.HEADER_NAME, "1").build(); AwsProxyResponse unauthResp = handler.proxy(unauthReq, new MockLambdaContext()); assertNotNull(unauthResp); @@ -105,7 +105,7 @@ public void filters_unauthenticatedFilter_stopRequestProcessing() { assertEquals("", unauthResp.getBody()); } - @AfterClass + @AfterAll public static void stopSpark() { Spark.stop(); } diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java index 968b2b47..8cb34eae 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java @@ -1,18 +1,18 @@ package com.amazonaws.serverless.proxy.spark.embeddedserver; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Optional; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.fail; public class LambdaEmbeddedServerTest { private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, null, false); @Test - public void webSocket_configureWebSocket_noException() { + void webSocket_configureWebSocket_noException() { try { server.configureWebSockets(null, Optional.of(0L)); } catch (Exception e) { diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b238a0d5..be0c1d9f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -74,6 +74,11 @@ 6.2.1.Final test + + org.junit.jupiter + junit-jupiter + test + javax.el @@ -199,7 +204,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.9 + 2.22.2 always diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java index 0844b624..a33d5374 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -8,19 +8,17 @@ import com.amazonaws.serverless.proxy.spring.springslowapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.springslowapp.MessageController; import com.amazonaws.serverless.proxy.spring.springslowapp.SlowAppConfig; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.Instant; import java.util.Objects; -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; +import static org.junit.jupiter.api.Assertions.*; public class SlowAppTest { @Test - public void springSlowApp_continuesInBackgroundThread_returnsCorrect() { + void springSlowApp_continuesInBackgroundThread_returnsCorrect() { LambdaHandler slowApp = null; try { slowApp = new LambdaHandler(); @@ -36,7 +34,7 @@ public void springSlowApp_continuesInBackgroundThread_returnsCorrect() { long endRequestTime = Instant.now().toEpochMilli(); assertTrue(endRequestTime - startRequestTime > SlowAppConfig.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); assertEquals(200, resp.getStatusCode()); - Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index c1365a5b..6c744f6b 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -18,10 +18,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -44,11 +43,10 @@ import java.util.EnumSet; import java.util.UUID; -import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; -import static org.junit.Assume.assumeTrue; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.assumeFalse; +import static org.junit.jupiter.api.Assumptions.assumeTrue; -@RunWith(Parameterized.class) public class SpringAwsProxyTest { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; @@ -72,12 +70,11 @@ public class SpringAwsProxyTest { private String type; - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } - public SpringAwsProxyTest(String reqType) { + public void initSpringAwsProxyTest(String reqType) { type = reqType; } @@ -112,16 +109,18 @@ private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, C } } - @Before + @BeforeEach public void clearServletContextCache() { AwsServletContext.clearServletContextCache(); } - @Test - public void controllerAdvice_invalidPath_returnAdvice() { + @MethodSource("data") + @ParameterizedTest + void controllerAdvice_invalidPath_returnAdvice(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo2", "GET") - .json() - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); + .json() + .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); AwsProxyResponse output = executeRequest(request, lambdaContext); assertNotNull(output); @@ -130,8 +129,10 @@ public void controllerAdvice_invalidPath_returnAdvice() { } - @Test - public void headers_getHeaders_echo() { + @MethodSource("data") + @ParameterizedTest + void headers_getHeaders_echo(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); @@ -143,8 +144,10 @@ public void headers_getHeaders_echo() { validateMapResponseModel(output); } - @Test - public void headers_servletRequest_echo() { + @MethodSource("data") + @ParameterizedTest + void headers_servletRequest_echo(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/servlet-headers", "GET") .json() .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); @@ -156,8 +159,10 @@ public void headers_servletRequest_echo() { validateMapResponseModel(output); } - @Test - public void queryString_uriInfo_echo() { + @MethodSource("data") + @ParameterizedTest + void queryString_uriInfo_echo(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/query-string", "GET") .json() .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); @@ -169,11 +174,13 @@ public void queryString_uriInfo_echo() { validateMapResponseModel(output); } - @Test - public void queryString_listParameter_expectCorrectLength() { + @MethodSource("data") + @ParameterizedTest + void queryString_listParameter_expectCorrectLength(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/list-query-string", "GET") - .json() - .queryString("list", "v1,v2,v3"); + .json() + .queryString("list", "v1,v2,v3"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -181,13 +188,15 @@ public void queryString_listParameter_expectCorrectLength() { validateSingleValueModel(output, "3"); } - @Test - public void queryString_multiParam_expectCorrectValueCount() + @MethodSource("data") + @ParameterizedTest + void queryString_multiParam_expectCorrectValueCount(String reqType) throws IOException { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/multivalue-query-string", "GET") - .json() - .queryString("multiple", "first") - .queryString("multiple", "second"); + .json() + .queryString("multiple", "first") + .queryString("multiple", "second"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -198,36 +207,42 @@ public void queryString_multiParam_expectCorrectValueCount() assertTrue(response.getValues().containsKey("second")); } - @Test - public void dateHeader_notModified_expect304() { + @MethodSource("data") + @ParameterizedTest + void dateHeader_notModified_expect304(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") - .json() - .header( - HttpHeaders.IF_MODIFIED_SINCE, - DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(1, ChronoUnit.SECONDS)) - ); + .json() + .header( + HttpHeaders.IF_MODIFIED_SINCE, + DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(1, ChronoUnit.SECONDS)) + ); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(304, output.getStatusCode()); assertEquals("", output.getBody()); } - @Test - public void dateHeader_notModified_expect200() { + @MethodSource("data") + @ParameterizedTest + void dateHeader_notModified_expect200(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/last-modified", "GET") - .json() - .header( - HttpHeaders.IF_MODIFIED_SINCE, - DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(5, ChronoUnit.DAYS)) - ); + .json() + .header( + HttpHeaders.IF_MODIFIED_SINCE, + DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now().minus(5, ChronoUnit.DAYS)) + ); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); assertEquals(EchoResource.STRING_BODY, output.getBody()); } - @Test - public void authorizer_securityContext_customPrincipalSuccess() { + @MethodSource("data") + @ParameterizedTest + void authorizer_securityContext_customPrincipalSuccess(String reqType) { + initSpringAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/authorizer-principal", "GET") .json() @@ -240,16 +255,20 @@ public void authorizer_securityContext_customPrincipalSuccess() { validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } - @Test - public void errors_unknownRoute_expect404() { + @MethodSource("data") + @ParameterizedTest + void errors_unknownRoute_expect404(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/test33", "GET"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } - @Test - public void error_contentType_invalidContentType() { + @MethodSource("data") + @ParameterizedTest + void error_contentType_invalidContentType(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") .header("Content-Type", "application/octet-stream") .body("asdasdasd"); @@ -258,8 +277,10 @@ public void error_contentType_invalidContentType() { assertEquals(415, output.getStatusCode()); } - @Test - public void error_statusCode_methodNotAllowed() { + @MethodSource("data") + @ParameterizedTest + void error_statusCode_methodNotAllowed(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "POST") .json() .queryString("status", "201"); @@ -268,19 +289,23 @@ public void error_statusCode_methodNotAllowed() { assertEquals(405, output.getStatusCode()); } - @Test - public void error_unauthenticatedCall_filterStepsRequest() { + @MethodSource("data") + @ParameterizedTest + void error_unauthenticatedCall_filterStepsRequest(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "GET") - .header(UnauthenticatedFilter.HEADER_NAME, "1") - .json() - .queryString("status", "201"); + .header(UnauthenticatedFilter.HEADER_NAME, "1") + .json() + .queryString("status", "201"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(401, output.getStatusCode()); } - @Test - public void responseBody_responseWriter_validBody() throws JsonProcessingException { + @MethodSource("data") + @ParameterizedTest + void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { + initSpringAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") @@ -294,13 +319,15 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti validateSingleValueModel(output, CUSTOM_HEADER_VALUE); } - @Test - public void responseBody_responseWriter_validBody_UTF() throws JsonProcessingException { + @MethodSource("data") + @ParameterizedTest + void responseBody_responseWriter_validBody_UTF(String reqType) throws JsonProcessingException { + initSpringAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(UNICODE_VALUE); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/json-body", "POST") - .header("Content-Type", "application/json; charset=UTF-8") - .body(objectMapper.writeValueAsString(singleValueModel)); + .header("Content-Type", "application/json; charset=UTF-8") + .body(objectMapper.writeValueAsString(singleValueModel)); LambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -309,8 +336,10 @@ public void responseBody_responseWriter_validBody_UTF() throws JsonProcessingExc LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); } - @Test - public void statusCode_responseStatusCode_customStatusCode() { + @MethodSource("data") + @ParameterizedTest + void statusCode_responseStatusCode_customStatusCode(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/status-code", "GET") .json() .queryString("status", "201"); @@ -319,8 +348,10 @@ public void statusCode_responseStatusCode_customStatusCode() { assertEquals(201, output.getStatusCode()); } - @Test - public void base64_binaryResponse_base64Encoding() { + @MethodSource("data") + @ParameterizedTest + void base64_binaryResponse_base64Encoding(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/binary", "GET"); AwsProxyResponse response = executeRequest(request, lambdaContext); @@ -328,11 +359,13 @@ public void base64_binaryResponse_base64Encoding() { assertTrue(Base64.isBase64(response.getBody())); } - @Test - public void injectBody_populatedResponse_noException() { + @MethodSource("data") + @ParameterizedTest + void injectBody_populatedResponse_noException(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-body", "POST") - .header(HttpHeaders.CONTENT_TYPE, "text/plain") - .body("This is a populated body"); + .header(HttpHeaders.CONTENT_TYPE, "text/plain") + .body("This is a populated body"); AwsProxyResponse response = executeRequest(request, lambdaContext); assertNotNull(response.getBody()); @@ -349,15 +382,17 @@ public void injectBody_populatedResponse_noException() { AwsProxyResponse emptyResp = executeRequest(emptyReq, lambdaContext); try { SingleValueModel output = objectMapper.readValue(emptyResp.getBody(), SingleValueModel.class); - assertEquals(null, output.getValue()); + assertNull(output.getValue()); } catch (IOException e) { e.printStackTrace(); fail(); } } - @Test - public void servletRequestEncoding_acceptEncoding_okStatusCode() { + @MethodSource("data") + @ParameterizedTest + void servletRequestEncoding_acceptEncoding_okStatusCode(String reqType) { + initSpringAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); AwsProxyRequestBuilder request = null; @@ -375,8 +410,10 @@ public void servletRequestEncoding_acceptEncoding_okStatusCode() { assertEquals(200, output.getStatusCode()); } - @Test - public void request_requestURI() { + @MethodSource("data") + @ParameterizedTest + void request_requestURI(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-URI", "GET"); AwsProxyResponse output = executeRequest(request, lambdaContext); @@ -385,8 +422,10 @@ public void request_requestURI() { validateSingleValueModel(output, "/echo/request-URI"); } - @Test - public void request_requestURL() { + @MethodSource("data") + @ParameterizedTest + void request_requestURL(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/request-url", "GET") .scheme("https") .serverName("api.myserver.com") @@ -398,12 +437,14 @@ public void request_requestURL() { validateSingleValueModel(output, "https://api.myserver.com/echo/request-url"); } - @Test - public void request_encodedPath_returnsDecodedPath() { + @MethodSource("data") + @ParameterizedTest + void request_encodedPath_returnsDecodedPath(String reqType) { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/encoded-request-uri/Some%20Thing", "GET") - .scheme("https") - .serverName("api.myserver.com") - .stage("prod"); + .scheme("https") + .serverName("api.myserver.com") + .stage("prod"); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); @@ -412,13 +453,15 @@ public void request_encodedPath_returnsDecodedPath() { } - @Test - public void contextPath_generateLink_returnsCorrectPath() { + @MethodSource("data") + @ParameterizedTest + void contextPath_generateLink_returnsCorrectPath(String reqType) { + initSpringAwsProxyTest(reqType); assumeFalse("ALB".equals(type)); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/generate-uri", "GET") - .scheme("https") - .serverName("api.myserver.com") - .stage("prod"); + .scheme("https") + .serverName("api.myserver.com") + .stage("prod"); LambdaContainerHandler.getContainerConfig().addCustomDomain("api.myserver.com"); SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); @@ -432,11 +475,13 @@ public void contextPath_generateLink_returnsCorrectPath() { SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } - @Test - public void multipart_getFileName_returnsCorrectFileName() + @MethodSource("data") + @ParameterizedTest + void multipart_getFileName_returnsCorrectFileName(String reqType) throws IOException { + initSpringAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo/attachment", "POST") - .formFilePart("testFile", "myFile.txt", "hello".getBytes()); + .formFilePart("testFile", "myFile.txt", "hello".getBytes()); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(200, output.getStatusCode()); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index 15e9c5b4..cfc39b84 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -11,8 +11,8 @@ import com.amazonaws.serverless.proxy.spring.echoapp.CustomHeaderFilter; import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; import com.amazonaws.serverless.proxy.spring.echoapp.model.ValidatedUserModel; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -22,7 +22,7 @@ import java.util.EnumSet; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; // we don't use the spring annotations to pretend we are running in the actual container public class SpringServletContextTest { @@ -31,7 +31,7 @@ public class SpringServletContextTest { private static SpringLambdaContainerHandler handler; - @BeforeClass + @BeforeAll public static void setUp() { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); @@ -49,7 +49,7 @@ public static void setUp() { } @Test - public void context_autowireValidContext_echoContext() { + void context_autowireValidContext_echoContext() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/servlet-context", "GET") .json() .stage(STAGE) @@ -62,7 +62,7 @@ public void context_autowireValidContext_echoContext() { } @Test - public void context_contextAware_contextEcho() { + void context_contextAware_contextEcho() { AwsProxyRequest request = new AwsProxyRequestBuilder("/context/echo", "GET") .json() .stage(STAGE) @@ -75,7 +75,7 @@ public void context_contextAware_contextEcho() { } @Test - public void filter_customHeaderFilter_echoHeaders() { + void filter_customHeaderFilter_echoHeaders() { AwsProxyRequest request = new AwsProxyRequestBuilder("/echo/headers", "GET") .json() .stage(STAGE) @@ -89,7 +89,7 @@ public void filter_customHeaderFilter_echoHeaders() { } @Test - public void filter_validationFilter_emptyName() { + void filter_validationFilter_emptyName() { ValidatedUserModel userModel = new ValidatedUserModel(); userModel.setFirstName("Test"); AwsProxyRequest request = new AwsProxyRequestBuilder("/context/user", "POST") @@ -102,11 +102,11 @@ public void filter_validationFilter_emptyName() { } @Test - public void exception_populatedException_annotationValuesMappedCorrectly() { + void exception_populatedException_annotationValuesMappedCorrectly() { AwsProxyRequest request = new AwsProxyRequestBuilder("/context/exception", "GET") - .stage(STAGE) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) - .build(); + .stage(STAGE) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); @@ -115,11 +115,11 @@ public void exception_populatedException_annotationValuesMappedCorrectly() { } @Test - public void cookie_injectInResponse_expectCustomSetCookie() { + void cookie_injectInResponse_expectCustomSetCookie() { AwsProxyRequest request = new AwsProxyRequestBuilder("/context/cookie", "GET") - .stage(STAGE) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) - .build(); + .stage(STAGE) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE) + .build(); AwsProxyResponse output = handler.proxy(request, lambdaContext); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index 38d3e3d2..d2b74b26 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -8,12 +8,13 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.spring.staticapp.LambdaHandler; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; import javax.ws.rs.core.MediaType; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; public class StaticAppProxyTest { @@ -21,7 +22,7 @@ public class StaticAppProxyTest { private LambdaHandler lambdaHandler = new LambdaHandler(); @Test - public void staticPage() { + void staticPage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/sample/page", "GET").build(); // we temporarily allow the container to read from any path LambdaContainerHandler.getContainerConfig().addValidFilePath("/"); diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java index 9cac0aa1..dd3d3fd7 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java @@ -2,26 +2,26 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.ws.rs.HttpMethod; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; public class CustomServletTest { @Test - public void customServlet() throws IOException { + void customServlet() throws IOException { StreamLambdaHandler lambdaHandler = new StreamLambdaHandler(); InputStream requestStream = new AwsProxyRequestBuilder("/test", HttpMethod.GET) .buildStream(); ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); lambdaHandler.handleRequest(requestStream, responseStream, new MockLambdaContext()); - assertTrue("response should contain value set in CustomServlet", - responseStream.toString().contains("Unittest")); + assertTrue(responseStream.toString().contains("Unittest"), + "response should contain value set in CustomServlet"); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index 727a4cdc..7742db7f 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -9,19 +9,19 @@ import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.web.WebAppConfiguration; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = EchoSpringAppConfig.class) @WebAppConfiguration @TestExecutionListeners(inheritListeners = false, listeners = {DependencyInjectionTestExecutionListener.class}) @@ -32,13 +32,13 @@ public class SpringProfileTest { @Autowired private MockLambdaContext lambdaContext; - @Before + @BeforeEach public void clearServletContextCache() { AwsServletContext.clearServletContextCache(); } @Test - public void profile_defaultProfile() throws Exception { + void profile_defaultProfile() throws Exception { AwsProxyRequest request = new AwsProxyRequestBuilder("/profile/spring-properties", "GET") .build(); @@ -54,7 +54,7 @@ public void profile_defaultProfile() throws Exception { } @Test - public void profile_overrideProfile() throws Exception { + void profile_overrideProfile() throws Exception { AwsProxyRequest request = new AwsProxyRequestBuilder("/profile/spring-properties", "GET") .build(); SpringLambdaContainerHandler handler = SpringLambdaContainerHandler.getAwsProxyHandler(EchoSpringAppConfig.class); diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 8768c373..31e90b99 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -159,6 +159,11 @@ 6.2.1.Final test + + org.junit.jupiter + junit-jupiter + test + javax.activation @@ -219,7 +224,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.9 + 2.22.2 always diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java index e9682d4c..e322e1a6 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java @@ -6,13 +6,13 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.securityapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; -import org.junit.Test; +import org.junit.jupiter.api.Test; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class SecurityAppTest { @@ -24,7 +24,7 @@ public SecurityAppTest() { } @Test - public void helloRequest_withAuth_respondsWithSingleMessage() { + void helloRequest_withAuth_respondsWithSingleMessage() { AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertEquals(401, resp.getStatusCode()); diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index 7c80dc86..f5e2e818 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -8,10 +8,8 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.spring.servletapp.*; import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -23,9 +21,8 @@ import java.util.Collection; import java.util.stream.Collectors; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; -@RunWith(Parameterized.class) public class ServletAppTest { LambdaHandler handler; @@ -33,25 +30,28 @@ public class ServletAppTest { private String type; - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } - public ServletAppTest(String reqType) { + public void initServletAppTest(String reqType) { type = reqType; handler = new LambdaHandler(type); } - @Test - public void helloRequest_respondsWithSingleMessage() { + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } - @Test - public void validateRequest_invalidData_respondsWith400() { + @MethodSource("data") + @ParameterizedTest + void validateRequest_invalidData_respondsWith400(String reqType) { + initServletAppTest(reqType); UserData ud = new UserData(); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/validate", "POST") .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) @@ -79,8 +79,10 @@ public void validateRequest_invalidData_respondsWith400() { assertEquals(400, resp.getStatusCode()); } - @Test - public void messageObject_parsesObject_returnsCorrectMessage() { + @MethodSource("data") + @ParameterizedTest + void messageObject_parsesObject_returnsCorrectMessage(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") .json() .body(new MessageData("test message")); @@ -90,8 +92,10 @@ public void messageObject_parsesObject_returnsCorrectMessage() { assertEquals("test message", resp.getBody()); } - @Test - public void messageObject_propertiesInContentType_returnsCorrectMessage() { + @MethodSource("data") + @ParameterizedTest + void messageObject_propertiesInContentType_returnsCorrectMessage(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") .header(HttpHeaders.ACCEPT, "application/json;v=1") @@ -102,8 +106,10 @@ public void messageObject_propertiesInContentType_returnsCorrectMessage() { assertEquals("test message", resp.getBody()); } - @Test - public void echoMessage_fileNameLikeParameter_returnsMessage() { + @MethodSource("data") + @ParameterizedTest + void echoMessage_fileNameLikeParameter_returnsMessage(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/echo/test.test.test", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertNotNull(resp); @@ -111,8 +117,10 @@ public void echoMessage_fileNameLikeParameter_returnsMessage() { assertEquals("test.test.test", resp.getBody()); } - @Test - public void getUtf8String_returnsValidUtf8String() { + @MethodSource("data") + @ParameterizedTest + void getUtf8String_returnsValidUtf8String(String reqType) { + initServletAppTest(reqType); // We expect strings to come back as UTF-8 correctly because Spring itself will call the setCharacterEncoding // method on the response to set it to UTF- LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); @@ -125,18 +133,22 @@ public void getUtf8String_returnsValidUtf8String() { assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); } - @Test - public void getUtf8Json_returnsValidUtf8String() { + @MethodSource("data") + @ParameterizedTest + void getUtf8Json_returnsValidUtf8String(String reqType) { + initServletAppTest(reqType); LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); - assertEquals("{\"s\":\""+MessageController.UTF8_RESPONSE+"\"}", resp.getBody()); + assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); } - @Test - public void stream_getUtf8String_returnsValidUtf8String() throws IOException { + @MethodSource("data") + @ParameterizedTest + void stream_getUtf8String_returnsValidUtf8String(String reqType) throws IOException { + initServletAppTest(reqType); LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/utf8", "GET") @@ -160,8 +172,10 @@ public void stream_getUtf8String_returnsValidUtf8String() throws IOException { assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); } - @Test - public void stream_getUtf8Json_returnsValidUtf8String() throws IOException { + @MethodSource("data") + @ParameterizedTest + void stream_getUtf8Json_returnsValidUtf8String(String reqType) throws IOException { + initServletAppTest(reqType); LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); @@ -181,19 +195,23 @@ public void stream_getUtf8Json_returnsValidUtf8String() throws IOException { AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); assertNotNull(resp); assertEquals(200, resp.getStatusCode()); - assertEquals("{\"s\":\""+MessageController.UTF8_RESPONSE+"\"}", resp.getBody()); + assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); } - @Test - public void springExceptionMapping_throw404Ex_expectMappedTo404() { + @MethodSource("data") + @ParameterizedTest + void springExceptionMapping_throw404Ex_expectMappedTo404(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/ex/customstatus", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertNotNull(resp); assertEquals(404, resp.getStatusCode()); } - @Test - public void echoMessage_populatesSingleValueHeadersForHttpApiV2() { + @MethodSource("data") + @ParameterizedTest + void echoMessage_populatesSingleValueHeadersForHttpApiV2(String reqType) { + initServletAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") .header(HttpHeaders.ACCEPT, "application/json;v=1") diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java index 8dabc5f6..f5e83e85 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -7,18 +7,17 @@ import com.amazonaws.serverless.proxy.spring.slowapp.LambdaHandler; import com.amazonaws.serverless.proxy.spring.slowapp.MessageController; import com.amazonaws.serverless.proxy.spring.slowapp.SlowTestApplication; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.Instant; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class SlowAppTest { @Test - public void slowAppInit_continuesInBackgroundThread_returnsCorrect() { + void slowAppInit_continuesInBackgroundThread_returnsCorrect() { LambdaHandler slowApp = new LambdaHandler(); System.out.println("Start time: " + slowApp.getConstructorTime()); assertTrue(slowApp.getConstructorTime() < 10_000); @@ -28,6 +27,6 @@ public void slowAppInit_continuesInBackgroundThread_returnsCorrect() { long endRequestTime = Instant.now().toEpochMilli(); assertTrue(endRequestTime - startRequestTime > SlowTestApplication.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); assertEquals(200, resp.getStatusCode()); - Assert.assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); } } diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java index 811a1ab5..0a477ef0 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java @@ -9,18 +9,15 @@ import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageController; import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageData; import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Arrays; import java.util.Collection; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; -@RunWith(Parameterized.class) public class WebFluxAppTest { LambdaHandler handler; @@ -28,34 +25,39 @@ public class WebFluxAppTest { private String type; - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } - public WebFluxAppTest(String reqType) { + public void initWebFluxAppTest(String reqType) { type = reqType; handler = new LambdaHandler(type); } - @Test - public void helloRequest_respondsWithSingleMessage() { + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initWebFluxAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/single", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); System.out.println(resp.getBody()); - Assert.assertEquals(MessageController.MESSAGE, resp.getBody()); + assertEquals(MessageController.MESSAGE, resp.getBody()); } - @Test - public void helloDoubleRequest_respondsWithDoubleMessage() { + @MethodSource("data") + @ParameterizedTest + void helloDoubleRequest_respondsWithDoubleMessage(String reqType) { + initWebFluxAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/double", "GET"); AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); assertEquals(MessageController.MESSAGE + MessageController.MESSAGE, resp.getBody()); } - @Test - public void messageObject_parsesObject_returnsCorrectMessage() throws JsonProcessingException { + @MethodSource("data") + @ParameterizedTest + void messageObject_parsesObject_returnsCorrectMessage(String reqType) throws JsonProcessingException { + initWebFluxAppTest(reqType); AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") .json() .body(new MessageData("test message")); diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index 11779420..2fddcf0a 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -9,14 +9,14 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.boot.WebApplicationType; import org.springframework.boot.web.servlet.ServletContextInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.fail; public class ServerlessServletEmbeddedServerFactoryTest { private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( @@ -35,7 +35,7 @@ public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializati } @Test - public void getWebServer_callsInitializers() { + void getWebServer_callsInitializers() { ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); factory.getWebServer(new ServletContextInitializer() { @Override diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 9ba43370..7cac0a1a 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -49,6 +49,12 @@ struts2-junit-plugin ${struts.version} test + + + junit + junit + + @@ -151,9 +157,9 @@ org.apache.maven.plugins maven-surefire-plugin - 2.9 + 2.22.2 - always + false diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java index eb890cf5..d288e67e 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java @@ -25,9 +25,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.apache.struts2.StrutsRestTestCase; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import javax.ws.rs.core.Response; import java.io.IOException; @@ -39,16 +38,15 @@ import java.util.Map; import java.util.UUID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assumptions.assumeTrue; /** * Unit test class for the Struts2 AWS_PROXY default implementation */ -@RunWith(Parameterized.class) public class StrutsAwsProxyTest extends StrutsRestTestCase { private static final String CUSTOM_HEADER_KEY = "x-custom-header"; private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; @@ -67,15 +65,14 @@ public class StrutsAwsProxyTest extends StrutsRestTestCase { private final StrutsLambdaContainerHandler httpApiHandler = StrutsLambdaContainerHandler .getHttpApiV2ProxyHandler(); private final Context lambdaContext = new MockLambdaContext(); - private final String type; + private String type; - public StrutsAwsProxyTest(String reqType) { + public void initStrutsAwsProxyTest(String reqType) { type = reqType; } - @Parameterized.Parameters public static Collection data() { - return Arrays.asList(new Object[] { "API_GW", "ALB", "HTTP_API" }); + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); } private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { @@ -90,9 +87,11 @@ private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, C throw new RuntimeException("Unknown request type: " + type); } } - - @Test - public void headers_getHeaders_echo() { + + @MethodSource("data") + @ParameterizedTest + void headers_getHeaders_echo(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "headers") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) @@ -105,8 +104,10 @@ public void headers_getHeaders_echo() { validateMapResponseModel(output); } - @Test - public void context_servletResponse_setCustomHeader() { + @MethodSource("data") + @ParameterizedTest + void context_servletResponse_setCustomHeader(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) .queryString("customHeader", "true") .json(); @@ -116,8 +117,10 @@ public void context_servletResponse_setCustomHeader() { assertTrue(output.getMultiValueHeaders().containsKey("XX")); } - @Test - public void context_serverInfo_correctContext() { + @MethodSource("data") + @ParameterizedTest + void context_serverInfo_correctContext(String reqType) { + initStrutsAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) .queryString(QUERY_STRING_KEY, "Hello Struts2") @@ -130,8 +133,10 @@ public void context_serverInfo_correctContext() { validateSingleValueModel(output, "Hello Struts2"); } - @Test - public void queryString_uriInfo_echo() { + @MethodSource("data") + @ParameterizedTest + void queryString_uriInfo_echo(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "query-string") .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) @@ -145,8 +150,10 @@ public void queryString_uriInfo_echo() { validateMapResponseModel(output); } - @Test - public void requestScheme_valid_expectHttps() { + @MethodSource("data") + @ParameterizedTest + void requestScheme_valid_expectHttps(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "scheme") .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) @@ -159,8 +166,10 @@ public void requestScheme_valid_expectHttps() { validateSingleValueModel(output, "https"); } - @Test - public void authorizer_securityContext_customPrincipalSuccess() { + @MethodSource("data") + @ParameterizedTest + void authorizer_securityContext_customPrincipalSuccess(String reqType) { + initStrutsAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "principal") @@ -174,16 +183,20 @@ public void authorizer_securityContext_customPrincipalSuccess() { validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); } - @Test - public void errors_unknownRoute_expect404() { + @MethodSource("data") + @ParameterizedTest + void errors_unknownRoute_expect404(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", HTTP_METHOD_GET); AwsProxyResponse output = executeRequest(request, lambdaContext); assertEquals(404, output.getStatusCode()); } - @Test - public void error_contentType_invalidContentType() { + @MethodSource("data") + @ParameterizedTest + void error_contentType_invalidContentType(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") .queryString(QUERY_STRING_MODE, "content-type") .header("Content-Type", "application/octet-stream") @@ -193,8 +206,10 @@ public void error_contentType_invalidContentType() { assertEquals(415, output.getStatusCode()); } - @Test - public void error_statusCode_methodNotAllowed() { + @MethodSource("data") + @ParameterizedTest + void error_statusCode_methodNotAllowed(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") .queryString(QUERY_STRING_MODE, "not-allowed") .json(); @@ -204,8 +219,10 @@ public void error_statusCode_methodNotAllowed() { } - @Test - public void responseBody_responseWriter_validBody() throws JsonProcessingException { + @MethodSource("data") + @ParameterizedTest + void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { + initStrutsAwsProxyTest(reqType); Map value = new HashMap<>(); value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "POST") @@ -219,8 +236,10 @@ public void responseBody_responseWriter_validBody() throws JsonProcessingExcepti validateSingleValueModel(output, "{\"message\":\"my-custom-value\"}"); } - @Test - public void statusCode_responseStatusCode_customStatusCode() { + @MethodSource("data") + @ParameterizedTest + void statusCode_responseStatusCode_customStatusCode(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "custom-status-code") .queryString("status", "201") @@ -230,8 +249,10 @@ public void statusCode_responseStatusCode_customStatusCode() { assertEquals(201, output.getStatusCode()); } - @Test - public void base64_binaryResponse_base64Encoding() { + @MethodSource("data") + @ParameterizedTest + void base64_binaryResponse_base64Encoding(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET); AwsProxyResponse response = executeRequest(request, lambdaContext); @@ -239,8 +260,10 @@ public void base64_binaryResponse_base64Encoding() { assertTrue(Base64.isBase64(response.getBody())); } - @Test - public void exception_mapException_mapToNotImplemented() { + @MethodSource("data") + @ParameterizedTest + void exception_mapException_mapToNotImplemented(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") .queryString(QUERY_STRING_MODE, "not-implemented"); @@ -250,8 +273,10 @@ public void exception_mapException_mapToNotImplemented() { assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); } - @Test - public void stripBasePath_route_shouldRouteCorrectly() { + @MethodSource("data") + @ParameterizedTest + void stripBasePath_route_shouldRouteCorrectly(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", HTTP_METHOD_GET) .json() .queryString(QUERY_STRING_KEY, "stripped"); @@ -262,8 +287,10 @@ public void stripBasePath_route_shouldRouteCorrectly() { handler.stripBasePath(""); } - @Test - public void stripBasePath_route_shouldReturn404() { + @MethodSource("data") + @ParameterizedTest + void stripBasePath_route_shouldReturn404(String reqType) { + initStrutsAwsProxyTest(reqType); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", HTTP_METHOD_GET) .json() .queryString("status", "201"); @@ -273,8 +300,10 @@ public void stripBasePath_route_shouldReturn404() { handler.stripBasePath(""); } - @Test - public void securityContext_injectPrincipal_expectPrincipalName() { + @MethodSource("data") + @ParameterizedTest + void securityContext_injectPrincipal_expectPrincipalName(String reqType) { + initStrutsAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) .queryString(QUERY_STRING_MODE, "principal") @@ -285,8 +314,10 @@ public void securityContext_injectPrincipal_expectPrincipalName() { validateSingleValueModel(resp, USER_PRINCIPAL); } - @Test - public void queryParam_encoding_expectUnencodedParam() { + @MethodSource("data") + @ParameterizedTest + void queryParam_encoding_expectUnencodedParam(String reqType) { + initStrutsAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); String paramValue = "p%2Fz%2B3"; String decodedParam = ""; @@ -303,8 +334,10 @@ public void queryParam_encoding_expectUnencodedParam() { validateSingleValueModel(resp, decodedParam); } - @Test - public void queryParam_encoding_expectEncodedParam() { + @MethodSource("data") + @ParameterizedTest + void queryParam_encoding_expectEncodedParam(String reqType) { + initStrutsAwsProxyTest(reqType); assumeTrue("API_GW".equals(type)); String paramValue = "p%2Fz%2B3"; AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, paramValue); diff --git a/pom.xml b/pom.xml index d5ff104b..3e997e5e 100644 --- a/pom.xml +++ b/pom.xml @@ -84,15 +84,27 @@ 7.3.0 2.14.0 2.0.3 + 5.9.1 + 4.4.0 + 1.3 UTF-8 - junit - junit - 4.13.2 + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params test @@ -114,8 +126,15 @@ org.mockito - mockito-all - 1.10.19 + mockito-core + ${mockito.version} + test + + + + org.hamcrest + hamcrest-all + ${hamcrest.version} test @@ -128,6 +147,18 @@ + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + From d84a418b9fe9bcf58b21e843ca91863680b09ab9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 8 Dec 2022 13:00:41 +0100 Subject: [PATCH 0548/1214] chore(deps): Explicitly add more recent commons-io version (#488) --- aws-serverless-java-container-core/pom.xml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0e777b78..fb4d818c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -63,6 +63,11 @@ commons-fileupload 1.4 + + commons-io + commons-io + 2.11.0 + @@ -110,16 +115,6 @@ - - - - commons-io - commons-io - 2.11.0 - - - - From 4e85edcf079aa923558539d25c23ad5503b39f8c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 8 Dec 2022 14:35:49 +0100 Subject: [PATCH 0549/1214] chore(deps): Update Struts dependency to 6.1.1 --- aws-serverless-java-container-struts/pom.xml | 13 +++++++++---- .../proxy/struts/StrutsAwsProxyTest.java | 2 +- .../resources/archetype-resources/build.gradle | 10 +++++----- .../main/resources/archetype-resources/pom.xml | 15 ++++----------- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 6 files changed, 24 insertions(+), 26 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 7cac0a1a..c42747a7 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 6.0.3 + 6.1.1 @@ -74,7 +74,7 @@ javax.el javax.el-api - 2.2.5 + 3.0.0 test @@ -86,9 +86,9 @@ - org.glassfish.web + org.glassfish javax.el - 2.2.6 + 3.0.0 test @@ -105,6 +105,11 @@ commons-text 1.10.0 + + commons-net + commons-net + 3.9.0 + diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java index d288e67e..f4854724 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; -import org.apache.struts2.StrutsRestTestCase; +import org.apache.struts2.junit.StrutsRestTestCase; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index d37db592..acfa4baa 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:6.0.3') { + implementation ('org.apache.struts:struts2-convention-plugin:6.1.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:6.0.3') { + implementation ('org.apache.struts:struts2-rest-plugin:6.1.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:6.0.3') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:6.0.3') { + implementation ('org.apache.struts:struts2-core:6.1.1') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -42,7 +42,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:6.0.3') { + testImplementation('org.apache.struts:struts2-junit-plugin:6.1.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index ef32c9b2..7c2710ca 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,19 +15,12 @@ 1.8 1.8 - 6.0.3 + 6.1.1 2.14.0 4.13.2 2.19.0 - - - struts-staging - https://repository.apache.org/content/repositories/staging/ - - - com.amazonaws.serverless @@ -122,13 +115,13 @@ javax.el javax.el-api - 2.2.5 + 3.0.0 test - org.glassfish.web + org.glassfish javax.el - 2.2.6 + 3.0.0 test diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index f7d6af5e..1de0a80e 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', - 'org.apache.struts:struts2-convention-plugin:6.0.3', - 'org.apache.struts:struts2-rest-plugin:6.0.3', - 'org.apache.struts:struts2-bean-validation-plugin:6.0.3', - 'org.apache.struts:struts2-junit-plugin:6.0.3', + 'org.apache.struts:struts2-convention-plugin:6.1.1', + 'org.apache.struts:struts2-rest-plugin:6.1.1', + 'org.apache.struts:struts2-bean-validation-plugin:6.1.1', + 'org.apache.struts:struts2-junit-plugin:6.1.1', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 3f6b1d7b..025229a4 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 6.0.3 + 6.1.1 2.14.0 4.13.2 2.19.0 From 02d3633125e6d6160cfab04304e359ff8e44aa49 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Dec 2022 15:25:06 +0100 Subject: [PATCH 0550/1214] chore(deps): Update lambda-java-core dependency to 1.2.2 --- aws-serverless-java-container-core/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 3 +-- .../src/main/resources/archetype-resources/pom.xml | 6 ------ samples/jersey/pet-store/build.gradle | 3 +-- samples/jersey/pet-store/pom.xml | 8 +------- samples/spring/pet-store/pom.xml | 8 +------- samples/struts/pet-store/pom.xml | 6 ------ 7 files changed, 5 insertions(+), 31 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fb4d818c..793c8233 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -25,7 +25,7 @@ com.amazonaws aws-lambda-java-core - 1.2.1 + 1.2.2 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 381bc42e..4ca57d42 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws:aws-lambda-java-core:1.2.1', - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 7c2710ca..691d65bc 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -28,12 +28,6 @@ ${project.version} - - com.amazonaws - aws-lambda-java-core - 1.2.1 - - org.apache.struts struts2-convention-plugin diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 10af02e0..7ed83d09 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -7,8 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws:aws-lambda-java-core:1.2.1', - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', 'com.fasterxml.jackson.core:jackson-databind:2.14.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index e24ad822..fa317309 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -34,13 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - [1.6,) - - - - com.amazonaws - aws-lambda-java-core - 1.2.1 + [1.9,) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 2d1a472f..bffa8fcf 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -35,13 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - [1.6,) - - - - com.amazonaws - aws-lambda-java-core - 1.2.1 + [1.9,) diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 025229a4..d2f597b2 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -39,12 +39,6 @@ [1.9,) - - com.amazonaws - aws-lambda-java-core - 1.2.1 - - org.apache.struts struts2-convention-plugin From 9430b36a67752b2071f17a5951ad7b7d70dc1cae Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Dec 2022 16:35:42 +0100 Subject: [PATCH 0551/1214] chore(deps): update Jackson version to 2.14.1 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 4ca57d42..c1756d92 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 2ae636fa..dbb4cf12 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.37 - 2.14.0 + 2.14.1 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 95cf50f9..780810c9 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 0381379f..9e1910aa 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.14.0 + 2.14.1 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3e53cd64..8921a0ab 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index acfa4baa..34373b60 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.0') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.0') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.1') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.1') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 691d65bc..d84ad190 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.1.1 - 2.14.0 + 2.14.1 4.13.2 2.19.0 diff --git a/pom.xml b/pom.xml index 3e997e5e..88f22abb 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 7.3.0 - 2.14.0 + 2.14.1 2.0.3 5.9.1 4.4.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 7ed83d09..ea8ee51d 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index fa317309..ce0baf4c 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.37 - 2.14.0 + 2.14.1 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 053d46ec..5087400c 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index e25f0f9e..04915a2b 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.14.0 + 2.14.1 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 838afd6a..7dc80b04 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 1de0a80e..6aeff27d 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.0', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.0', + 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.1', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index d2f597b2..a1bf6259 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.1.1 - 2.14.0 + 2.14.1 4.13.2 2.19.0 From fda6e1d2401b3879e214c0d3c19b5f82414ff9d7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Dec 2022 16:37:25 +0100 Subject: [PATCH 0552/1214] chore(deps): update SLF4J to 2.0.6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 88f22abb..5ccd7c99 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 7.3.0 2.14.1 - 2.0.3 + 2.0.6 5.9.1 4.4.0 1.3 From da1f403c5155d89a7e60c5d24dfcaf57a98b0e32 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Dec 2022 16:53:28 +0100 Subject: [PATCH 0553/1214] chore(deps): Update Spring dependencies (framework to 5.3.24, security to 5.7.5, boot to 2.7.6) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 793c8233..7e531095 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -110,7 +110,7 @@ org.springframework.security spring-security-web - 5.7.4 + 5.7.5 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index be0c1d9f..4f6c6003 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.23 - 5.7.4 + 5.3.24 + 5.7.5 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 31e90b99..98662d22 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.10-SNAPSHOT - 5.3.23 - 2.7.5 - 5.7.4 + 5.3.24 + 2.7.6 + 5.7.5 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 8921a0ab..24743ce1 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.23', - 'org.springframework:spring-context:5.3.23', + 'org.springframework:spring-webmvc:5.3.24', + 'org.springframework:spring-context:5.3.24', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 5491fbb6..69db642a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.23 + 5.3.24 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 73c0bdb6..bbf0b870 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.5', + 'org.springframework.boot:spring-boot-starter-web:2.7.6', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 9a0b4123..17a1419b 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.5 + 2.7.6 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 7dc80b04..7d51cc70 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.23', - 'org.springframework:spring-context:5.3.23', + 'org.springframework:spring-webmvc:5.3.24', + 'org.springframework:spring-context:5.3.24', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index bffa8fcf..4b54b0da 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.23 + 5.3.24 4.13.2 2.19.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 22989c9e..c0dddba8 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.5') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.6') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 8f7150db..bf9cf13f 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.5 + 2.7.6 From f170312f9834a2692eb38475b07323e26497d086 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 14 Dec 2022 08:53:18 +0100 Subject: [PATCH 0554/1214] chore(deps): Update Mockito dependency to 4.9.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5ccd7c99..319ab6f9 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 2.14.1 2.0.6 5.9.1 - 4.4.0 + 4.9.0 1.3 UTF-8 From 2c038683af19698af01962be7974179ee0b27728 Mon Sep 17 00:00:00 2001 From: anmolk6 <65782524+anmolk6@users.noreply.github.com> Date: Wed, 14 Dec 2022 14:14:13 +0530 Subject: [PATCH 0555/1214] Fixing NullpointerException in case of non defined statusCode (#497) pdating AwsProxyHttpServletResponseWriter.java Fix provided for #497 This is to resolve NullPointerException when HttpStatusCode is not present in default enum Response.StatusType --- .../servlet/AwsProxyHttpServletResponseWriter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index 524a36f9..b6061e1e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -17,13 +17,13 @@ import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import java.util.Base64; import java.util.HashMap; @@ -74,8 +74,11 @@ public AwsProxyResponse writeResponse(AwsHttpServletResponse containerResponse, awsProxyResponse.setStatusCode(containerResponse.getStatus()); - if (containerResponse.getAwsProxyRequest() != null && containerResponse.getAwsProxyRequest().getRequestSource() == RequestSource.ALB) { - awsProxyResponse.setStatusDescription(containerResponse.getStatus() + " " + Response.Status.fromStatusCode(containerResponse.getStatus()).getReasonPhrase()); + Status responseStatus = Response.Status.fromStatusCode(containerResponse.getStatus()); + + if (containerResponse.getAwsProxyRequest() != null && containerResponse.getAwsProxyRequest().getRequestSource() == RequestSource.ALB + && responseStatus != null) { + awsProxyResponse.setStatusDescription(containerResponse.getStatus() + " " + responseStatus.getReasonPhrase()); } Timer.stop("SERVLET_RESPONSE_WRITE"); From 90671a8a9bbf282679f8033158a5f32b498fb8b9 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 14 Dec 2022 09:03:13 +0000 Subject: [PATCH 0556/1214] chore: release -prepare release aws-serverless-java-container-1.9.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7e531095..cc5efc06 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 2d491078..0419dc2e 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.1 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f5ea6b86..f6071ca5 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.1 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4f6c6003..49706b99 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.1 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 98662d22..8f7c4cbe 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.10-SNAPSHOT + 1.9.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 5.3.24 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.1 diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index c42747a7..ea9ea1ab 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.1 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c13c0586..264ee5ba 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.10-SNAPSHOT + 1.9.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ca3ad395..843a05bc 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.10-SNAPSHOT + 1.9.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 83dc7974..24f66561 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.10-SNAPSHOT + 1.9.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 1e7279db..5b14469e 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.10-SNAPSHOT + 1.9.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index b91cfa4b..eee02b4d 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.1 com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.10-SNAPSHOT + 1.9.1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 diff --git a/pom.xml b/pom.xml index 319ab6f9..3be7fe02 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.10-SNAPSHOT + 1.9.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.1 From 13a93a36a6283775e74ce7b56f1ab91cd0ddccb6 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 14 Dec 2022 09:03:16 +0000 Subject: [PATCH 0557/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index cc5efc06..7e531095 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 0419dc2e..2d491078 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.1 + 1.10-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f6071ca5..f5ea6b86 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.1 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 49706b99..4f6c6003 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.1 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 8f7c4cbe..98662d22 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9.1 + 1.10-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT 5.3.24 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.1 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index ea9ea1ab..c42747a7 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.1 + 1.10-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 264ee5ba..c13c0586 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9.1 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 843a05bc..ca3ad395 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9.1 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 24f66561..83dc7974 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9.1 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 5b14469e..1e7279db 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9.1 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index eee02b4d..b91cfa4b 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.1 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.9.1 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD diff --git a/pom.xml b/pom.xml index 3be7fe02..319ab6f9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9.1 + 1.10-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.1 + HEAD From be15cfd056efc5de1ce2b8cc100db35879fad993 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 14 Dec 2022 10:39:29 +0100 Subject: [PATCH 0558/1214] chore(deps): Update OWASP dependency check to 7.4.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 319ab6f9..48f6ea9d 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 0.7 - 7.3.0 + 7.4.1 2.14.1 2.0.6 5.9.1 From 03db37c35242464ece681f4a49fba5af74d4a5b4 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 3 Feb 2023 14:40:46 +0200 Subject: [PATCH 0559/1214] 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 --- .../internal/servlet/AwsHttpServletResponse.java | 6 +++++- .../servlet/AwsHttpServletResponseTest.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 63a2dca8..fc03922c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -213,7 +213,11 @@ public void addDateHeader(String s, long l) { @Override public void setHeader(String s, String s1) { if (!canSetHeader()) return; - setHeader(s, s1, true); + if ("Content-Type".equalsIgnoreCase(s)) { + setContentType(s1); + } else { + setHeader(s, s1, true); + } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 8a1d8f1e..39fe7144 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; @@ -38,6 +39,7 @@ public class AwsHttpServletResponseTest { private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=(.*)$"); private static final String CONTENT_TYPE_WITH_CHARSET = "application/json; charset=UTF-8"; + private static final String JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET = "application/javascript; charset=UTF-8"; @Test void cookie_addCookie_verifyPath() { @@ -325,6 +327,18 @@ void characterEncoding_setCharacterEncodingInContentType_overridesDefault() { assertEquals("UTF-8", resp.getCharacterEncoding()); } + @Test + void characterEncoding_encodingInContentTypeHeader_writesCorrectData() throws IOException { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, new CountDownLatch(1)); + resp.setHeader("Content-Type", JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET); + resp.getOutputStream().write("ü".getBytes(StandardCharsets.UTF_8)); + resp.flushBuffer(); + + assertEquals(JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET, resp.getContentType()); + assertEquals(JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET, resp.getHeader("Content-Type")); + assertEquals("ü",resp.getAwsResponseBodyString()); + } + private int getMaxAge(String header) { Matcher ageMatcher = MAX_AGE_PATTERN.matcher(header); assertTrue(ageMatcher.find()); From f1755de81b0de38c42722fcd16df94e0ea3b9988 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 3 Feb 2023 15:08:30 +0200 Subject: [PATCH 0560/1214] fix: Dispatch to the given servlet when using getNamedDispatcher --- .../servlet/AwsProxyRequestDispatcher.java | 7 ++- .../internal/servlet/AwsServletContext.java | 2 +- .../internal/servlet/FilterChainManager.java | 26 +++++++-- .../proxy/internal/testutils/MockServlet.java | 23 ++++++++ .../servlet/AwsFilterChainManagerTest.java | 53 ++++++++++++++++++- .../servlet/AwsServletContextTest.java | 18 +++---- 6 files changed, 111 insertions(+), 18 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 27a352eb..fc52d1db 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -80,7 +80,7 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon } if (isNamedDispatcher) { - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet(dispatchTo)); return; } @@ -148,4 +148,9 @@ void setRequestPath(ServletRequest req, final String destinationPath) { private Servlet getServlet(HttpServletRequest req) { return ((AwsServletContext)lambdaContainerHandler.getServletContext()).getServletForPath(req.getPathInfo()); } + + private Servlet getServlet(String servletName) throws ServletException { + return ((AwsServletContext)lambdaContainerHandler.getServletContext()).getServlet(servletName); + } + } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 864a9bf1..44ec701e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -171,7 +171,7 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public RequestDispatcher getNamedDispatcher(String s) { - throw new UnsupportedOperationException(); + return new AwsProxyRequestDispatcher(s, true, containerHandler); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 92ff55da..1bf6f4b2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -132,7 +132,7 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext)); } - putFilterChainCache(type, targetPath, chainHolder); + putFilterChainCache(type, targetPath, servlet, chainHolder); // update total filter size if (filtersSize != registrations.size()) { filtersSize = registrations.size(); @@ -151,13 +151,16 @@ FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servl * initialized with the cached list of {@link FilterHolder} objects * @param type The dispatcher type for the incoming request * @param targetPath The request path - this is extracted with the getPath method of the request object - * @param servlet Servlet to put at the end of the chain (optional). + * @param servlet The final servlet in the filter chain (if any) * @return A populated FilterChainHolder */ private FilterChainHolder getFilterChainCache(final DispatcherType type, final String targetPath, Servlet servlet) { TargetCacheKey key = new TargetCacheKey(); key.setDispatcherType(type); key.setTargetPath(targetPath); + if (servlet != null) { + key.setServletName(servlet.getServletConfig().getServletName()); + } if (!filterCache.containsKey(key)) { return null; @@ -174,12 +177,16 @@ private FilterChainHolder getFilterChainCache(final DispatcherType type, final S * method to retry this. * @param type DispatcherType from the incoming request * @param targetPath The target path in the API - * @param holder The FilterChainHolder object to save in the cache + * @param servlet The final servlet in the filter chain (if any) + * @param holder The FilterChainHolder object to save in the cache */ - private void putFilterChainCache(final DispatcherType type, final String targetPath, final FilterChainHolder holder) { + private void putFilterChainCache(final DispatcherType type, final String targetPath, Servlet servlet, final FilterChainHolder holder) { TargetCacheKey key = new TargetCacheKey(); key.setDispatcherType(type); key.setTargetPath(targetPath); + if (servlet != null) { + key.setServletName(servlet.getServletConfig().getServletName()); + } // we couldn't compute the hash code because either the target path or dispatcher type were null if (key.hashCode() == -1) { @@ -256,6 +263,7 @@ protected static class TargetCacheKey { private String targetPath; private DispatcherType dispatcherType; + private String servletName; //------------------------------------------------------------- @@ -295,10 +303,15 @@ public int hashCode() { } hashString += ":" + hashDispatcher; + if (servletName != null) { + hashString += ":" + servletName; + } + return hashString.hashCode(); } + @Override public boolean equals(Object key) { if (key == null) { @@ -324,6 +337,11 @@ void setTargetPath(String targetPath) { void setDispatcherType(DispatcherType dispatcherType) { this.dispatcherType = dispatcherType; } + public void setServletName(String servletName) { + this.servletName = servletName; + } + + } @SuppressFBWarnings("URF_UNREAD_FIELD") diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java new file mode 100644 index 00000000..b93625bf --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java @@ -0,0 +1,23 @@ +package com.amazonaws.serverless.proxy.internal.testutils; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class MockServlet extends HttpServlet { + + private int serviceCalls = 0; + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + super.service(req, resp); + serviceCalls++; + } + + public int getServiceCalls() { + return serviceCalls; + } +} diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 882aa085..4eedc0f9 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -2,6 +2,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.internal.testutils.MockServlet; import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -17,6 +18,8 @@ import static org.junit.jupiter.api.Assertions.*; public class AwsFilterChainManagerTest { + private static final String SERVLET1_NAME = "Servlet 1"; + private static final String SERVLET2_NAME = "Servlet 2"; private static final String REQUEST_CUSTOM_ATTRIBUTE_NAME = "X-Custom-Attribute"; private static final String REQUEST_CUSTOM_ATTRIBUTE_VALUE = "CustomAttrValue"; @@ -36,6 +39,10 @@ public static void setUp() { reg2.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/second/*"); FilterRegistration.Dynamic reg3 = servletContext.addFilter("Filter3", new MockFilter()); reg3.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/third/fourth/*"); + ServletRegistration.Dynamic firstServlet = servletContext.addServlet(SERVLET1_NAME, new MockServlet()); + firstServlet.addMapping("/first/*"); + ServletRegistration.Dynamic secondServlet = servletContext.addServlet(SERVLET2_NAME, new MockServlet()); + secondServlet.addMapping("/second/*"); chainManager = new AwsFilterChainManager((AwsServletContext) servletContext); } @@ -88,6 +95,22 @@ void cacheKey_compare_differentDispatcher() { assertNotEquals(cacheKey, secondCacheKey); } + @Test + void cacheKey_compare_differentServlet() { + FilterChainManager.TargetCacheKey cacheKey = new FilterChainManager.TargetCacheKey(); + cacheKey.setDispatcherType(DispatcherType.REQUEST); + cacheKey.setTargetPath("/first/path"); + cacheKey.setServletName("Dispatcher servlet"); + + FilterChainManager.TargetCacheKey secondCacheKey = new FilterChainManager.TargetCacheKey(); + secondCacheKey.setDispatcherType(DispatcherType.REQUEST); + secondCacheKey.setTargetPath("/first/path"); + cacheKey.setServletName("Real servlet"); + + assertNotEquals(cacheKey.hashCode(), secondCacheKey.hashCode()); + assertNotEquals(cacheKey, secondCacheKey); + } + @Test void cacheKey_compare_additionalChars() { FilterChainManager.TargetCacheKey cacheKey = new FilterChainManager.TargetCacheKey(); @@ -154,7 +177,7 @@ void filterChain_matchMultipleTimes_expectSameMatch() { } @Test - void filerChain_executeMultipleFilters_expectRunEachTime() { + void filterChain_executeMultipleFilters_expectRunEachTime() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( new AwsProxyRequestBuilder("/first/second", "GET").build(), lambdaContext, null ); @@ -204,6 +227,34 @@ void filerChain_executeMultipleFilters_expectRunEachTime() { assertEquals(REQUEST_CUSTOM_ATTRIBUTE_VALUE, req2.getAttribute(REQUEST_CUSTOM_ATTRIBUTE_NAME)); } + @Test + void filterChain_multipleServlets_callsCorrectServlet() throws IOException, ServletException { + MockServlet servlet1 = (MockServlet) servletContext.getServlet(SERVLET1_NAME); + ServletConfig servlet1Config = ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET1_NAME)).getServletConfig(); + servlet1.init(servlet1Config); + + MockServlet servlet2 = (MockServlet) servletContext.getServlet(SERVLET2_NAME); + ServletConfig servlet2Config = ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET2_NAME)).getServletConfig(); + servlet2.init(servlet2Config); + + AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( + new AwsProxyRequestBuilder("/", "GET").build(), lambdaContext, null + ); + AwsHttpServletResponse resp = new AwsHttpServletResponse(req, new CountDownLatch(1)); + + FilterChainHolder servlet1filterChain = chainManager.getFilterChain(req, servlet1); + servlet1filterChain.doFilter(req, resp); + + assertEquals(1, servlet1.getServiceCalls()); + assertEquals(0, servlet2.getServiceCalls()); + + FilterChainHolder servlet2filterChain = chainManager.getFilterChain(req, servlet2); + servlet2filterChain.doFilter(req, resp); + + assertEquals(1, servlet1.getServiceCalls()); + assertEquals(1, servlet2.getServiceCalls()); + } + @Test void filterChain_getFilterChain_multipleFilters() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest( diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 5c84bca3..35f6723b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -13,12 +13,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; -import java.io.PrintWriter; -import java.io.UnsupportedEncodingException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.concurrent.CountDownLatch; import static org.junit.jupiter.api.Assertions.*; @@ -190,12 +185,7 @@ void unsupportedOperations_expectExceptions() { } catch (UnsupportedOperationException e) { exCount++; } - try { - STATIC_CTX.getNamedDispatcher("1"); - } catch (UnsupportedOperationException e) { - exCount++; - } - assertEquals(2, exCount); + assertEquals(1, exCount); assertNull(STATIC_CTX.getServletRegistration("1")); } @@ -232,6 +222,12 @@ void addServlet_callsDefaultConstructor() throws ServletException { assertEquals("", ((TestServlet)ctx.getServlet("srv1")).getId()); } + @Test + void getNamedDispatcher_returnsDispatcher() { + AwsServletContext ctx = new AwsServletContext(null); + assertNotNull(ctx.getNamedDispatcher("/hello")); + } + public static class TestServlet implements Servlet { private String id; From ff842c4f0f9177488014f8ffc3f3894a43a2d026 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 3 Feb 2023 16:13:12 +0100 Subject: [PATCH 0561/1214] chore(deps): Update Junit to 5.9.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 48f6ea9d..6aaf501d 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ 7.4.1 2.14.1 2.0.6 - 5.9.1 + 5.9.2 4.9.0 1.3 UTF-8 From 65d12c2f1335e7f63ddbce29fd2268c12c9b2b6a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 3 Feb 2023 16:15:56 +0100 Subject: [PATCH 0562/1214] chore(deps): Update Spring dependencies (framework to 5.3.25, security to 5.7.6, boot to 2.7.8) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7e531095..87bbb792 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -110,7 +110,7 @@ org.springframework.security spring-security-web - 5.7.5 + 5.7.6 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4f6c6003..4aa95970 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.24 - 5.7.5 + 5.3.25 + 5.7.6 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 98662d22..1d7fffd4 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.10-SNAPSHOT - 5.3.24 - 2.7.6 - 5.7.5 + 5.3.25 + 2.7.8 + 5.7.6 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 24743ce1..319a102d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.24', - 'org.springframework:spring-context:5.3.24', + 'org.springframework:spring-webmvc:5.3.25', + 'org.springframework:spring-context:5.3.25', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 69db642a..855e267d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.24 + 5.3.25 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index bbf0b870..b47ce60a 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.6', + 'org.springframework.boot:spring-boot-starter-web:2.7.8', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 17a1419b..b4ad6174 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.6 + 2.7.8 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 7d51cc70..057ca5c7 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.24', - 'org.springframework:spring-context:5.3.24', + 'org.springframework:spring-webmvc:5.3.25', + 'org.springframework:spring-context:5.3.25', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4b54b0da..01353295 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.24 + 5.3.25 4.13.2 2.19.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index c0dddba8..cfc92b15 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.6') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.8') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index bf9cf13f..a6f20823 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.6 + 2.7.8 From 3b99b5348da133625ec625a37ed4b9080c719b70 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 3 Feb 2023 16:17:08 +0100 Subject: [PATCH 0563/1214] chore(deps): update Jackson version to 2.14.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6aaf501d..21a097a3 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 7.4.1 - 2.14.1 + 2.14.2 2.0.6 5.9.2 4.9.0 From abae8e8bb830dfdde4b1218a94e91a64d95304a9 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 3 Feb 2023 14:40:46 +0200 Subject: [PATCH 0564/1214] Align header checks --- .../proxy/internal/servlet/AwsHttpServletResponse.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index fc03922c..65677d00 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -213,7 +213,7 @@ public void addDateHeader(String s, long l) { @Override public void setHeader(String s, String s1) { if (!canSetHeader()) return; - if ("Content-Type".equalsIgnoreCase(s)) { + if (isContentTypeHeader(s)) { setContentType(s1); } else { setHeader(s, s1, true); @@ -221,11 +221,16 @@ public void setHeader(String s, String s1) { } + private boolean isContentTypeHeader(String s) { + return s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault())); + } + + @Override public void addHeader(String s, String s1) { if (!canSetHeader()) return; // TODO: We should probably have a list of headers that we are not allowed to have multiple values for - if (s.toLowerCase(Locale.getDefault()).equals(HttpHeaders.CONTENT_TYPE.toLowerCase(Locale.getDefault()))) { + if (isContentTypeHeader(s)) { setContentType(s1); } else { setHeader(s, s1, false); From 22393803e3d17a09373745bb52347ba2292e4b38 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 15 Feb 2023 07:03:02 +0100 Subject: [PATCH 0565/1214] chore(deps): update Commons Fileupload version to 1.5 --- aws-serverless-java-container-core/pom.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 87bbb792..52301fc3 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -61,12 +61,7 @@ commons-fileupload commons-fileupload - 1.4 - - - commons-io - commons-io - 2.11.0 + 1.5 From f098f97a0b8a03175b040207714beb3b983d63be Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 16 Feb 2023 14:34:49 +0100 Subject: [PATCH 0566/1214] doc: added comment for https://stackoverflow.com/a/75471488/3156607 --- .../serverless/proxy/internal/servlet/AwsHttpServletRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 61d97bfe..0a2ab199 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -145,6 +145,7 @@ public HttpSession getSession(boolean b) { @Override public HttpSession getSession() { log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session"); + // as per Servlet spec this method should create a session if none exists, so we should change it to getSession(true) in the future return this.session; } From dc87300299f7f0559913bb8e9db6023b768551a8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 7 Mar 2023 09:43:47 +0100 Subject: [PATCH 0567/1214] chore(deps): Update Spring dependencies (security to 5.7.7, boot to 2.7.9) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 52301fc3..b086412e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -105,7 +105,7 @@ org.springframework.security spring-security-web - 5.7.6 + 5.7.7 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4aa95970..f31f9a0f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 5.3.25 - 5.7.6 + 5.7.7 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 1d7fffd4..0c34b51d 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -16,8 +16,8 @@ 5.3.25 - 2.7.8 - 5.7.6 + 2.7.9 + 5.7.7 1.8 1.8 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index b47ce60a..15a428b1 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.8', + 'org.springframework.boot:spring-boot-starter-web:2.7.9', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index b4ad6174..074b0112 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.8 + 2.7.9 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index cfc92b15..8b83cc44 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.8') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.9') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index a6f20823..6901fb7e 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.8 + 2.7.9 From aa27167a2d516790e463982431ee131b1ce264de Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 7 Mar 2023 09:52:46 +0100 Subject: [PATCH 0568/1214] chore(deps): Update OWASP dependency check to 8.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 21a097a3..90d84d55 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 0.7 - 7.4.1 + 8.1.2 2.14.2 2.0.6 5.9.2 From 3645aae2c89ff4fab0660ef5bd55cb91bb5eab76 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 13:03:03 +0100 Subject: [PATCH 0569/1214] chore(deps): Update Spring dependencies (framework to 5.3.26, boot to 2.7.10) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot2/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f31f9a0f..7a58ac1d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 5.3.25 + 5.3.26 5.7.7 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 0c34b51d..d9dfb4aa 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,8 +15,8 @@ 1.10-SNAPSHOT - 5.3.25 - 2.7.9 + 5.3.26 + 2.7.10 5.7.7 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 319a102d..1a80d26d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.25', - 'org.springframework:spring-context:5.3.25', + 'org.springframework:spring-webmvc:5.3.26', + 'org.springframework:spring-context:5.3.26', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 855e267d..5f30c5c7 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.25 + 5.3.26 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 15a428b1..36a13b5d 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.9', + 'org.springframework.boot:spring-boot-starter-web:2.7.10', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 074b0112..5612389c 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.9 + 2.7.10 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 057ca5c7..e47d0626 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.25', - 'org.springframework:spring-context:5.3.25', + 'org.springframework:spring-webmvc:5.3.26', + 'org.springframework:spring-context:5.3.26', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 01353295..c467c498 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.25 + 5.3.26 4.13.2 2.19.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 8b83cc44..5f462419 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.9') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.10') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 6901fb7e..202d9c34 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.9 + 2.7.10 From 188b8b0930f27c6b599836e843017d8eaf137094 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 15:55:02 +0100 Subject: [PATCH 0570/1214] chore(deps): update SLF4J to 2.0.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90d84d55..a526e8f7 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ 0.7 8.1.2 2.14.2 - 2.0.6 + 2.0.7 5.9.2 4.9.0 1.3 From 4266dabfb37103d7aea2df0693355244282d4392 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 19:45:19 +0100 Subject: [PATCH 0571/1214] chore(deps): update Mockito to 5.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a526e8f7..78b3b4e0 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 2.14.2 2.0.7 5.9.2 - 4.9.0 + 5.2.0 1.3 UTF-8 From ec8bd789e0c3679f4559935db8f1266b83b8053e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 19:45:40 +0100 Subject: [PATCH 0572/1214] chore(deps): update Struts to 6.1.2 --- aws-serverless-java-container-struts/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index c42747a7..1c628e94 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 6.1.1 + 6.1.2 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 34373b60..53d46cf9 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:6.1.1') { + implementation ('org.apache.struts:struts2-convention-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:6.1.1') { + implementation ('org.apache.struts:struts2-rest-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.1') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:6.1.1') { + implementation ('org.apache.struts:struts2-core:6.1.2') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -42,7 +42,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') - testImplementation('org.apache.struts:struts2-junit-plugin:6.1.1') { + testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index d84ad190..044ea80e 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 6.1.1 + 6.1.2 2.14.1 4.13.2 2.19.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 6aeff27d..ed108a3f 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', - 'org.apache.struts:struts2-convention-plugin:6.1.1', - 'org.apache.struts:struts2-rest-plugin:6.1.1', - 'org.apache.struts:struts2-bean-validation-plugin:6.1.1', - 'org.apache.struts:struts2-junit-plugin:6.1.1', + 'org.apache.struts:struts2-convention-plugin:6.1.2', + 'org.apache.struts:struts2-rest-plugin:6.1.2', + 'org.apache.struts:struts2-bean-validation-plugin:6.1.2', + 'org.apache.struts:struts2-junit-plugin:6.1.2', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index a1bf6259..0e6df26e 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 6.1.1 + 6.1.2 2.14.1 4.13.2 2.19.0 From f3ba895ce91527b85248e054684ecac163e76ebc Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 20:07:01 +0100 Subject: [PATCH 0573/1214] chore(deps): update Jersey to 2.39.1 along with JAX-RS API to 2.1.1 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b086412e..462cbc83 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.1 + 2.1.1 3.1.0 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 2d491078..ae894985 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.37 + 2.39.1 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index c1756d92..58ac7f61 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -12,13 +12,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.37") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.39.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.37") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.39.1") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index dbb4cf12..389bd8c2 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,7 @@ 1.8 1.8 - 2.37 + 2.39.1 2.14.1 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index ea8ee51d..632fb35d 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -12,13 +12,13 @@ dependencies { 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.37") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.39.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.37") { + implementation("org.glassfish.jersey.inject:jersey-hk2:2.39.1") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index ce0baf4c..7f26e5c2 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.37 + 2.39.1 2.14.1 From b4a643eda6c0233d58c83592a50d8269bff8fce3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 20:09:43 +0100 Subject: [PATCH 0574/1214] chore(deps): use Jackson 2.14.2 also in samples and archetypes --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 58ac7f61..6ed4bc37 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 389bd8c2..195dcf39 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.39.1 - 2.14.1 + 2.14.2 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 780810c9..3632fe38 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 9e1910aa..21eaced6 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.14.1 + 2.14.2 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1a80d26d..12634845 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 53d46cf9..a944bcda 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.1') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.1') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.2') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.2') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 044ea80e..b9abc256 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.1.2 - 2.14.1 + 2.14.2 4.13.2 2.19.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 632fb35d..c0f5bd93 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7f26e5c2..52111239 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.39.1 - 2.14.1 + 2.14.2 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 5087400c..f90fcd3c 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 04915a2b..fe887dbd 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.14.1 + 2.14.2 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index e47d0626..261f094c 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index ed108a3f..d48136b4 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.1', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.1', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.2', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 0e6df26e..6741d350 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.1.2 - 2.14.1 + 2.14.2 4.13.2 2.19.0 From 35e0ad35c6975ec38919bdd80efaf6e5dc02ca23 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Mar 2023 20:24:32 +0100 Subject: [PATCH 0575/1214] chore(deps): set Mockito to 4.11.0 as 5.x requires JDK 11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 78b3b4e0..2c3ff952 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ 2.14.2 2.0.7 5.9.2 - 5.2.0 + 4.11.0 1.3 UTF-8 From 63d82cb043b57a20b276d194debd7c7a7a36d7cd Mon Sep 17 00:00:00 2001 From: deki Date: Sat, 25 Mar 2023 06:51:39 +0000 Subject: [PATCH 0576/1214] chore: release -prepare release aws-serverless-java-container-1.9.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 462cbc83..95f26abb 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ae894985..9467cef8 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.2 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f5ea6b86..fae2d5ea 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.2 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7a58ac1d..76de160d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.2 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index d9dfb4aa..8d7a064e 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.10-SNAPSHOT + 1.9.2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 5.3.26 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.2 diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 1c628e94..c6dbf9f1 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.2 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c13c0586..fc3b452f 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.10-SNAPSHOT + 1.9.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ca3ad395..27fe34a3 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.10-SNAPSHOT + 1.9.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 83dc7974..03f94e75 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.10-SNAPSHOT + 1.9.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 1e7279db..b2d37a59 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.10-SNAPSHOT + 1.9.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index b91cfa4b..3ed5a50c 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.2 com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.10-SNAPSHOT + 1.9.2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 diff --git a/pom.xml b/pom.xml index 2c3ff952..44ac1cb4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.10-SNAPSHOT + 1.9.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.2 From 0210a77f280f7069462795020d039edf7680d3f9 Mon Sep 17 00:00:00 2001 From: deki Date: Sat, 25 Mar 2023 06:51:40 +0000 Subject: [PATCH 0577/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 95f26abb..462cbc83 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 9467cef8..ae894985 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.2 + 1.10-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index fae2d5ea..f5ea6b86 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.2 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 76de160d..7a58ac1d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.2 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 8d7a064e..d9dfb4aa 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9.2 + 1.10-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT 5.3.26 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.2 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index c6dbf9f1..1c628e94 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.2 + 1.10-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index fc3b452f..c13c0586 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9.2 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 27fe34a3..ca3ad395 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9.2 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 03f94e75..83dc7974 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9.2 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index b2d37a59..1e7279db 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9.2 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index 3ed5a50c..b91cfa4b 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.2 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.9.2 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD diff --git a/pom.xml b/pom.xml index 44ac1cb4..2c3ff952 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9.2 + 1.10-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.2 + HEAD From 47b259893a0423a9e30706a71c618905f49f277e Mon Sep 17 00:00:00 2001 From: Daan Kerkhofs <17711209+kerkhofsd@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:15:10 +0200 Subject: [PATCH 0578/1214] gh-511 Adapt AwsProxyHttpServletRequest getLocale tests --- .../AwsProxyHttpServletRequestTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 73c07a8f..af272e23 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -501,7 +501,7 @@ void getLocales_validAcceptHeader_expectSingleLocale(String type) { int localesNo = 0; while (locales.hasMoreElements()) { Locale defaultLocale = locales.nextElement(); - assertEquals(new Locale("fr-CH"), defaultLocale); + assertEquals(new Locale("fr", "CH"), defaultLocale); localesNo++; } assertEquals(1, localesNo); @@ -512,7 +512,7 @@ void getLocales_validAcceptHeader_expectSingleLocale(String type) { void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList(String type) { initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); - req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); + req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CA, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5"); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -520,14 +520,14 @@ void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList(String typ localesList.add(locales.nextElement()); } assertEquals(5, localesList.size()); - assertEquals(new Locale("fr-CH"), localesList.get(0)); - assertEquals(new Locale("fr"), localesList.get(1)); - assertEquals(new Locale("en"), localesList.get(2)); + assertEquals(Locale.CANADA_FRENCH, localesList.get(0)); + assertEquals(Locale.FRENCH, localesList.get(1)); + assertEquals(Locale.ENGLISH, localesList.get(2)); assertEquals(new Locale("de"), localesList.get(3)); assertEquals(new Locale("*"), localesList.get(4)); assertNotNull(servletRequest.getLocale()); - assertEquals(new Locale("fr-CH"), servletRequest.getLocale()); + assertEquals(Locale.CANADA_FRENCH, servletRequest.getLocale()); } @MethodSource("data") @@ -535,7 +535,7 @@ void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleList(String typ void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered(String type) { initAwsProxyHttpServletRequestTest(type); AwsProxyRequestBuilder req = getRequestWithHeaders(); - req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CH, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); + req.header(HttpHeaders.ACCEPT_LANGUAGE, "fr-CA, en;q=0.8, de;q=0.7, *;q=0.5, fr;q=0.9"); HttpServletRequest servletRequest = getRequest(req, null, null); Enumeration locales = servletRequest.getLocales(); List localesList = new ArrayList<>(); @@ -543,9 +543,9 @@ void getLocales_validAcceptHeaderMultipleLocales_expectFullLocaleListOrdered(Str localesList.add(locales.nextElement()); } assertEquals(5, localesList.size()); - assertEquals(new Locale("fr-CH"), localesList.get(0)); - assertEquals(new Locale("fr"), localesList.get(1)); - assertEquals(new Locale("en"), localesList.get(2)); + assertEquals(Locale.CANADA_FRENCH, localesList.get(0)); + assertEquals(Locale.FRENCH, localesList.get(1)); + assertEquals(Locale.ENGLISH, localesList.get(2)); assertEquals(new Locale("de"), localesList.get(3)); assertEquals(new Locale("*"), localesList.get(4)); } From be3a7dd3c5dd8bfd9743d868bddad300c40388d1 Mon Sep 17 00:00:00 2001 From: Daan Kerkhofs <17711209+kerkhofsd@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:15:10 +0200 Subject: [PATCH 0579/1214] gh-511 Support country part in Accept-Language language tags --- .../AwsHttpApiV2ProxyHttpServletRequest.java | 24 ++------- .../servlet/AwsHttpServletRequest.java | 51 +++++++++++++++++-- .../servlet/AwsProxyHttpServletRequest.java | 38 ++------------ 3 files changed, 53 insertions(+), 60 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 09a5e884..c03facc3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -408,31 +408,13 @@ public String getRemoteHost() { @Override public Locale getLocale() { - // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 - List values = this.parseHeaderValue( - headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" - ); - if (values.size() == 0) { - return Locale.getDefault(); - } - return new Locale(values.get(0).getValue()); + List locales = parseAcceptLanguageHeader(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)); + return locales.size() == 0 ? Locale.getDefault() : locales.get(0); } @Override public Enumeration getLocales() { - List values = this.parseHeaderValue( - headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" - ); - - List locales = new ArrayList<>(); - if (values.size() == 0) { - locales.add(Locale.getDefault()); - } else { - for (HeaderValue locale : values) { - locales.add(new Locale(locale.getValue())); - } - } - + List locales = parseAcceptLanguageHeader(headers.getFirst(HttpHeaders.ACCEPT_LANGUAGE)); return Collections.enumeration(locales); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 0a2ab199..d2157e3d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -16,9 +16,11 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.SecurityUtils; import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.*; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.model.Headers; +import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; @@ -30,10 +32,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.*; +import javax.servlet.DispatcherType; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.servlet.http.Part; import javax.ws.rs.core.MediaType; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -697,6 +704,40 @@ protected List parseHeaderValue(String headerValue, String valueSep return values; } + protected List parseAcceptLanguageHeader(String headerValue) { + // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 + List values = this.parseHeaderValue( + headerValue, ",", ";" + ); + + List locales = new ArrayList<>(); + if (values.size() == 0) { + locales.add(Locale.getDefault()); + } else { + for (HeaderValue locale : values) { + locales.add(parseLanguageTag(locale.getValue())); + } + } + + return locales; + } + + protected Locale parseLanguageTag(String languageTag) { + languageTag = languageTag.trim(); + String language; + String country = ""; + + int indexDash = languageTag.indexOf('-'); + if (indexDash > -1) { + country = languageTag.substring(indexDash + 1).trim(); + language = languageTag.substring(0, indexDash).trim(); + } else { + language = languageTag; + } + + return new Locale(language, country); + } + static String decodeRequestPath(String requestPath, ContainerConfig config) { try { return URLDecoder.decode(requestPath, config.getUriEncoding()); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 61486bc7..c85bf80a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -20,7 +20,6 @@ import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; - import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +28,6 @@ import javax.servlet.http.*; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.SecurityContext; - import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; @@ -38,15 +36,7 @@ import java.time.Instant; import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -471,36 +461,16 @@ public String getRemoteHost() { @Override public Locale getLocale() { - // Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5 - List values = this.parseHeaderValue( - request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" - ); - if (values.size() == 0) { - return Locale.getDefault(); - } - return new Locale(values.get(0).getValue()); + List locales = parseAcceptLanguageHeader(request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE)); + return locales.size() == 0 ? Locale.getDefault() : locales.get(0); } - @Override public Enumeration getLocales() { - List values = this.parseHeaderValue( - request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE), ",", ";" - ); - - List locales = new ArrayList<>(); - if (values.size() == 0) { - locales.add(Locale.getDefault()); - } else { - for (HeaderValue locale : values) { - locales.add(new Locale(locale.getValue())); - } - } - + List locales = parseAcceptLanguageHeader(request.getMultiValueHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE)); return Collections.enumeration(locales); } - @Override public boolean isSecure() { return securityContext.isSecure(); From 4de5f4be69b47007d6b325e99c70e4658d482a2a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Apr 2023 08:09:21 +0200 Subject: [PATCH 0580/1214] chore(deps): Update Spring dependencies (framework to 5.3.27, security to 5.7.8, boot to 2.7.11) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot2/pet-store/build.gradle | 2 +- samples/springboot2/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 462cbc83..584c3984 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -105,7 +105,7 @@ org.springframework.security spring-security-web - 5.7.7 + 5.7.8 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7a58ac1d..444b95be 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.26 - 5.7.7 + 5.3.27 + 5.7.8 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index d9dfb4aa..33bb8171 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,9 +15,9 @@ 1.10-SNAPSHOT - 5.3.26 - 2.7.10 - 5.7.7 + 5.3.27 + 2.7.11 + 5.7.8 1.8 1.8 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 12634845..713fc0eb 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.26', - 'org.springframework:spring-context:5.3.26', + 'org.springframework:spring-webmvc:5.3.27', + 'org.springframework:spring-context:5.3.27', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 5f30c5c7..3fbd5126 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.26 + 5.3.27 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle index 36a13b5d..d6946e7f 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.10', + 'org.springframework.boot:spring-boot-starter-web:2.7.11', 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml index 5612389c..53404bdb 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.10 + 2.7.11 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 261f094c..4d5a460f 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.26', - 'org.springframework:spring-context:5.3.26', + 'org.springframework:spring-webmvc:5.3.27', + 'org.springframework:spring-context:5.3.27', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index c467c498..73cf9dc1 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 5.3.26 + 5.3.27 4.13.2 2.19.0 diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot2/pet-store/build.gradle index 5f462419..60affd72 100644 --- a/samples/springboot2/pet-store/build.gradle +++ b/samples/springboot2/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.10') { + implementation('org.springframework.boot:spring-boot-starter-web:2.7.11') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot2/pet-store/pom.xml index 202d9c34..534d565d 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot2/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.10 + 2.7.11 From fe6cb1752af37fa79345c1798aa229a1ea350692 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Apr 2023 08:58:36 +0200 Subject: [PATCH 0581/1214] chore(deps): Update Apache HttpComponents dependencies (httpmime, httpclient to 4.5.14, httpcore to 4.4.16) --- aws-serverless-java-container-core/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 584c3984..f86819ec 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -68,7 +68,7 @@ org.apache.httpcomponents httpmime - 4.5.13 + 4.5.14 compile @@ -76,7 +76,7 @@ org.apache.httpcomponents httpclient - 4.5.13 + 4.5.14 test @@ -97,7 +97,7 @@ org.apache.httpcomponents httpcore - 4.4.15 + 4.4.16 compile true From c9c0ab53fb54388e355000fe387955d0e2c42150 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Apr 2023 09:14:37 +0200 Subject: [PATCH 0582/1214] chore(deps): Update Jackson dependency to 2.15.0 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 6ed4bc37..949112fc 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 195dcf39..1783f79a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 2.39.1 - 2.14.2 + 2.15.0 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 3632fe38..73adc7fe 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 21eaced6..358bbd5e 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.14.2 + 2.15.0 2.9.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 713fc0eb..66093c4b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index a944bcda..83e8e8bb 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.14.2') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.2') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.0') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0') implementation ('org.apache.logging.log4j:log4j-core:2.19.0') implementation ('org.apache.logging.log4j:log4j-api:2.19.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index b9abc256..c7aafda3 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.1.2 - 2.14.2 + 2.15.0 4.13.2 2.19.0 diff --git a/pom.xml b/pom.xml index 2c3ff952..3bf6fbf0 100644 --- a/pom.xml +++ b/pom.xml @@ -82,7 +82,7 @@ 0.7 8.1.2 - 2.14.2 + 2.15.0 2.0.7 5.9.2 4.11.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index c0f5bd93..b32dc8ef 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 52111239..f6b5bed4 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 2.39.1 - 2.14.2 + 2.15.0 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index f90fcd3c..78b700c3 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index fe887dbd..e2d89cb3 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.14.2 + 2.15.0 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 4d5a460f..759aa061 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index d48136b4..bd4738f0 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 6741d350..2a90ffc0 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.1.2 - 2.14.2 + 2.15.0 4.13.2 2.19.0 From a4c406e49316b4d2972d28f7054233172cf21bd3 Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 24 Apr 2023 08:13:21 +0000 Subject: [PATCH 0583/1214] chore: release -prepare release aws-serverless-java-container-1.9.3 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f86819ec..1f0978bf 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ae894985..290b5cf9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.3 com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f5ea6b86..d5210669 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.3 diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 444b95be..82b2286c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.3 diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 33bb8171..db225300 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.10-SNAPSHOT + 1.9.3 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 5.3.27 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.3 diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 1c628e94..3a885755 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 1.9.3 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c13c0586..57df9ba3 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.10-SNAPSHOT + 1.9.3 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ca3ad395..6d58e076 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.10-SNAPSHOT + 1.9.3 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 83dc7974..1adb0f47 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.10-SNAPSHOT + 1.9.3 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index 1e7279db..d6a2f1d4 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.10-SNAPSHOT + 1.9.3 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index b91cfa4b..e60f19e3 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 1.9.3 com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.10-SNAPSHOT + 1.9.3 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 diff --git a/pom.xml b/pom.xml index 3bf6fbf0..09e91ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.10-SNAPSHOT + 1.9.3 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-1.9.3 From 063b443eaa06b137ff50ef1302e766bc28577ce2 Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 24 Apr 2023 08:13:23 +0000 Subject: [PATCH 0584/1214] chore: release -prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 6 +++--- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-spring/pom.xml | 6 +++--- aws-serverless-java-container-springboot2/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot2-archetype/pom.xml | 6 +++--- aws-serverless-struts-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1f0978bf..f86819ec 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 290b5cf9..ae894985 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.3 + 1.10-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index d5210669..f5ea6b86 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.3 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 82b2286c..444b95be 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT .. @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.3 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index db225300..33bb8171 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.9.3 + 1.10-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT 5.3.27 @@ -27,7 +27,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.3 + 1.10-SNAPSHOT diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 3a885755..1c628e94 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.9.3 + 1.10-SNAPSHOT diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 57df9ba3..c13c0586 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.9.3 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 6d58e076..ca3ad395 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.9.3 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 1adb0f47..83dc7974 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.9.3 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml index d6a2f1d4..1e7279db 100644 --- a/aws-serverless-springboot2-archetype/pom.xml +++ b/aws-serverless-springboot2-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot2-archetype - 1.9.3 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index e60f19e3..b91cfa4b 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 1.9.3 + 1.10-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.9.3 + 1.10-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD diff --git a/pom.xml b/pom.xml index 09e91ab3..3bf6fbf0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.9.3 + 1.10-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -41,7 +41,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-1.9.3 + HEAD From e806b75283ccea7a12dbc87a402be3ed8fadad6d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Apr 2023 10:40:17 +0200 Subject: [PATCH 0585/1214] doc: created overview about maintained versions --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index d4c836e2..89531389 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,13 @@ The `aws-serverless-java-container` makes it easy to run Java applications writt Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. +Currently the following versions are maintained: + +| Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | +|--------------------------|--------|-------------------------|-----------------|------------------------|----------------|---------------| +| 1.x (stable) | [1.x](https://github.com/awslabs/aws-serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | +| 2.x (under development) | [main](https://github.com/awslabs/aws-serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | + Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) From dd524dc35592c5113d9651c088fade9975c21b98 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Apr 2023 10:44:30 +0200 Subject: [PATCH 0586/1214] chore: enable CI build for 1.x branch --- .github/workflows/continuous-integration-workflow.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2aaf1761..4942f356 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + - 1.x workflow_dispatch: jobs: From 749cad712575ab9890aa35a38c87bea49f7eea61 Mon Sep 17 00:00:00 2001 From: Mbea Date: Fri, 31 Mar 2023 16:27:37 -0700 Subject: [PATCH 0587/1214] Updated versions of Spring, Spring Security, Springboot spring-security-web, servlet API, commons-fileupload. --- aws-serverless-java-container-core/pom.xml | 44 +++++++++++++++---- .../AwsHttpApiV2SecurityContextWriter.java | 2 +- .../proxy/AwsProxyExceptionHandler.java | 6 +-- .../proxy/AwsProxySecurityContextWriter.java | 2 +- .../serverless/proxy/LogFormatter.java | 2 +- .../serverless/proxy/RequestReader.java | 2 +- .../proxy/SecurityContextWriter.java | 2 +- .../internal/LambdaContainerHandler.java | 2 +- .../jaxrs/AwsHttpApiV2SecurityContext.java | 4 +- .../jaxrs/AwsProxySecurityContext.java | 3 +- .../ApacheCombinedServletLogFormatter.java | 7 ++- .../internal/servlet/AwsAsyncContext.java | 6 +-- .../AwsHttpApiV2HttpServletRequestReader.java | 4 +- .../AwsHttpApiV2ProxyHttpServletRequest.java | 8 ++-- .../servlet/AwsHttpServletRequest.java | 33 +++++--------- .../servlet/AwsHttpServletRequestWrapper.java | 4 +- .../servlet/AwsHttpServletResponse.java | 16 +++---- .../internal/servlet/AwsHttpSession.java | 6 +-- .../AwsLambdaServletContainerHandler.java | 10 ++--- .../servlet/AwsProxyHttpServletRequest.java | 32 +++++++++----- .../AwsProxyHttpServletRequestReader.java | 8 ++-- .../AwsProxyHttpServletResponseWriter.java | 4 +- .../servlet/AwsProxyRequestDispatcher.java | 6 +-- .../internal/servlet/AwsProxyRequestPart.java | 2 +- .../internal/servlet/AwsServletContext.java | 43 ++++++++++++++++-- .../servlet/AwsServletInputStream.java | 4 +- .../servlet/AwsServletRegistration.java | 2 +- .../internal/servlet/FilterChainHolder.java | 2 +- .../internal/servlet/FilterChainManager.java | 4 +- .../proxy/internal/servlet/FilterHolder.java | 6 +-- .../ServletLambdaContainerHandlerBuilder.java | 2 +- .../servlet/filters/UrlPathValidator.java | 8 ++-- .../testutils/AwsProxyRequestBuilder.java | 10 +---- .../proxy/internal/testutils/MockServlet.java | 8 ++-- .../proxy/model/MultiValuedTreeMap.java | 2 +- .../proxy/AwsProxyExceptionHandlerTest.java | 6 +-- .../AwsProxySecurityContextWriterTest.java | 3 +- .../serverless/proxy/ResponseWriterTest.java | 2 +- .../internal/LambdaContainerHandlerTest.java | 2 +- .../jaxrs/HttpApiV2SecurityContextTest.java | 4 +- ...ApacheCombinedServletLogFormatterTest.java | 5 +-- .../internal/servlet/AwsAsyncContextTest.java | 12 ++--- .../servlet/AwsFilterChainManagerTest.java | 2 +- ...HttpApiV2HttpServletRequestReaderTest.java | 4 +- .../servlet/AwsHttpServletRequestTest.java | 8 ++-- .../servlet/AwsHttpServletResponseTest.java | 6 +-- .../AwsProxyHttpServletRequestFormTest.java | 8 ++-- .../AwsProxyHttpServletRequestReaderTest.java | 8 ++-- .../AwsProxyHttpServletRequestTest.java | 8 ++-- .../AwsProxyRequestDispatcherTest.java | 8 ++-- .../servlet/AwsServletContextTest.java | 6 +-- .../servlet/AwsServletRegistrationTest.java | 2 +- ...vletLambdaContainerHandlerBuilderTest.java | 2 +- .../servlet/filters/UrlPathValidatorTest.java | 9 ++-- .../pom.xml | 14 +++--- .../SpringBootLambdaContainerHandler.java | 14 ++---- .../spring/SpringBootProxyHandlerBuilder.java | 4 +- ...sReactiveServletEmbeddedServerFactory.java | 2 +- ...erverlessServletEmbeddedServerFactory.java | 2 +- .../proxy/spring/SecurityAppTest.java | 4 +- .../proxy/spring/ServletAppTest.java | 5 +-- ...rlessServletEmbeddedServerFactoryTest.java | 4 +- .../spring/servletapp/MessageController.java | 2 +- .../proxy/spring/servletapp/UserData.java | 6 +-- 64 files changed, 250 insertions(+), 218 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f86819ec..82135d77 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -17,9 +17,24 @@ 2.1.1 - 3.1.0 + 5.0.0 + + + apache.snapshots + Apache Development Snapshot Repository + https://repository.apache.org/content/repositories/snapshots/ + + false + + + true + + + + + @@ -30,16 +45,16 @@ - javax.servlet - javax.servlet-api - ${servlet.version} + jakarta.servlet + jakarta.servlet-api + 5.0.0 - javax.ws.rs - javax.ws.rs-api - ${jaxrs.version} + jakarta.ws.rs + jakarta.ws.rs-api + 3.0.0-M1 @@ -58,10 +73,15 @@ - + + + org.apache.commons + commons-fileupload2 + 2.0-SNAPSHOT @@ -105,9 +125,14 @@ org.springframework.security spring-security-web - 5.7.8 + 6.0.2 test + + jakarta.activation + jakarta.activation-api + 2.1.0 + @@ -220,4 +245,5 @@ + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java index 05d4ed1a..d4192141 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsHttpApiV2SecurityContextWriter.java @@ -16,7 +16,7 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; public class AwsHttpApiV2SecurityContextWriter implements SecurityContextWriter { @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index cf2aae3e..1e30f141 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -22,9 +22,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.OutputStream; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java index 4805e119..8a58bc47 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriter.java @@ -16,7 +16,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; /** * Default implementation of SecurityContextWriter. Creates a SecurityContext object based on an API Gateway diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java index dcd524f9..8bc75ca9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java @@ -12,7 +12,7 @@ */ package com.amazonaws.serverless.proxy; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; /** * Implementations of the log formatter interface are used by {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler} class to log each request diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java index e0203d76..d8293d64 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/RequestReader.java @@ -17,7 +17,7 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java index 32430d81..27a4c6c7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/SecurityContextWriter.java @@ -15,7 +15,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; /** * This object is used by the container implementation to generated a Jax-Rs SecurityContext object from the diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index e29b1072..d736d637 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -28,7 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java index 6060fb2e..f0e1f963 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsHttpApiV2SecurityContext.java @@ -21,8 +21,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; import java.nio.charset.StandardCharsets; import java.security.Principal; import java.util.Base64; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index b0582297..7c128cab 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -14,10 +14,9 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.CognitoAuthorizerClaims; -import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; import java.security.Principal; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java index 715e6f8d..e0c7a735 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java @@ -13,15 +13,14 @@ package com.amazonaws.serverless.proxy.internal.servlet; import com.amazonaws.serverless.proxy.LogFormatter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.SecurityContext; import java.time.*; import java.time.format.DateTimeFormatter; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 25162454..4a46a70f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -16,9 +16,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java index bacedbaa..c40740c9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReader.java @@ -18,8 +18,8 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.SecurityContext; public class AwsHttpApiV2HttpServletRequestReader extends RequestReader { static final String INVALID_REQUEST_ERROR = "The incoming event is not a valid HTTP API v2 proxy request"; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index c03facc3..d81105bd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -23,10 +23,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.*; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.*; +import jakarta.servlet.http.*; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index d2157e3d..358ccdfb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -22,25 +22,20 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.commons.fileupload2.FileItem; +import org.apache.commons.fileupload2.FileUploadException; +import org.apache.commons.fileupload2.disk.DiskFileItemFactory; +import org.apache.commons.fileupload2.jaksrvlt.JakSrvltFileUpload; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.DispatcherType; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletInputStream; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import javax.servlet.http.Part; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.*; +import jakarta.servlet.http.*; +import jakarta.ws.rs.core.MediaType; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -185,14 +180,6 @@ public boolean isRequestedSessionIdFromURL() { } - @Override - @Deprecated - public boolean isRequestedSessionIdFromUrl() { - log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session"); - return false; - } - - //------------------------------------------------------------- // Implementation - ServletRequest //------------------------------------------------------------- @@ -525,14 +512,14 @@ protected Map getMultipartFormParametersMap() { if (multipartFormParameters != null) { return multipartFormParameters; } - if (!ServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type + if (!JakSrvltFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type multipartFormParameters = new HashMap<>(); return multipartFormParameters; } Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); + JakSrvltFileUpload upload = new JakSrvltFileUpload(new DiskFileItemFactory()); try { List items = upload.parseRequest(this); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java index e151c03d..d87b707e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -15,8 +15,8 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.*; -import javax.servlet.http.*; +import jakarta.servlet.*; +import jakarta.servlet.http.*; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 65677d00..814958df 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -21,14 +21,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.DispatcherType; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.WriteListener; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index 8c3df7f8..eb1f728f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -15,9 +15,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpSession; -import javax.servlet.http.HttpSessionContext; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.HttpSessionContext; import java.time.Instant; import java.util.Collections; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index 52631da5..b35bba92 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -19,18 +19,16 @@ import com.amazonaws.serverless.proxy.ResponseWriter; import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpServletResponseWrapper; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; import java.io.IOException; import java.util.*; -import java.util.stream.Collectors; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index c85bf80a..a4ee1515 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -24,10 +24,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.*; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.*; +import jakarta.servlet.http.*; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; + import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; @@ -483,14 +484,6 @@ public RequestDispatcher getRequestDispatcher(String s) { } - @Override - @Deprecated - public String getRealPath(String s) { - // we are in an archive on a remote server - return null; - } - - @Override public int getRemotePort() { return 0; @@ -542,6 +535,21 @@ public AsyncContext getAsyncContext() { return asyncContext; } + @Override + public String getRequestId() { + return request.getRequestContext().getRequestId(); + } + + @Override + public String getProtocolRequestId() { + return ""; + } + + @Override + public ServletConnection getServletConnection() { + return null; + } + //------------------------------------------------------------- // Methods - Private //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java index 932041db..ec56285f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReader.java @@ -18,10 +18,10 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; /** * Simple implementation of the RequestReader interface that receives an AwsProxyRequest diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java index b6061e1e..0e230e9a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java @@ -22,8 +22,8 @@ import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import java.util.Base64; import java.util.HashMap; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index fc52d1db..5ed2ccf4 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -19,9 +19,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java index a6a418c2..c2d1fa62 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestPart.java @@ -17,7 +17,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.http.Part; +import jakarta.servlet.http.Part; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 44ec701e..a362dfc2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -20,9 +20,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.activation.MimetypesFileTypeMap; -import javax.servlet.*; -import javax.servlet.descriptor.JspConfigDescriptor; +import jakarta.activation.MimetypesFileTypeMap; +import jakarta.servlet.*; +import jakarta.servlet.ServletContext; +import jakarta.servlet.descriptor.JspConfigDescriptor; import java.io.File; import java.io.InputStream; @@ -79,7 +80,6 @@ public AwsServletContext(AwsLambdaServletContainerHandler containerHandler) { this.servletRegistrations = new HashMap<>(); } - //------------------------------------------------------------- // Implementation - ServletContext //------------------------------------------------------------- @@ -95,6 +95,36 @@ public String getContextPath() { return ""; } + @Override + public void setResponseCharacterEncoding(String encoding) { + // do nothing; + } + + @Override + public String getResponseCharacterEncoding() { + return ""; + } + + @Override + public void setRequestCharacterEncoding(String encoding) { + // do nothing; + } + + @Override + public String getRequestCharacterEncoding() { + return ""; + } + + @Override + public void setSessionTimeout(int sessionTimeout) { + // do nothing; + } + + @Override + public int getSessionTimeout() { + return 1; + } + @Override public ServletContext getContext(String s) { @@ -345,6 +375,11 @@ public ServletRegistration.Dynamic addServlet(String s, Class } } + @Override + public ServletRegistration.Dynamic addJspFile(String s, String s1) { + return null; + } + @Override public T createServlet(Class aClass) throws ServletException { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java index 552e75a8..eb155a36 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java @@ -16,8 +16,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java index 021503c1..9fdc3b3b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistration.java @@ -14,7 +14,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.*; +import jakarta.servlet.*; import java.util.*; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java index bec7a8f4..b45eed4a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainHolder.java @@ -16,7 +16,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; +import jakarta.servlet.*; import java.io.IOException; import java.util.ArrayList; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 1bf6f4b2..835170bb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -14,8 +14,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Collections; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java index 987dff14..c3a4cdb8 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterHolder.java @@ -14,9 +14,9 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.annotation.WebInitParam; +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.annotation.WebInitParam; import java.util.*; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java index caead2aa..b44ec7f2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilder.java @@ -18,7 +18,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java index c69b39c9..aadb26ef 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidator.java @@ -15,10 +15,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 6fae6db7..adcebb89 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -23,8 +23,8 @@ import org.apache.http.entity.mime.content.ByteArrayBody; import org.apache.http.entity.mime.content.StringBody; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.ByteArrayInputStream; import java.io.File; @@ -35,12 +35,6 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Collectors; /** diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java index b93625bf..6dd2ade6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java @@ -2,10 +2,10 @@ import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; public class MockServlet extends HttpServlet { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java index feeab6f2..ad0593a1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java @@ -14,7 +14,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import javax.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.MultivaluedMap; import java.io.Serializable; import java.util.ArrayList; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index dd3417db..f94371d6 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -17,9 +17,9 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java index 34af09df..8a2134f4 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxySecurityContextWriterTest.java @@ -1,13 +1,12 @@ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.SecurityContext; import java.lang.reflect.Method; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java index 48c54462..609fb0fd 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/ResponseWriterTest.java @@ -8,7 +8,7 @@ import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public class ResponseWriterTest { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java index 31a2c575..98b45fd1 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java @@ -13,7 +13,7 @@ import org.apache.http.impl.execchain.RequestAbortedException; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java index 0fda7b97..a4c6aa31 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/HttpApiV2SecurityContextTest.java @@ -5,8 +5,8 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import org.junit.jupiter.api.Test; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java index e0793268..69b2d798 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatterTest.java @@ -7,15 +7,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.time.Clock; import java.time.Instant; import java.time.ZoneId; import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY; -import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_EVENT_PROPERTY; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.ArgumentMatchers.eq; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index b5b79bba..2177fa8b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -12,12 +12,12 @@ import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.Test; -import javax.servlet.AsyncContext; -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRegistration; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.concurrent.CountDownLatch; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 4eedc0f9..7e7fba49 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -9,7 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; +import jakarta.servlet.*; import java.io.IOException; import java.util.EnumSet; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java index e35fedb7..12f694bc 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2HttpServletRequestReaderTest.java @@ -7,8 +7,8 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequestContext; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.HttpHeaders; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.HttpHeaders; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 35903333..051c12fc 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -5,13 +5,11 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; -import javax.servlet.ServletException; -import javax.servlet.http.Cookie; -import javax.ws.rs.core.HttpHeaders; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.ws.rs.core.HttpHeaders; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 39fe7144..6c951a4f 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -6,9 +6,9 @@ import org.junit.jupiter.api.Test; -import javax.servlet.http.Cookie; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.http.Cookie; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.PrintWriter; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index a185a1f8..07a2f410 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -10,10 +10,10 @@ import org.apache.http.entity.mime.MultipartEntityBuilder; import org.junit.jupiter.api.Test; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.nio.charset.Charset; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java index 486e923a..f92c3716 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestReaderTest.java @@ -6,13 +6,11 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.SecurityContext; -import java.lang.reflect.Method; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.SecurityContext; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index af272e23..855fae40 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -8,10 +8,10 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.SecurityContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.SecurityContext; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java index 03c06ad2..254ce04a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcherTest.java @@ -13,10 +13,10 @@ import org.junit.jupiter.api.Test; import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper; -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.Charset; import java.util.concurrent.CountDownLatch; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 35f6723b..5817527e 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -8,9 +8,9 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java index 105abc61..80bb3806 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletRegistrationTest.java @@ -2,7 +2,7 @@ import org.junit.jupiter.api.Test; -import javax.servlet.*; +import jakarta.servlet.*; import java.io.IOException; import java.util.Enumeration; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java index 5ae5aae0..73f8d790 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/ServletLambdaContainerHandlerBuilderTest.java @@ -8,7 +8,7 @@ import com.amazonaws.services.lambda.runtime.Context; import org.junit.jupiter.api.Test; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; import static org.junit.jupiter.api.Assertions.*; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java index 11a018eb..fa6712c7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/filters/UrlPathValidatorTest.java @@ -1,17 +1,14 @@ package com.amazonaws.serverless.proxy.internal.servlet.filters; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.FilterHolder; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import org.junit.jupiter.api.Test; -import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; -import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 33bb8171..c955649d 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,11 +15,10 @@ 1.10-SNAPSHOT - 5.3.27 - 2.7.11 - 5.7.8 - 1.8 - 1.8 + 6.0.5 + 3.0.4 + 6.0.2 + 17 @@ -171,6 +170,11 @@ 1.1.1 test + + jakarta.activation + jakarta.activation-api + 2.1.0 + diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index ce6bad7b..1f7719e9 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -14,7 +14,6 @@ import com.amazonaws.serverless.exceptions.ContainerInitializationException; import com.amazonaws.serverless.proxy.*; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.internal.testutils.Timer; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; @@ -25,19 +24,14 @@ import com.amazonaws.services.lambda.runtime.Context; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.StandardEnvironment; -import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.Servlet; -import javax.servlet.ServletRegistration; -import javax.servlet.http.HttpServletRequest; + +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletRegistration; +import jakarta.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; /** diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java index b9894834..cdec1855 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -13,13 +13,11 @@ package com.amazonaws.serverless.proxy.spring; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import org.springframework.boot.WebApplicationType; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< RequestType, diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java index 9b2c0494..3376452e 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java @@ -22,7 +22,7 @@ import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; -import javax.servlet.*; +import jakarta.servlet.*; import java.io.IOException; import java.util.Enumeration; diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java index ad228f7d..fbc31145 100644 --- a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java +++ b/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -21,7 +21,7 @@ import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.core.Ordered; -import javax.servlet.ServletException; +import jakarta.servlet.ServletException; @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) public class ServerlessServletEmbeddedServerFactory implements ServletWebServerFactory, WebServer { diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java index e322e1a6..d0b57950 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java @@ -8,8 +8,8 @@ import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; import org.junit.jupiter.api.Test; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index f5e2e818..aacf5444 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -3,7 +3,6 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.serverless.proxy.spring.servletapp.*; @@ -11,8 +10,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java index 2fddcf0a..5ffd4a31 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -13,8 +13,8 @@ import org.springframework.boot.WebApplicationType; import org.springframework.boot.web.servlet.ServletContextInitializer; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; import static org.junit.jupiter.api.Assertions.fail; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index 6bd51632..927822a4 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.HashMap; import java.util.Map; diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java index e180c173..379291a3 100644 --- a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java +++ b/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java @@ -1,9 +1,9 @@ package com.amazonaws.serverless.proxy.spring.servletapp; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; public class UserData { @NotBlank From 9cf61f0ff285a5dc1432b95bc73facd470b4f26c Mon Sep 17 00:00:00 2001 From: Mbea Date: Sat, 1 Apr 2023 02:08:25 -0700 Subject: [PATCH 0588/1214] - Did the namespace change on the other components - Fixed 2 failing tests in AwsServletContextTest by adding version 2.0.0 of the angus-mail dependency --- aws-serverless-java-container-core/pom.xml | 6 ++++ .../internal/servlet/AwsServletContext.java | 4 ++- .../proxy/jersey/JerseyHandlerFilter.java | 22 ++++++------- .../jersey/JerseyLambdaContainerHandler.java | 15 +++++---- .../jersey/JerseyServletResponseWriter.java | 6 ++-- .../AwsProxyServletContextSupplier.java | 8 ++--- .../AwsProxyServletRequestSupplier.java | 4 +-- .../AwsProxyServletResponseSupplier.java | 4 +-- .../proxy/jersey/EchoJerseyResource.java | 31 +++++++------------ .../proxy/jersey/JerseyAwsProxyTest.java | 6 ++-- .../proxy/jersey/JerseyInjectionTest.java | 2 +- .../proxy/jersey/JerseyParamEncodingTest.java | 2 +- .../proxy/jersey/ResourceBinder.java | 2 +- .../providers/CustomExceptionMapper.java | 12 +++---- .../providers/ServletRequestFilter.java | 8 ++--- .../spark/SparkLambdaContainerHandler.java | 8 ++--- .../embeddedserver/LambdaEmbeddedServer.java | 2 +- .../spark/HelloWorldSparkStreamTest.java | 2 +- .../proxy/spark/HelloWorldSparkTest.java | 4 +-- .../SparkLambdaContainerHandlerTest.java | 4 +-- .../spark/filter/CustomHeaderFilter.java | 14 ++++----- .../spark/filter/UnauthenticatedFilter.java | 16 +++++----- .../spring/SpringLambdaContainerHandler.java | 6 ++-- .../spring/SpringProxyHandlerBuilder.java | 2 +- .../proxy/spring/SpringAwsProxyTest.java | 15 +++------ .../spring/SpringServletContextTest.java | 4 +-- .../proxy/spring/StaticAppProxyTest.java | 2 +- .../proxy/spring/echoapp/ContextResource.java | 14 ++++----- .../spring/echoapp/CustomHeaderFilter.java | 14 ++++----- .../proxy/spring/echoapp/EchoResource.java | 4 +-- .../spring/echoapp/EchoSpringAppConfig.java | 2 +- .../spring/echoapp/UnauthenticatedFilter.java | 16 +++++----- .../echoapp/model/ValidatedUserModel.java | 2 +- .../spring/extensibility/CustomServlet.java | 6 ++-- .../extensibility/CustomServletTest.java | 2 +- .../CustomSpringLambdaContainerHandler.java | 4 +-- .../struts/StrutsLambdaContainerHandler.java | 8 ++--- .../proxy/struts/StrutsAwsProxyTest.java | 2 +- .../proxy/struts/echoapp/EchoAction.java | 4 +-- .../struts/echoapp/EchoRequestInfoAction.java | 4 +-- .../src/main/java/resource/PingResource.java | 12 +++---- .../test/java/StreamLambdaHandlerTest.java | 8 ++--- .../test/java/StreamLambdaHandlerTest.java | 8 ++--- .../src/main/java/SpringApiConfig.java | 4 +-- .../test/java/StreamLambdaHandlerTest.java | 8 ++--- .../test/java/StreamLambdaHandlerTest.java | 8 ++--- .../test/java/StreamLambdaHandlerTest.java | 8 ++--- .../sample/jersey/PetsResource.java | 6 ++-- .../sample/spark/SparkResources.java | 2 +- .../sample/spark/StreamLambdaHandler.java | 4 +-- .../spark/filter/CognitoIdentityFilter.java | 12 +++---- .../spring/PetStoreSpringAppConfig.java | 4 +-- .../sample/spring/StreamLambdaHandler.java | 4 +-- .../spring/filter/CognitoIdentityFilter.java | 12 +++---- .../sample/springboot2/Application.java | 4 +-- .../springboot2/StreamLambdaHandler.java | 4 +-- .../filter/CognitoIdentityFilter.java | 12 +++---- 57 files changed, 203 insertions(+), 210 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 82135d77..7c2159d7 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -83,6 +83,12 @@ commons-fileupload2 2.0-SNAPSHOT + + org.eclipse.angus + angus-mail + 2.0.0 + + diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index a362dfc2..4531b14a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -17,13 +17,14 @@ import com.amazonaws.serverless.proxy.internal.SecurityUtils; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import jakarta.activation.spi.MimeTypeRegistryProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import jakarta.activation.MimetypesFileTypeMap; import jakarta.servlet.*; import jakarta.servlet.ServletContext; import jakarta.servlet.descriptor.JspConfigDescriptor; +import jakarta.activation.MimetypesFileTypeMap; import java.io.File; import java.io.InputStream; @@ -166,6 +167,7 @@ public String getMimeType(String s) { if (mimeTypes == null) { mimeTypes = new MimetypesFileTypeMap(); } + // TODO: The getContentType method of the MimetypesFileTypeMap returns application/octet-stream // instead of null when the type cannot be found. We should replace with an implementation that // loads the System mime types ($JAVA_HOME/lib/mime.types diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java index 27e3157f..79d030bd 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java @@ -26,17 +26,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.core.Application; -import javax.ws.rs.core.SecurityContext; -import javax.ws.rs.core.UriBuilder; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.core.Application; +import jakarta.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.UriBuilder; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index fe50cd0f..e290e284 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -30,14 +30,13 @@ import org.glassfish.jersey.process.internal.RequestScoped; import org.glassfish.jersey.server.ResourceConfig; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Application; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.Application; import java.util.EnumSet; import java.util.concurrent.CountDownLatch; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java index 938c6f9f..870390f8 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyServletResponseWriter.java @@ -22,9 +22,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.InternalServerErrorException; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.InternalServerErrorException; import java.io.IOException; import java.io.OutputStream; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java index 78f8c5c5..4d93a89a 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletContextSupplier.java @@ -15,10 +15,10 @@ import org.glassfish.jersey.server.ContainerRequest; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.InternalServerErrorException; -import javax.ws.rs.core.Context; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.InternalServerErrorException; +import jakarta.ws.rs.core.Context; import java.util.function.Supplier; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java index fe1b21f1..c3a4653b 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletRequestSupplier.java @@ -15,8 +15,8 @@ import org.glassfish.jersey.server.ContainerRequest; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Context; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Context; import java.util.function.Supplier; diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java index 1fb6dc17..d4123f22 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/suppliers/AwsProxyServletResponseSupplier.java @@ -15,8 +15,8 @@ import org.glassfish.jersey.server.ContainerRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.Context; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.Context; import java.util.function.Supplier; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java index 5da93ca0..d05c6814 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java @@ -13,41 +13,34 @@ package com.amazonaws.serverless.proxy.jersey; import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; import com.amazonaws.serverless.proxy.jersey.providers.ServletRequestFilter; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; import com.amazonaws.serverless.proxy.jersey.model.MapResponseModel; import com.amazonaws.serverless.proxy.jersey.model.SingleValueModel; -import org.apache.commons.io.IOUtils; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; import org.glassfish.jersey.media.multipart.FormDataParam; -import javax.inject.Inject; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.*; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.SecurityContext; -import javax.ws.rs.core.UriInfo; - -import java.io.ByteArrayInputStream; +import jakarta.inject.Inject; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.*; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.SecurityContext; +import jakarta.ws.rs.core.UriInfo; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; -import java.util.HashMap; import java.util.List; import java.util.Random; -import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY; - /** * Jersey application class for aws-serverless-java-container unit proxy diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index 17955532..b845a0b6 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -33,9 +33,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.util.Arrays; import java.util.Collection; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java index cfbe5c9b..e253f34a 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyInjectionTest.java @@ -15,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import javax.inject.Singleton; +import jakarta.inject.Singleton; import org.glassfish.jersey.internal.inject.AbstractBinder; import org.glassfish.jersey.media.multipart.MultiPartFeature; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 25bb26bd..9dc1ab32 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.io.UnsupportedEncodingException; diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java index e98ea805..f35bffd4 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/ResourceBinder.java @@ -2,7 +2,7 @@ import org.glassfish.jersey.internal.inject.AbstractBinder; -import javax.inject.Singleton; +import jakarta.inject.Singleton; public class ResourceBinder extends AbstractBinder { @Override diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java index e435aff9..61cddee1 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/CustomExceptionMapper.java @@ -1,11 +1,11 @@ package com.amazonaws.serverless.proxy.jersey.providers; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; @Provider @@ -16,7 +16,7 @@ public CustomExceptionMapper() { } @Inject - public javax.inject.Provider request; + public jakarta.inject.Provider request; @Override public Response toResponse(UnsupportedOperationException throwable) { diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java index 70d65a64..8ccfe488 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/providers/ServletRequestFilter.java @@ -1,10 +1,10 @@ package com.amazonaws.serverless.proxy.jersey.providers; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.core.Context; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.Context; import java.io.IOException; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java index 6b2168aa..9c1b4751 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java @@ -31,10 +31,10 @@ import spark.Spark; import spark.embeddedserver.EmbeddedServers; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.servlet.Servlet; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.Servlet; +import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java index fadca494..8d79c613 100644 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java @@ -25,7 +25,7 @@ import spark.ssl.SslStores; import spark.staticfiles.StaticFilesConfiguration; -import javax.servlet.Filter; +import jakarta.servlet.Filter; import java.util.Map; import java.util.Optional; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java index 56087ed6..33bc19f1 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java @@ -15,7 +15,7 @@ import org.junit.jupiter.params.provider.MethodSource; import spark.Spark; -import javax.servlet.http.Cookie; +import jakarta.servlet.http.Cookie; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java index 5402b6a9..b687784e 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java @@ -13,8 +13,8 @@ import org.junit.jupiter.params.provider.MethodSource; import spark.Spark; -import javax.servlet.http.Cookie; -import javax.ws.rs.core.HttpHeaders; +import jakarta.servlet.http.Cookie; +import jakarta.ws.rs.core.HttpHeaders; import java.util.Arrays; import java.util.Collection; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java index 52f2a538..a5c5e824 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java @@ -13,8 +13,8 @@ import org.junit.jupiter.api.Test; import spark.Spark; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; import java.util.EnumSet; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java index e3733f3a..8f4bc99a 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java @@ -1,13 +1,13 @@ package com.amazonaws.serverless.proxy.spark.filter; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java index 742072ca..efa41a2d 100644 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java +++ b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java @@ -1,14 +1,14 @@ package com.amazonaws.serverless.proxy.spark.filter; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 22f7c17c..5e56dba6 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -23,9 +23,9 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; -import javax.servlet.Servlet; -import javax.servlet.ServletRegistration; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletRegistration; +import jakarta.servlet.http.HttpServletRequest; import java.util.concurrent.CountDownLatch; diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java index b1f35c80..5614b94d 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringProxyHandlerBuilder.java @@ -18,7 +18,7 @@ import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; public class SpringProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< RequestType, diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 6c744f6b..1101efc8 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -21,19 +21,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.servlet.DispatcherServlet; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java index cfc39b84..11b6c7c5 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringServletContextTest.java @@ -17,8 +17,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; import java.util.EnumSet; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java index d2b74b26..9e828119 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/StaticAppProxyTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MediaType; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java index d5223756..8f7eaf2a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/ContextResource.java @@ -17,13 +17,13 @@ import org.springframework.web.context.ServletContextAware; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import javax.servlet.ServletContext; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java index ca003043..f6427db6 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/CustomHeaderFilter.java @@ -1,13 +1,13 @@ package com.amazonaws.serverless.proxy.spring.echoapp; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index ceb358be..cfcc9f87 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -15,8 +15,8 @@ import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.URI; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index a4d5f069..cf4aa495 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -24,7 +24,7 @@ public MockLambdaContext lambdaContext() { } @Bean - public javax.validation.Validator localValidatorFactoryBean() { + public jakarta.validation.Validator localValidatorFactoryBean() { return new LocalValidatorFactoryBean(); } } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java index ba16d905..ac88119e 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/UnauthenticatedFilter.java @@ -1,14 +1,14 @@ package com.amazonaws.serverless.proxy.spring.echoapp; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java index 56c157e8..1e5b83c3 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java @@ -3,7 +3,7 @@ import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotEmpty; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.Size; public class ValidatedUserModel { @NotEmpty diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java index 2b8604d3..5c344b4d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServlet.java @@ -2,9 +2,9 @@ import org.springframework.context.ApplicationContext; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class CustomServlet extends HttpServlet { diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java index dd3d3fd7..5959a811 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomServletTest.java @@ -4,7 +4,7 @@ import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; import org.junit.jupiter.api.Test; -import javax.ws.rs.HttpMethod; +import jakarta.ws.rs.HttpMethod; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java index 3ed87233..4e5fe278 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/extensibility/CustomSpringLambdaContainerHandler.java @@ -9,8 +9,8 @@ import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import org.springframework.web.context.ConfigurableWebApplicationContext; -import javax.servlet.ServletRegistration; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletRegistration; +import jakarta.servlet.http.HttpServletRequest; public class CustomSpringLambdaContainerHandler extends SpringLambdaContainerHandler { diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java index 09c460cf..257de488 100644 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java +++ b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java @@ -35,10 +35,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import javax.servlet.Servlet; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; +import jakarta.servlet.Servlet; +import jakarta.servlet.http.HttpServletRequest; import java.util.EnumSet; import java.util.concurrent.CountDownLatch; diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java index f4854724..6d7e2a37 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java @@ -28,7 +28,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java index d64a54ec..ad6c6318 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java @@ -4,8 +4,8 @@ import org.apache.commons.io.IOUtils; import org.apache.struts2.ServletActionContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java index 554156e9..e810f319 100644 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java +++ b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java @@ -5,8 +5,8 @@ import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletActionContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java index 137ed030..1c56254f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/resource/PingResource.java @@ -4,13 +4,13 @@ import java.util.Map; import java.util.HashMap; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Path("/ping") public class PingResource { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 3f232ebc..4a6b00b0 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -10,10 +10,10 @@ import org.junit.BeforeClass; import org.junit.Test; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 3f232ebc..4a6b00b0 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -10,10 +10,10 @@ import org.junit.BeforeClass; import org.junit.Test; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java index 0982c6b0..83926b5d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/main/java/SpringApiConfig.java @@ -11,8 +11,8 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import ${groupId}.controller.PingController; diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 3f232ebc..4a6b00b0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -10,10 +10,10 @@ import org.junit.BeforeClass; import org.junit.Test; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 3f232ebc..4a6b00b0 100644 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -10,10 +10,10 @@ import org.junit.BeforeClass; import org.junit.Test; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 12fc9fc0..fd63840b 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -12,10 +12,10 @@ import org.junit.BeforeClass; import org.junit.Test; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java index 2d92510d..c8ad7ebd 100644 --- a/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java +++ b/samples/jersey/pet-store/src/main/java/com/amazonaws/serverless/sample/jersey/PetsResource.java @@ -15,9 +15,9 @@ import com.amazonaws.serverless.sample.jersey.model.Pet; import com.amazonaws.serverless.sample.jersey.model.PetData; -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.util.UUID; @Path("/pets") diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java index 7731a70b..4794b7ae 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java @@ -5,7 +5,7 @@ import com.amazonaws.serverless.sample.spark.model.Pet; import com.amazonaws.serverless.sample.spark.model.PetData; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.core.Response; import java.util.UUID; diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java index 40ace9d3..e0249910 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java @@ -12,8 +12,8 @@ import spark.Spark; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; import java.io.IOException; import java.io.InputStream; diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java index 3b0f5dd1..e45370b0 100644 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java +++ b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java @@ -7,12 +7,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java index 81179933..5ac5403c 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetStoreSpringAppConfig.java @@ -22,8 +22,8 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; @Configuration diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java index 71fb94ce..07675b3f 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/StreamLambdaHandler.java @@ -10,8 +10,8 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; import java.io.IOException; import java.io.InputStream; diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java index d9eefdc9..ec4242b8 100644 --- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java +++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/filter/CognitoIdentityFilter.java @@ -7,12 +7,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java index d613fc07..aeb63a25 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java @@ -15,8 +15,8 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; @SpringBootApplication diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java index 01ea9663..6df4b5ed 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java @@ -10,8 +10,8 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; import java.io.IOException; import java.io.InputStream; diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java index 5c3482e4..1cc92708 100644 --- a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java +++ b/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java @@ -7,12 +7,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import java.io.IOException; From 4db2388bfa9e2b81e30a6b4759f5f25268264448 Mon Sep 17 00:00:00 2001 From: Mbea Date: Sat, 1 Apr 2023 02:33:40 -0700 Subject: [PATCH 0589/1214] Update jersey.version to 3.11 to fix issues in JerseyHandlerFilter --- aws-serverless-java-container-jersey/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ae894985..6842a0d7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 2.39.1 + 3.1.1 From 64721198723b63953f0430627d9c4370a53d6db0 Mon Sep 17 00:00:00 2001 From: Mbea Date: Sat, 1 Apr 2023 03:40:38 -0700 Subject: [PATCH 0590/1214] Upgrade jakarta.validation-api version to 3.0.2 to fix issue in UserData (cannot find symbol @NotBlank, @Email etc...) --- aws-serverless-java-container-springboot2/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index c955649d..7e27942d 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -149,7 +149,7 @@ jakarta.validation jakarta.validation-api - 2.0.2 + 3.0.2 test @@ -175,6 +175,12 @@ jakarta.activation-api 2.1.0 + + jakarta.validation + jakarta.validation-api + 3.0.2 + test + From 8017ce6018a3a2dd0df641c655c9874ea11c2041 Mon Sep 17 00:00:00 2001 From: Mbea Date: Tue, 4 Apr 2023 21:58:02 -0700 Subject: [PATCH 0591/1214] Added jakarta.websocket-api 2.0.0 to fix java.lang.ExceptionInInitializerError in SecurityAppTest - Updated hibernate-validator version to 8.0.0.FINAL to fix failing test in ServletAppTest (jakarta.validation not working) - Updated Spring-core version to 6.0.7 to fix CVSS error --- aws-serverless-java-container-core/pom.xml | 12 +++++++ .../pom.xml | 33 ++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7c2159d7..0f2c13c5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -99,10 +99,22 @@ + + + + + + +<<<<<<< HEAD org.apache.httpcomponents httpclient 4.5.14 +======= + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 +>>>>>>> 9d2d4d4 (Added jakarta.websocket-api 2.0.0 to fix java.lang.ExceptionInInitializerError in SecurityAppTest) test diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index 7e27942d..d98d44ca 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -15,7 +15,7 @@ 1.10-SNAPSHOT - 6.0.5 + 6.0.7 3.0.4 6.0.2 17 @@ -146,30 +146,25 @@ test - - jakarta.validation - jakarta.validation-api - 3.0.2 - test - org.hibernate.validator hibernate-validator - 6.2.1.Final + 8.0.0.Final test + org.junit.jupiter junit-jupiter test - - - javax.activation - activation - 1.1.1 - test - + + + + + + + jakarta.activation jakarta.activation-api @@ -181,6 +176,14 @@ 3.0.2 test + + + jakarta.websocket + jakarta.websocket-api + 2.0.0 + provided + + From 1b6254e8cbe463f4f1293ccb7c2f94c160456421 Mon Sep 17 00:00:00 2001 From: Mbea Date: Wed, 5 Apr 2023 12:46:16 -0700 Subject: [PATCH 0592/1214] - Added jakarta-activation-api 2.1.0, jakarta.el-api 5.0.1 and org.glassfish:jakarta.el 5.0.0-M1 in Spring component's pom.xml -Updated the CommonsMultipartResolver to StandardServletMultipartResolver --- aws-serverless-java-container-spring/pom.xml | 30 +++++++++++-------- .../proxy/spring/echoapp/EchoResource.java | 6 ++-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 444b95be..830c8002 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 5.3.27 - 5.7.8 + 6.0.7 + 6.0.2 @@ -60,18 +60,23 @@ + + + + + + - javax.activation - activation - 1.1.1 - test + jakarta.activation + jakarta.activation-api + 2.1.0 org.hibernate.validator hibernate-validator - 6.2.1.Final + 8.0.0.Final test @@ -81,18 +86,19 @@ - javax.el - javax.el-api - 3.0.0 + jakarta.el + jakarta.el-api + 5.0.1 test org.glassfish - javax.el - 3.0.0 + jakarta.el + 5.0.0-M1 test + org.springframework.security spring-security-config diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java index cfcc9f87..a6dd033a 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoResource.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartResolver; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.springframework.web.multipart.support.StandardServletMultipartResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import jakarta.servlet.ServletContext; @@ -42,8 +42,8 @@ public class EchoResource { @Bean public MultipartResolver multipartResolver() { - CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); - multipartResolver.setMaxUploadSize(1000000); + MultipartResolver multipartResolver = new StandardServletMultipartResolver(); + //multipartResolver.setMaxUploadSize(1000000); return multipartResolver; } From 3abb8fc4db9dbf073b8c6def6b1f0238b71f5d74 Mon Sep 17 00:00:00 2001 From: Mbea Date: Wed, 5 Apr 2023 13:51:43 -0700 Subject: [PATCH 0593/1214] - added jakarta.ws.rs-api 3.1.0 to pom.xml in Jersey component to fix tests failing in JerseyAwsProxyTest class with error (java.lang.NoClassDefFoundError: jakarta/ws/rs/core/EntityPart) --- aws-serverless-java-container-jersey/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 6842a0d7..ef4a4371 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -105,6 +105,13 @@ junit-jupiter test + + + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 + + From 43179c08ba1664b628a87da065a517dba45b8296 Mon Sep 17 00:00:00 2001 From: Mbea Date: Thu, 6 Apr 2023 01:37:21 -0700 Subject: [PATCH 0594/1214] - excluded Spark and struts modules from the build - updated dependencies versions in Jersey, Spring and SpringBoot archetypes --- .../resources/archetype-resources/pom.xml | 3 +- .../resources/archetype-resources/pom.xml | 2 +- aws-serverless-springboot2-archetype/pom.xml | 80 --------- .../META-INF/maven/archetype-metadata.xml | 39 ----- .../resources/archetype-resources/README.md | 99 ----------- .../archetype-resources/build.gradle | 29 ---- .../resources/archetype-resources/pom.xml | 155 ------------------ .../archetype-resources/src/assembly/bin.xml | 27 --- .../src/main/java/Application.java | 24 --- .../src/main/java/StreamLambdaHandler.java | 39 ----- .../main/java/controller/PingController.java | 20 --- .../src/main/resources/application.properties | 3 - .../test/java/StreamLambdaHandlerTest.java | 90 ---------- .../archetype-resources/template.yml | 52 ------ .../projects/base/archetype.properties | 3 - .../src/test/resources/projects/base/goal.txt | 1 - pom.xml | 8 +- 17 files changed, 7 insertions(+), 667 deletions(-) delete mode 100644 aws-serverless-springboot2-archetype/pom.xml delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java delete mode 100644 aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml delete mode 100644 aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties delete mode 100644 aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 1783f79a..57dfdd6d 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -14,7 +14,8 @@ 1.8 1.8 - 2.39.1 + + 3.1.1 2.15.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 3fbd5126..85e071a0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 5.3.27 + 6.0.7 4.13.2 2.19.0 diff --git a/aws-serverless-springboot2-archetype/pom.xml b/aws-serverless-springboot2-archetype/pom.xml deleted file mode 100644 index 1e7279db..00000000 --- a/aws-serverless-springboot2-archetype/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - 4.0.0 - - - com.amazonaws.serverless - aws-serverless-java-container - 1.10-SNAPSHOT - - - com.amazonaws.serverless.archetypes - aws-serverless-springboot2-archetype - 1.10-SNAPSHOT - maven-archetype - - - https://github.com/awslabs/aws-serverless-java-container.git - HEAD - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - - src/main/resources - true - - archetype-resources/pom.xml - archetype-resources/README.md - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.0.1 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - \ - - - - org.apache.maven.plugins - maven-archetype-plugin - 3.0.1 - - - - integration-test - - - - - - - - diff --git a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index 5379692b..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - src/main/java - - **/*.java - - - - src/main/resources - - **/*.properties - - - - src/test/java - - **/*.java - - - - src/assembly - - * - - - - - - template.yml - README.md - build.gradle - - - - \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md deleted file mode 100644 index 1017a83a..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/README.md +++ /dev/null @@ -1,99 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). - -The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. - -The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). - -#[[##]]# Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -#[[##]]# Building the project -You can use the SAM CLI to quickly build the project -```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false -$ cd \${artifactId} -$ sam build -Building resource '\${resourceName}Function' -Running JavaGradleWorkflow:GradleBuild -Running JavaGradleWorkflow:CopyArtifacts - -Build Succeeded - -Built Artifacts : .aws-sam/build -Built Template : .aws-sam/build/template.yaml - -Commands you can use next -========================= -[*] Invoke Function: sam local invoke -[*] Deploy: sam deploy --guided -``` - -#[[##]]# Testing locally with the SAM CLI - -From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. - -```bash -$ sam local start-api - -... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] -... -``` - -Using a new shell, you can send a test ping request to your API: - -```bash -$ curl -s http://127.0.0.1:3000/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` - -#[[##]]# Deploying to AWS -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... -------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------- -\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets -------------------------------------------------------------------------------------------------------------- -``` - -Copy the `OutputValue` into a browser or use curl to test your first request: - -```bash -$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle deleted file mode 100644 index d6946e7f..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'java' - -repositories { - jcenter() - mavenLocal() - mavenCentral() -} - -dependencies { - implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.11', - 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', - 'io.symphonia:lambda-logging:1.0.3' - ) - - testImplementation("junit:junit:4.13.2") -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -build.dependsOn buildZip diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index 53404bdb..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,155 +0,0 @@ -#set($dollar = '$') - - - 4.0.0 - - \${groupId} - \${artifactId} - \${version} - jar - - Serverless Spring Boot 2 API - https://github.com/awslabs/aws-serverless-java-container - - - org.springframework.boot - spring-boot-starter-parent - 2.7.11 - - - - 1.8 - 1.8 - - - - - com.amazonaws.serverless - aws-serverless-java-container-springboot2 - ${project.version} - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - junit - junit - 4.12 - test - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.0.0-M1 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.2.0 - - - copy-dependencies - package - - copy-dependencies - - - ${dollar}{project.build.directory}${dollar}{file.separator}lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.3.0 - - - zip-assembly - package - - single - - - ${dollar}{project.artifactId}-${dollar}{project.version} - - src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml - - false - - - - - - - - - diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java deleted file mode 100644 index 1b74086f..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/Application.java +++ /dev/null @@ -1,24 +0,0 @@ -#macro(loggingOff) - logging.level.root:OFF -#end -#set($logging = "#loggingOff()") -#set($logging = $logging.replaceAll("\n", "").trim()) -package ${groupId}; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; - -import ${groupId}.controller.PingController; - - -@SpringBootApplication -// We use direct @Import instead of @ComponentScan to speed up cold starts -// @ComponentScan(basePackages = "${groupId}.controller") -@Import({ PingController.class }) -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java deleted file mode 100644 index dca9650d..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - // For applications that take longer than 10 seconds to start, use the async builder: - // handler = new SpringBootProxyHandlerBuilder() - // .defaultProxy() - // .asyncInit() - // .springBootApplication(Application.class) - // .buildAndInitialize(); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java deleted file mode 100644 index 94f517f0..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java +++ /dev/null @@ -1,20 +0,0 @@ -package ${groupId}.controller; - - -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.util.HashMap; -import java.util.Map; - - -@RestController -@EnableWebMvc -public class PingController { - @RequestMapping(path = "/ping", method = RequestMethod.GET) - public Map ping() { - Map pong = new HashMap<>(); - pong.put("pong", "Hello, World!"); - return pong; - } -} diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties deleted file mode 100644 index ec1cb979..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Reduce logging level to make sure the application works with SAM local -# https://github.com/awslabs/aws-serverless-java-container/issues/134 -logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java deleted file mode 100644 index 4a6b00b0..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import org.junit.BeforeClass; -import org.junit.Test; - -import jakarta.ws.rs.HttpMethod; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.Assert.*; - - -public class StreamLambdaHandlerTest { - - private static StreamLambdaHandler handler; - private static Context lambdaContext; - - @BeforeClass - public static void setUp() { - handler = new StreamLambdaHandler(); - lambdaContext = new MockLambdaContext(); - } - - @Test - public void ping_streamRequest_respondsWithHello() { - InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); - - assertFalse(response.isBase64Encoded()); - - assertTrue(response.getBody().contains("pong")); - assertTrue(response.getBody().contains("Hello, World!")); - - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); - } - - @Test - public void invalidResource_streamRequest_responds404() { - InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); - } - - private void handle(InputStream is, ByteArrayOutputStream os) { - try { - handler.handleRequest(is, os, lambdaContext); - } catch (IOException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { - try { - return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { - e.printStackTrace(); - fail("Error while parsing response: " + e.getMessage()); - } - return null; - } -} diff --git a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml deleted file mode 100644 index 8d8e0946..00000000 --- a/aws-serverless-springboot2-archetype/src/main/resources/archetype-resources/template.yml +++ /dev/null @@ -1,52 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -#macro(regionVar) - AWS::Region -#end -#set($awsRegion = "#regionVar()") -#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Spring Boot 2 API - ${groupId}::${artifactId} -Globals: - Api: - EndpointConfiguration: REGIONAL - -Resources: - ${resourceName}Function: - Type: AWS::Serverless::Function - Properties: - Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java11 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Events: - ProxyResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - ${resourceName}Api: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' - Export: - Name: ${resourceName}Api diff --git a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties deleted file mode 100644 index 7df3bf6e..00000000 --- a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/archetype.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=test.service -artifactId=springboot-archetype-test -version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt deleted file mode 100644 index 597acc76..00000000 --- a/aws-serverless-springboot2-archetype/src/test/resources/projects/base/goal.txt +++ /dev/null @@ -1 +0,0 @@ -package \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3bf6fbf0..babeeb89 100644 --- a/pom.xml +++ b/pom.xml @@ -27,13 +27,13 @@ aws-serverless-java-container-core aws-serverless-java-container-jersey - aws-serverless-java-container-spark + aws-serverless-java-container-spring - aws-serverless-java-container-struts + aws-serverless-java-container-springboot2 - aws-serverless-struts-archetype + aws-serverless-jersey-archetype - aws-serverless-spark-archetype + aws-serverless-spring-archetype aws-serverless-springboot2-archetype From 7639de8eabb5bd26b15402e94e9f7ff338a17f1f Mon Sep 17 00:00:00 2001 From: Mbea Date: Thu, 6 Apr 2023 01:58:50 -0700 Subject: [PATCH 0595/1214] chore: removed unnecessary comments --- aws-serverless-java-container-core/pom.xml | 15 --------------- aws-serverless-java-container-spring/pom.xml | 7 ------- aws-serverless-java-container-springboot2/pom.xml | 11 ++--------- pom.xml | 4 ---- 4 files changed, 2 insertions(+), 35 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0f2c13c5..32ff479c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -71,13 +71,6 @@ ${jackson.version} - - - org.apache.commons commons-fileupload2 @@ -89,7 +82,6 @@ 2.0.0 - org.apache.httpcomponents @@ -98,13 +90,6 @@ compile - - - - - - - <<<<<<< HEAD org.apache.httpcomponents diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 830c8002..28611799 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -59,13 +59,6 @@ test - - - - - - - jakarta.activation jakarta.activation-api diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot2/pom.xml index d98d44ca..dddbf552 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot2/pom.xml @@ -28,7 +28,6 @@ aws-serverless-java-container-core 1.10-SNAPSHOT - org.springframework spring-webflux @@ -158,13 +157,7 @@ junit-jupiter test - - - - - - - + jakarta.activation jakarta.activation-api @@ -176,7 +169,7 @@ 3.0.2 test - + jakarta.websocket jakarta.websocket-api diff --git a/pom.xml b/pom.xml index babeeb89..b3439903 100644 --- a/pom.xml +++ b/pom.xml @@ -27,13 +27,9 @@ aws-serverless-java-container-core aws-serverless-java-container-jersey - aws-serverless-java-container-spring - aws-serverless-java-container-springboot2 - aws-serverless-jersey-archetype - aws-serverless-spring-archetype aws-serverless-springboot2-archetype From 51642dc16b0204dfb67773fb622934e931bdf2fa Mon Sep 17 00:00:00 2001 From: Mbea Date: Thu, 6 Apr 2023 09:58:08 -0700 Subject: [PATCH 0596/1214] Renamed springboot2 directory and module to springboot3 --- .../pom.xml | 2 +- .../proxy/spring/SpringBootLambdaContainerHandler.java | 0 .../serverless/proxy/spring/SpringBootProxyHandlerBuilder.java | 0 .../ServerlessReactiveServletEmbeddedServerFactory.java | 0 .../spring/embedded/ServerlessServletEmbeddedServerFactory.java | 0 .../com/amazonaws/serverless/proxy/spring/SecurityAppTest.java | 0 .../com/amazonaws/serverless/proxy/spring/ServletAppTest.java | 0 .../java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java | 0 .../com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java | 0 .../embedded/ServerlessServletEmbeddedServerFactoryTest.java | 0 .../serverless/proxy/spring/securityapp/LambdaHandler.java | 0 .../serverless/proxy/spring/securityapp/MessageController.java | 0 .../proxy/spring/securityapp/SecurityApplication.java | 0 .../serverless/proxy/spring/securityapp/SecurityConfig.java | 0 .../serverless/proxy/spring/servletapp/LambdaHandler.java | 0 .../serverless/proxy/spring/servletapp/LambdaStreamHandler.java | 0 .../serverless/proxy/spring/servletapp/MessageController.java | 0 .../serverless/proxy/spring/servletapp/MessageData.java | 0 .../serverless/proxy/spring/servletapp/ServletApplication.java | 0 .../amazonaws/serverless/proxy/spring/servletapp/UserData.java | 0 .../serverless/proxy/spring/slowapp/LambdaHandler.java | 0 .../serverless/proxy/spring/slowapp/MessageController.java | 0 .../serverless/proxy/spring/slowapp/SlowTestApplication.java | 0 .../serverless/proxy/spring/webfluxapp/LambdaHandler.java | 0 .../serverless/proxy/spring/webfluxapp/MessageController.java | 0 .../serverless/proxy/spring/webfluxapp/MessageData.java | 0 .../proxy/spring/webfluxapp/WebFluxTestApplication.java | 0 pom.xml | 2 +- 28 files changed, 2 insertions(+), 2 deletions(-) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/pom.xml (99%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java (100%) rename {aws-serverless-java-container-springboot2 => aws-serverless-java-container-springboot3}/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java (100%) diff --git a/aws-serverless-java-container-springboot2/pom.xml b/aws-serverless-java-container-springboot3/pom.xml similarity index 99% rename from aws-serverless-java-container-springboot2/pom.xml rename to aws-serverless-java-container-springboot3/pom.xml index dddbf552..6f6679a1 100644 --- a/aws-serverless-java-container-springboot2/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -8,7 +8,7 @@ 4.0.0 com.amazonaws.serverless - aws-serverless-java-container-springboot2 + aws-serverless-java-container-springboot3 AWS Serverless Java container support - SpringBoot 2 implementation Allows Java applications written for SpringBoot 2 to run in AWS Lambda https://aws.amazon.com/lambda diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java diff --git a/aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java diff --git a/aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java similarity index 100% rename from aws-serverless-java-container-springboot2/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java diff --git a/pom.xml b/pom.xml index b3439903..cbcfda7f 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ aws-serverless-java-container-core aws-serverless-java-container-jersey aws-serverless-java-container-spring - aws-serverless-java-container-springboot2 + aws-serverless-java-container-springboot3 aws-serverless-jersey-archetype aws-serverless-spring-archetype aws-serverless-springboot2-archetype From dbdb614b167073c63834ed3f68db137c8578bde6 Mon Sep 17 00:00:00 2001 From: Mbea Date: Tue, 11 Apr 2023 10:22:15 -0700 Subject: [PATCH 0597/1214] fix: updated name and description in SpringBoot3 component pom.xml --- .../pom.xml | 4 +- aws-serverless-springboot3-archetype/pom.xml | 80 +++++++++ .../META-INF/maven/archetype-metadata.xml | 39 +++++ .../resources/archetype-resources/README.md | 99 +++++++++++ .../archetype-resources/build.gradle | 29 ++++ .../resources/archetype-resources/pom.xml | 155 ++++++++++++++++++ .../archetype-resources/src/assembly/bin.xml | 27 +++ .../src/main/java/Application.java | 24 +++ .../src/main/java/StreamLambdaHandler.java | 39 +++++ .../main/java/controller/PingController.java | 20 +++ .../src/main/resources/application.properties | 3 + .../test/java/StreamLambdaHandlerTest.java | 90 ++++++++++ .../archetype-resources/template.yml | 52 ++++++ .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + pom.xml | 2 +- 16 files changed, 664 insertions(+), 3 deletions(-) create mode 100644 aws-serverless-springboot3-archetype/pom.xml create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java create mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml create mode 100644 aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 6f6679a1..e810ecdf 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -9,8 +9,8 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - AWS Serverless Java container support - SpringBoot 2 implementation - Allows Java applications written for SpringBoot 2 to run in AWS Lambda + AWS Serverless Java container support - SpringBoot 3 implementation + Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda 1.10-SNAPSHOT diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml new file mode 100644 index 00000000..4003610a --- /dev/null +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -0,0 +1,80 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 1.10-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-springboot3-archetype + 1.10-SNAPSHOT + maven-archetype + + + https://github.com/awslabs/aws-serverless-java-container.git + HEAD + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + src/main/resources + true + + archetype-resources/pom.xml + archetype-resources/README.md + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.0.1 + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.1.0 + + \ + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.0.1 + + + + integration-test + + + + + + + + diff --git a/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..5379692b --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,39 @@ + + + + src/main/java + + **/*.java + + + + src/main/resources + + **/*.properties + + + + src/test/java + + **/*.java + + + + src/assembly + + * + + + + + + template.yml + README.md + build.gradle + + + + \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..1017a83a --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md @@ -0,0 +1,99 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). + +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project +```bash +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts + +Build Succeeded + +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml + +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided +``` + +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. + +```bash +$ sam local start-api + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL + +``` +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..36a13b5d --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'java' + +repositories { + jcenter() + mavenLocal() + mavenCentral() +} + +dependencies { + implementation ( + 'org.springframework.boot:spring-boot-starter-web:2.7.10', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', + 'io.symphonia:lambda-logging:1.0.3' + ) + + testImplementation("junit:junit:4.13.2") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..1489ddf2 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,155 @@ +#set($dollar = '$') + + + 4.0.0 + + \${groupId} + \${artifactId} + \${version} + jar + + Serverless Spring Boot 2 API + https://github.com/awslabs/aws-serverless-java-container + + + org.springframework.boot + spring-boot-starter-parent + 3.0.4 + + + + 1.8 + 1.8 + + + + + com.amazonaws.serverless + aws-serverless-java-container-springboot2 + ${project.version} + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + junit + junit + 4.12 + test + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.2.0 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + + diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java new file mode 100644 index 00000000..1b74086f --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java @@ -0,0 +1,24 @@ +#macro(loggingOff) + logging.level.root:OFF +#end +#set($logging = "#loggingOff()") +#set($logging = $logging.replaceAll("\n", "").trim()) +package ${groupId}; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; + +import ${groupId}.controller.PingController; + + +@SpringBootApplication +// We use direct @Import instead of @ComponentScan to speed up cold starts +// @ComponentScan(basePackages = "${groupId}.controller") +@Import({ PingController.class }) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..dca9650d --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,39 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + // For applications that take longer than 10 seconds to start, use the async builder: + // handler = new SpringBootProxyHandlerBuilder() + // .defaultProxy() + // .asyncInit() + // .springBootApplication(Application.class) + // .buildAndInitialize(); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java new file mode 100644 index 00000000..94f517f0 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java @@ -0,0 +1,20 @@ +package ${groupId}.controller; + + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@EnableWebMvc +public class PingController { + @RequestMapping(path = "/ping", method = RequestMethod.GET) + public Map ping() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return pong; + } +} diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties new file mode 100644 index 00000000..ec1cb979 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# Reduce logging level to make sure the application works with SAM local +# https://github.com/awslabs/aws-serverless-java-container/issues/134 +logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..4a6b00b0 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,90 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.BeforeClass; +import org.junit.Test; + +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.Assert.*; + + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeClass + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (IOException e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml new file mode 100644 index 00000000..8d8e0946 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml @@ -0,0 +1,52 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spring Boot 2 API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java11 + CodeUri: . + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + ProxyResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..7df3bf6e --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=springboot-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/pom.xml b/pom.xml index cbcfda7f..08627db2 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ aws-serverless-java-container-springboot3 aws-serverless-jersey-archetype aws-serverless-spring-archetype - aws-serverless-springboot2-archetype + aws-serverless-springboot3-archetype From 578e3d7778248a9b176d50f9d4e6cb991c309842 Mon Sep 17 00:00:00 2001 From: Mbea Date: Fri, 14 Apr 2023 10:43:57 -0700 Subject: [PATCH 0598/1214] - Updated the pet-store samples - Updated some dependencies versions --- aws-serverless-java-container-core/pom.xml | 22 +++++++------------ .../internal/servlet/AwsServletContext.java | 18 +++++++-------- aws-serverless-java-container-spring/pom.xml | 7 +++--- .../pom.xml | 2 +- .../resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 4 ++-- samples/quarkus/pet-store/pom.xml | 4 ++-- samples/spring/pet-store/pom.xml | 7 +++--- samples/spring/pet-store/template.yml | 2 +- .../pet-store/README.md | 0 .../pet-store/build.gradle | 0 .../pet-store/pom.xml | 11 +++++----- .../pet-store/src/assembly/bin.xml | 0 .../sample/springboot3}/Application.java | 0 .../springboot3}/StreamLambdaHandler.java | 0 .../controller/PetsController.java | 0 .../filter/CognitoIdentityFilter.java | 0 .../sample/springboot3}/model/Error.java | 0 .../sample/springboot3}/model/Pet.java | 0 .../sample/springboot3}/model/PetData.java | 0 .../pet-store/src/main/resources/logback.xml | 0 .../pet-store/template.yml | 4 ++-- 22 files changed, 38 insertions(+), 45 deletions(-) rename samples/{springboot2 => springboot3}/pet-store/README.md (100%) rename samples/{springboot2 => springboot3}/pet-store/build.gradle (100%) rename samples/{springboot2 => springboot3}/pet-store/pom.xml (96%) rename samples/{springboot2 => springboot3}/pet-store/src/assembly/bin.xml (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/Application.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/StreamLambdaHandler.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/controller/PetsController.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/filter/CognitoIdentityFilter.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/model/Error.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/model/Pet.java (100%) rename samples/{springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2 => springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3}/model/PetData.java (100%) rename samples/{springboot2 => springboot3}/pet-store/src/main/resources/logback.xml (100%) rename samples/{springboot2 => springboot3}/pet-store/template.yml (90%) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 32ff479c..0f0bf951 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -16,7 +16,7 @@ - 2.1.1 + 3.1.0 5.0.0 @@ -47,14 +47,14 @@ jakarta.servlet jakarta.servlet-api - 5.0.0 + ${servlet.version} jakarta.ws.rs jakarta.ws.rs-api - 3.0.0-M1 + ${jaxrs.version} @@ -79,7 +79,7 @@ org.eclipse.angus angus-mail - 2.0.0 + 2.0.1 @@ -91,15 +91,9 @@ -<<<<<<< HEAD - org.apache.httpcomponents - httpclient - 4.5.14 -======= org.apache.httpcomponents.client5 httpclient5 5.2.1 ->>>>>>> 9d2d4d4 (Added jakarta.websocket-api 2.0.0 to fix java.lang.ExceptionInInitializerError in SecurityAppTest) test @@ -118,9 +112,9 @@ test - org.apache.httpcomponents - httpcore - 4.4.16 + org.apache.httpcomponents.core5 + httpcore5 + 5.2.1 compile true @@ -134,7 +128,7 @@ jakarta.activation jakarta.activation-api - 2.1.0 + 2.1.1 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 4531b14a..e1688c9f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -46,8 +46,8 @@ public class AwsServletContext //------------------------------------------------------------- // Constants - Public // ------------------------------------------------------------- - public static final int SERVLET_API_MAJOR_VERSION = 3; - public static final int SERVLET_API_MINOR_VERSION = 1; + public static final int SERVLET_API_MAJOR_VERSION = 5; + public static final int SERVLET_API_MINOR_VERSION = 0; public static final String SERVER_INFO = LambdaContainerHandler.SERVER_INFO + "/" + SERVLET_API_MAJOR_VERSION + "." + SERVLET_API_MINOR_VERSION; @@ -98,32 +98,32 @@ public String getContextPath() { @Override public void setResponseCharacterEncoding(String encoding) { - // do nothing; + throw new UnsupportedOperationException(); } @Override public String getResponseCharacterEncoding() { - return ""; + return null; } @Override public void setRequestCharacterEncoding(String encoding) { - // do nothing; + throw new UnsupportedOperationException(); } @Override public String getRequestCharacterEncoding() { - return ""; + return null; } @Override public void setSessionTimeout(int sessionTimeout) { - // do nothing; + throw new UnsupportedOperationException(); } @Override public int getSessionTimeout() { - return 1; + return 15; } @@ -379,7 +379,7 @@ public ServletRegistration.Dynamic addServlet(String s, Class @Override public ServletRegistration.Dynamic addJspFile(String s, String s1) { - return null; + throw new UnsupportedOperationException(); } diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 28611799..f1ae95db 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -63,6 +63,7 @@ jakarta.activation jakarta.activation-api 2.1.0 + test @@ -86,9 +87,9 @@ - org.glassfish - jakarta.el - 5.0.0-M1 + org.glassfish.expressly + expressly + 5.0.0 test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index e810ecdf..08856cf5 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -16,7 +16,7 @@ 6.0.7 - 3.0.4 + 3.0.5 6.0.2 17 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 1489ddf2..edb82190 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.4 + 3.0.5 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index f6b5bed4..2f0b8f56 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,8 +26,8 @@ 1.8 1.8 - 2.39.1 - 2.15.0 + 3.1.1 + 2.14.2 diff --git a/samples/quarkus/pet-store/pom.xml b/samples/quarkus/pet-store/pom.xml index 0147be88..5484ffad 100644 --- a/samples/quarkus/pet-store/pom.xml +++ b/samples/quarkus/pet-store/pom.xml @@ -8,8 +8,8 @@ 3.8.1 true - 1.8 - 1.8 + 17.0.6 + 17.0.6 UTF-8 UTF-8 1.0.1.Final diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 73cf9dc1..0b85ff94 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,9 +24,8 @@ - 1.8 - 1.8 - 5.3.27 + 17 + 6.0.7 4.13.2 2.19.0 @@ -35,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - [1.9,) + [2.0,) diff --git a/samples/spring/pet-store/template.yml b/samples/spring/pet-store/template.yml index c485cf4c..5a029f8a 100644 --- a/samples/spring/pet-store/template.yml +++ b/samples/spring/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.spring.StreamLambdaHandler::handleRequest - Runtime: java11 + Runtime: java17 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/springboot2/pet-store/README.md b/samples/springboot3/pet-store/README.md similarity index 100% rename from samples/springboot2/pet-store/README.md rename to samples/springboot3/pet-store/README.md diff --git a/samples/springboot2/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle similarity index 100% rename from samples/springboot2/pet-store/build.gradle rename to samples/springboot3/pet-store/build.gradle diff --git a/samples/springboot2/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml similarity index 96% rename from samples/springboot2/pet-store/pom.xml rename to samples/springboot3/pet-store/pom.xml index 534d565d..dc1dcc36 100644 --- a/samples/springboot2/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.amazonaws.serverless.sample - serverless-springboot2-example + serverless-springboot3-example 1.0-SNAPSHOT Spring Boot example for the aws-serverless-java-container library Simple pet store written with the Spring framework and Spring Boot @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.11 + 3.0.5 @@ -25,8 +25,7 @@ - 1.8 - 1.8 + 17 @@ -43,8 +42,8 @@ com.amazonaws.serverless - aws-serverless-java-container-springboot2 - [1.6,) + aws-serverless-java-container-springboot3 + [2.0,) diff --git a/samples/springboot2/pet-store/src/assembly/bin.xml b/samples/springboot3/pet-store/src/assembly/bin.xml similarity index 100% rename from samples/springboot2/pet-store/src/assembly/bin.xml rename to samples/springboot3/pet-store/src/assembly/bin.xml diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/Application.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/StreamLambdaHandler.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/controller/PetsController.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/filter/CognitoIdentityFilter.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Error.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/Pet.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java diff --git a/samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java similarity index 100% rename from samples/springboot2/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot2/model/PetData.java rename to samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java diff --git a/samples/springboot2/pet-store/src/main/resources/logback.xml b/samples/springboot3/pet-store/src/main/resources/logback.xml similarity index 100% rename from samples/springboot2/pet-store/src/main/resources/logback.xml rename to samples/springboot3/pet-store/src/main/resources/logback.xml diff --git a/samples/springboot2/pet-store/template.yml b/samples/springboot3/pet-store/template.yml similarity index 90% rename from samples/springboot2/pet-store/template.yml rename to samples/springboot3/pet-store/template.yml index c7a17276..ec78e3eb 100644 --- a/samples/springboot2/pet-store/template.yml +++ b/samples/springboot3/pet-store/template.yml @@ -11,8 +11,8 @@ Resources: PetStoreFunction: Type: AWS::Serverless::Function Properties: - Handler: com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler::handleRequest - Runtime: java11 + Handler: com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler::handleRequest + Runtime: java17 CodeUri: . MemorySize: 1512 Policies: AWSLambdaBasicExecutionRole From d41e9c5ad9dbcb502bdc43cccb630b89c0f7a3d3 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 17 Apr 2023 00:49:15 -0700 Subject: [PATCH 0599/1214] - moved to Servlet 6.0.0 - updated build.gradle files to be aligned to the Maven poms - moved all poms to 2.0-SNAPSHOT --- aws-serverless-java-container-core/pom.xml | 6 ++-- .../AwsHttpApiV2ProxyHttpServletRequest.java | 21 +++++++---- .../servlet/AwsHttpServletRequest.java | 1 - .../servlet/AwsHttpServletRequestWrapper.java | 25 +++++++------ .../servlet/AwsHttpServletResponse.java | 36 +++++++++---------- .../internal/servlet/AwsHttpSession.java | 31 ---------------- .../servlet/AwsProxyRequestDispatcher.java | 6 +--- .../internal/servlet/AwsServletContext.java | 35 +----------------- .../servlet/AwsFilterChainManagerTest.java | 4 +-- .../internal/servlet/AwsHttpSessionTest.java | 28 --------------- .../servlet/AwsServletContextTest.java | 5 ++- aws-serverless-java-container-jersey/pom.xml | 6 ++-- aws-serverless-java-container-spring/pom.xml | 8 ++--- .../pom.xml | 8 ++--- aws-serverless-jersey-archetype/pom.xml | 4 +-- aws-serverless-spring-archetype/pom.xml | 4 +-- aws-serverless-springboot3-archetype/pom.xml | 4 +-- .../resources/archetype-resources/pom.xml | 7 ++-- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 8 ++--- samples/jersey/pet-store/pom.xml | 4 +-- samples/micronaut/pet-store/build.gradle | 10 +++--- samples/quarkus/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 ++-- samples/spring/pet-store/pom.xml | 5 +-- samples/springboot3/pet-store/build.gradle | 4 +-- samples/springboot3/pet-store/pom.xml | 2 +- 27 files changed, 99 insertions(+), 183 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0f0bf951..645916e7 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,18 +6,18 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT .. 3.1.0 - 5.0.0 + 6.0.0 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index d81105bd..85c8d8c1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -428,12 +428,6 @@ public RequestDispatcher getRequestDispatcher(String s) { return getServletContext().getRequestDispatcher(s); } - @Override - public String getRealPath(String s) { - // we are in an archive on a remote server - return null; - } - @Override public int getRemotePort() { return 0; @@ -480,6 +474,21 @@ public AsyncContext getAsyncContext() { return asyncContext; } + @Override + public String getRequestId() { + return null; + } + + @Override + public String getProtocolRequestId() { + return null; + } + + @Override + public ServletConnection getServletConnection() { + return null; + } + private MultiValuedTreeMap parseRawQueryString(String qs) { if (qs == null || "".equals(qs.trim())) { return new MultiValuedTreeMap<>(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 358ccdfb..99b2782c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -179,7 +179,6 @@ public boolean isRequestedSessionIdFromURL() { return false; } - //------------------------------------------------------------- // Implementation - ServletRequest //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java index d87b707e..00c7d77d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -177,11 +177,6 @@ public boolean isRequestedSessionIdFromURL() { return originalRequest.isRequestedSessionIdFromURL(); } - @Override - public boolean isRequestedSessionIdFromUrl() { - return originalRequest.isRequestedSessionIdFromUrl(); - } - @Override public boolean authenticate(HttpServletResponse httpServletResponse) throws IOException, ServletException { return originalRequest.authenticate(httpServletResponse); @@ -343,11 +338,6 @@ public RequestDispatcher getRequestDispatcher(String s) { return originalRequest.getRequestDispatcher(s); } - @Override - public String getRealPath(String s) { - return originalRequest.getRealPath(s); - } - @Override public int getRemotePort() { return originalRequest.getRemotePort(); @@ -402,4 +392,19 @@ public AsyncContext getAsyncContext() { public DispatcherType getDispatcherType() { return originalRequest.getDispatcherType(); } + + @Override + public String getRequestId() { + return null; + } + + @Override + public String getProtocolRequestId() { + return null; + } + + @Override + public ServletConnection getServletConnection() { + return null; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 814958df..e325b50d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -152,24 +152,24 @@ public String encodeRedirectURL(String s) { } - @Override - @Deprecated - public String encodeUrl(String s) { - return this.encodeURL(s); - } +// @Override +// @Deprecated +// public String encodeUrl(String s) { +// return this.encodeURL(s); +// } - @Override - @Deprecated - public String encodeRedirectUrl(String s) { - return this.encodeRedirectURL(s); - } +// @Override +// @Deprecated +// public String encodeRedirectUrl(String s) { +// return this.encodeRedirectURL(s); +// } @Override public void sendError(int i, String s) throws IOException { request.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ERROR); - setStatus(i, s); + setStatus(i); flushBuffer(); } @@ -259,13 +259,13 @@ public void setStatus(int i) { } - @Override - @Deprecated - public void setStatus(int i, String s) { - if (!canSetHeader()) return; - statusCode = i; - statusMessage = s; - } +// @Override +// @Deprecated +// public void setStatus(int i, String s) { +// if (!canSetHeader()) return; +// statusCode = i; +// statusMessage = s; +// } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java index eb1f728f..2163320d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSession.java @@ -17,7 +17,6 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpSession; -import jakarta.servlet.http.HttpSessionContext; import java.time.Instant; import java.util.Collections; @@ -87,60 +86,30 @@ public int getMaxInactiveInterval() { return maxInactiveInterval; } - @Override - @Deprecated - public HttpSessionContext getSessionContext() { - throw new UnsupportedOperationException("Session context is deprecated and no longer supported"); - } - @Override public Object getAttribute(String name) { touch(); return attributes.get(name); } - @Override - @Deprecated - public Object getValue(String name) { - throw new UnsupportedOperationException("Session values are deprecated and not supported"); - } - @Override public Enumeration getAttributeNames() { touch(); return Collections.enumeration(attributes.keySet()); } - @Override - @Deprecated - public String[] getValueNames() { - throw new UnsupportedOperationException("Session values are deprecated and not supported"); - } - @Override public void setAttribute(String name, Object value) { touch(); attributes.put(name, value); } - @Override - @Deprecated - public void putValue(String name, Object value) { - throw new UnsupportedOperationException("Session values are deprecated and not supported"); - } - @Override public void removeAttribute(String name) { touch(); attributes.remove(name); } - @Override - @Deprecated - public void removeValue(String name) { - throw new UnsupportedOperationException("Session values are deprecated and not supported"); - } - @Override public void invalidate() { valid = false; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 5ed2ccf4..1d2f3e3c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -80,7 +80,7 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon } if (isNamedDispatcher) { - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet(dispatchTo)); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); return; } @@ -149,8 +149,4 @@ private Servlet getServlet(HttpServletRequest req) { return ((AwsServletContext)lambdaContainerHandler.getServletContext()).getServletForPath(req.getPathInfo()); } - private Servlet getServlet(String servletName) throws ServletException { - return ((AwsServletContext)lambdaContainerHandler.getServletContext()).getServlet(servletName); - } - } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index e1688c9f..cd84f850 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -123,7 +123,7 @@ public void setSessionTimeout(int sessionTimeout) { @Override public int getSessionTimeout() { - return 15; + return 0; } @@ -206,13 +206,6 @@ public RequestDispatcher getNamedDispatcher(String s) { return new AwsProxyRequestDispatcher(s, true, containerHandler); } - - @Override - @Deprecated - public Servlet getServlet(String s) throws ServletException { - return servletRegistrations.get(s).getServlet(); - } - public Servlet getServletForPath(String path) { String[] pathParts = path.split("/"); for (AwsServletRegistration reg : servletRegistrations.values()) { @@ -238,38 +231,12 @@ public Servlet getServletForPath(String path) { return null; } - - @Override - @Deprecated - public Enumeration getServlets() { - return Collections.enumeration(servletRegistrations.entrySet().stream() - .map((e) -> { - return e.getValue().getServlet(); - } ) - .collect(Collectors.toList())); - } - - - @Override - @Deprecated - public Enumeration getServletNames() { - return Collections.enumeration(servletRegistrations.keySet()); - } - - @Override public void log(String s) { log.info(SecurityUtils.encode(s)); } - @Override - @Deprecated - public void log(Exception e, String s) { - log.error(SecurityUtils.encode(s), e); - } - - @Override public void log(String s, Throwable throwable) { log.error(SecurityUtils.encode(s), throwable); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java index 7e7fba49..1a51b558 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsFilterChainManagerTest.java @@ -229,11 +229,11 @@ void filterChain_executeMultipleFilters_expectRunEachTime() { @Test void filterChain_multipleServlets_callsCorrectServlet() throws IOException, ServletException { - MockServlet servlet1 = (MockServlet) servletContext.getServlet(SERVLET1_NAME); + MockServlet servlet1 = (MockServlet) ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET1_NAME)).getServlet(); ServletConfig servlet1Config = ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET1_NAME)).getServletConfig(); servlet1.init(servlet1Config); - MockServlet servlet2 = (MockServlet) servletContext.getServlet(SERVLET2_NAME); + MockServlet servlet2 = (MockServlet) ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET2_NAME)).getServlet(); ServletConfig servlet2Config = ((AwsServletRegistration) servletContext.getServletRegistration(SERVLET2_NAME)).getServletConfig(); servlet2.init(servlet2Config); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java index 77dd4bd3..bcca83dd 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpSessionTest.java @@ -34,34 +34,6 @@ void new_creationTimePopulatedCorrectly() { assertEquals(session.getLastAccessedTime(), session.getCreationTime()); } - @Test - void values_throwsUnsupportedOperationException() { - int exCount = 0; - AwsHttpSession sess = new AwsHttpSession("id"); - - try { - sess.putValue("test", "test"); - } catch (UnsupportedOperationException e) { - exCount++; - } - try { - sess.removeValue("test"); - } catch (UnsupportedOperationException e) { - exCount++; - } - try { - sess.getValue("test"); - } catch (UnsupportedOperationException e) { - exCount++; - } - try { - sess.getValueNames(); - } catch (UnsupportedOperationException e) { - exCount++; - } - assertEquals(4, exCount); - } - @Test void attributes_dataStoredCorrectly() throws InterruptedException { AwsHttpSession sess = new AwsHttpSession("id"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 5817527e..ed84462a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -217,9 +217,8 @@ void servletMappings_expectCorrectServlet() { void addServlet_callsDefaultConstructor() throws ServletException { AwsServletContext ctx = new AwsServletContext(null); ctx.addServlet("srv1", TestServlet.class); - assertNotNull(ctx.getServlet("srv1")); - assertNotNull(ctx.getServletRegistration("srv1")); - assertEquals("", ((TestServlet)ctx.getServlet("srv1")).getId()); + assertNotNull(((AwsServletRegistration) ctx.getServletRegistration("srv1")).getServlet()); + assertEquals("", ((TestServlet)((AwsServletRegistration) ctx.getServletRegistration("srv1")).getServlet()).getId()); } @Test diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ef4a4371..e94af803 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.fasterxml.jackson.core diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f1ae95db..8cf77bb2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,17 +6,17 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT .. - 6.0.7 + 6.0.8 6.0.2 @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 2.0-SNAPSHOT diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 08856cf5..34557c57 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 1.10-SNAPSHOT + 2.0-SNAPSHOT 4.0.0 @@ -12,10 +12,10 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0-SNAPSHOT - 6.0.7 + 6.0.8 3.0.5 6.0.2 17 @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 2.0-SNAPSHOT org.springframework diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c13c0586..6df742a5 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 1.10-SNAPSHOT + 2.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 83dc7974..396f5e79 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 1.10-SNAPSHOT + 2.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 4003610a..040f4353 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 1.10-SNAPSHOT + 2.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index edb82190..fd770a9b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -10,7 +10,7 @@ \${version} jar - Serverless Spring Boot 2 API + Serverless Spring Boot 3 API https://github.com/awslabs/aws-serverless-java-container @@ -20,14 +20,13 @@ - 1.8 - 1.8 + 17 com.amazonaws.serverless - aws-serverless-java-container-springboot2 + aws-serverless-java-container-springboot3 ${project.version} diff --git a/pom.xml b/pom.xml index 08627db2..1dca94c7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 1.10-SNAPSHOT + 2.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index b32dc8ef..5b073ebe 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -7,18 +7,18 @@ repositories { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0,)', + 'com.fasterxml.jackson.core:jackson-databind:2.14.2', 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.39.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.39.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.1") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 2f0b8f56..0505d04f 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -6,7 +6,7 @@ com.amazonaws.serverless.sample serverless-jersey-example - 1.0-SNAPSHOT + 2.0-SNAPSHOT Jersey example for the aws-serverless-java-container library Simple pet store written in Jersey https://aws.amazon.com/lambda/ @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - [1.9,) + [2.0,) diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle index 6282d2d2..b262a469 100644 --- a/samples/micronaut/pet-store/build.gradle +++ b/samples/micronaut/pet-store/build.gradle @@ -1,10 +1,10 @@ plugins { id "java" - id "com.github.johnrengelman.shadow" version "5.0.0" + id "com.github.johnrengelman.shadow" version "8.1.1" id "application" id "net.ltgt.apt-eclipse" version "0.21" - id "org.springframework.boot" version "2.1.12.RELEASE" - id "io.spring.dependency-management" version "1.0.6.RELEASE" + id "org.springframework.boot" version "3.0.5" + id "io.spring.dependency-management" version "1.1.0" } version "0.1" @@ -53,8 +53,8 @@ dependencies { // spring support implementation("org.springframework.boot:spring-boot-starter-web") - runtime("io.micronaut.spring:micronaut-spring-boot:1.0.1") - runtime("io.micronaut.spring:micronaut-spring-web:1.0.1") + runtime("io.micronaut.spring:micronaut-spring-boot:5.0.0-M1") + runtime("io.micronaut.spring:micronaut-spring-web:5.0.0-M1") } test.classpath += configurations.developmentOnly diff --git a/samples/quarkus/pet-store/pom.xml b/samples/quarkus/pet-store/pom.xml index 5484ffad..13229ee5 100644 --- a/samples/quarkus/pet-store/pom.xml +++ b/samples/quarkus/pet-store/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.amazonaws.serverless.sample serverless-quarkus-example - 1.0-SNAPSHOT + 2.0-SNAPSHOT 3.8.1 true diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 759aa061..46a7df70 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,9 +7,9 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.27', - 'org.springframework:spring-context:5.3.27', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'org.springframework:spring-webmvc:6.0.7', + 'org.springframework:spring-context:6.0.7', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 0b85ff94..2194cee2 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -6,7 +6,7 @@ com.amazonaws.serverless.sample serverless-spring-example - 1.0-SNAPSHOT + 2.0-SNAPSHOT Spring example for the aws-serverless-java-container library Simple pet store written with the Spring framework https://aws.amazon.com/lambda/ @@ -24,10 +24,11 @@ - 17 6.0.7 4.13.2 2.19.0 + 17.0.6 + 17.0.6 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 60affd72..37ba61a5 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -8,10 +8,10 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:2.7.11') { + implementation('org.springframework.boot:spring-boot-starter-web:3.0.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, - 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.4,)', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0,)', 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit") diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index dc1dcc36..3f0f283a 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -5,7 +5,7 @@ com.amazonaws.serverless.sample serverless-springboot3-example - 1.0-SNAPSHOT + 2.0-SNAPSHOT Spring Boot example for the aws-serverless-java-container library Simple pet store written with the Spring framework and Spring Boot https://aws.amazon.com/lambda/ From 4b1a7b4c7eb76eb36186e927828e448b86e4ab23 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Thu, 20 Apr 2023 09:12:17 -0700 Subject: [PATCH 0600/1214] Removed java-9 profiles along with the old com.sun.activation:jakarta.activation dependency. --- aws-serverless-java-container-core/pom.xml | 22 ----------------- .../AwsHttpApiV2ProxyHttpServletRequest.java | 4 ++-- .../servlet/AwsHttpServletRequestWrapper.java | 4 ++-- .../servlet/AwsHttpServletResponse.java | 24 ------------------- .../servlet/AwsProxyRequestDispatcher.java | 2 +- .../internal/servlet/AwsServletContext.java | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- .../pom.xml | 1 - 8 files changed, 7 insertions(+), 54 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 645916e7..ad00d2ef 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -125,11 +125,6 @@ 6.0.2 test - - jakarta.activation - jakarta.activation-api - 2.1.1 - @@ -226,21 +221,4 @@ - - - - java9-plus - - [9,) - - - - com.sun.activation - jakarta.activation - 1.2.2 - - - - - diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 85c8d8c1..bdf11b81 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -476,12 +476,12 @@ public AsyncContext getAsyncContext() { @Override public String getRequestId() { - return null; + return request.getRequestContext().getRequestId(); } @Override public String getProtocolRequestId() { - return null; + return ""; } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java index 00c7d77d..3817e797 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -395,12 +395,12 @@ public DispatcherType getDispatcherType() { @Override public String getRequestId() { - return null; + return originalRequest.getRequestId(); } @Override public String getProtocolRequestId() { - return null; + return ""; } @Override diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index e325b50d..c46af7a9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -152,20 +152,6 @@ public String encodeRedirectURL(String s) { } -// @Override -// @Deprecated -// public String encodeUrl(String s) { -// return this.encodeURL(s); -// } - - -// @Override -// @Deprecated -// public String encodeRedirectUrl(String s) { -// return this.encodeRedirectURL(s); -// } - - @Override public void sendError(int i, String s) throws IOException { request.setAttribute(AwsHttpServletRequest.DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ERROR); @@ -258,16 +244,6 @@ public void setStatus(int i) { statusCode = i; } - -// @Override -// @Deprecated -// public void setStatus(int i, String s) { -// if (!canSetHeader()) return; -// statusCode = i; -// statusMessage = s; -// } - - @Override public int getStatus() { return (statusCode <= 0?SC_OK:statusCode); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java index 1d2f3e3c..f314ba0d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyRequestDispatcher.java @@ -80,7 +80,7 @@ public void forward(ServletRequest servletRequest, ServletResponse servletRespon } if (isNamedDispatcher) { - lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, getServlet((HttpServletRequest)servletRequest)); + lambdaContainerHandler.doFilter((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, ((AwsServletRegistration)servletRequest.getServletContext().getServletRegistration(dispatchTo)).getServlet()); return; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index cd84f850..634f44ff 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -46,7 +46,7 @@ public class AwsServletContext //------------------------------------------------------------- // Constants - Public // ------------------------------------------------------------- - public static final int SERVLET_API_MAJOR_VERSION = 5; + public static final int SERVLET_API_MAJOR_VERSION = 6; public static final int SERVLET_API_MINOR_VERSION = 0; public static final String SERVER_INFO = LambdaContainerHandler.SERVER_INFO + "/" + SERVLET_API_MAJOR_VERSION + "." + SERVLET_API_MINOR_VERSION; diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8cf77bb2..5fe784a4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -62,7 +62,7 @@ jakarta.activation jakarta.activation-api - 2.1.0 + 2.1.1 test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 34557c57..c20fab9f 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -18,7 +18,6 @@ 6.0.8 3.0.5 6.0.2 - 17 From 980ebfa13166b0993b95481c28707c5be9f76e72 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 24 Apr 2023 14:25:33 -0700 Subject: [PATCH 0601/1214] chore(deps): Updated sample apps --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/jersey/pet-store/template.yml | 2 +- samples/quarkus/pet-store/pom.xml | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 949112fc..b1ddfd4a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[1.9,)', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 66093c4b..7aedaf58 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,9 +7,9 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:5.3.27', - 'org.springframework:spring-context:5.3.27', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[1.0,)', + 'org.springframework:spring-webmvc:6.0.8', + 'org.springframework:spring-context:6.0.8', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', diff --git a/pom.xml b/pom.xml index 1dca94c7..2c97633a 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git HEAD - + diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 5b073ebe..11ad779d 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.14.2', + 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 0505d04f..58511ca2 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.1 - 2.14.2 + 2.15.0 diff --git a/samples/jersey/pet-store/template.yml b/samples/jersey/pet-store/template.yml index f715064c..a3fd2bfa 100644 --- a/samples/jersey/pet-store/template.yml +++ b/samples/jersey/pet-store/template.yml @@ -12,7 +12,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: com.amazonaws.serverless.sample.jersey.StreamLambdaHandler::handleRequest - Runtime: java11 + Runtime: java17 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/samples/quarkus/pet-store/pom.xml b/samples/quarkus/pet-store/pom.xml index 13229ee5..d13958ad 100644 --- a/samples/quarkus/pet-store/pom.xml +++ b/samples/quarkus/pet-store/pom.xml @@ -8,8 +8,8 @@ 3.8.1 true - 17.0.6 - 17.0.6 + 17 + 17 UTF-8 UTF-8 1.0.1.Final From 57c712a224401a23a7520780eb1d62cd1a90e00a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 12:06:19 +0200 Subject: [PATCH 0602/1214] chore: modify CI build for 2.x --- .../continuous-integration-workflow.yml | 88 +++++++++---------- 1 file changed, 43 insertions(+), 45 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 4942f356..c7780121 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -24,25 +24,25 @@ jobs: - uses: actions/checkout@v3 - name: Build latest run: ./gha_build.sh jersey true true - - name: Set up JDK 8 - uses: actions/setup-java@v3 - with: - distribution: 'corretto' - java-version: 8 - - name: Build Jersey 2.27 - run: ./gha_build.sh jersey false false -Djersey.version=2.27 - - name: Build Jersey 2.28 - run: ./gha_build.sh jersey false false -Djersey.version=2.28 - - name: Build Jersey 2.29 - run: ./gha_build.sh jersey false false -Djersey.version=2.29.1 +# - name: Set up JDK 8 +# uses: actions/setup-java@v3 +# with: +# distribution: 'corretto' +# java-version: 8 +# - name: Build Jersey 2.27 +# run: ./gha_build.sh jersey false false -Djersey.version=2.27 +# - name: Build Jersey 2.28 +# run: ./gha_build.sh jersey false false -Djersey.version=2.28 +# - name: Build Jersey 2.29 +# run: ./gha_build.sh jersey false false -Djersey.version=2.29.1 - build_spark: - name: Build and test Spark - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Build latest - run: ./gha_build.sh spark true true +# build_spark: +# name: Build and test Spark +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Build latest +# run: ./gha_build.sh spark true true build_spring: name: Build and test Spring & SpringBoot @@ -50,37 +50,35 @@ jobs: steps: - uses: actions/checkout@v3 - name: Build latest - # we reduce the minCoverage for this run because it will skip the SpringBoot 1.5 tests since they are no longer compatible with - # Spring core 5.2 and above. SpringBoot 1.5 is deprecated - run: ./gha_build.sh spring true true -Djacoco.minCoverage=0.4 - - name: Build Spring 5.0 - run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE -Ddependency-check.skip=true - - name: Build Spring 5.1 - run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE -Ddependency-check.skip=true - - name: Build Spring 5.2 - run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE -Ddependency-check.skip=true + run: ./gha_build.sh spring true true +# - name: Build Spring 5.0 +# run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE -Ddependency-check.skip=true +# - name: Build Spring 5.1 +# run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE -Ddependency-check.skip=true +# - name: Build Spring 5.2 +# run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE -Ddependency-check.skip=true - build_springboot2: - name: Build and test SpringBoot 2 + build_springboot3: + name: Build and test SpringBoot 3 runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build latest - run: ./gha_build.sh springboot2 true true + run: ./gha_build.sh springboot3 true true # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions - - name: Build Spring Boot 2.2 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE -Ddependency-check.skip=true - - name: Build Spring Boot 2.3 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE -Ddependency-check.skip=true - - name: Build Spring Boot 2.4 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 -Ddependency-check.skip=true - - name: Build Spring Boot 2.5 - run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.14 -Dspring.version=5.3.20 -Dspringsecurity.version=5.5.8 -Ddependency-check.skip=true +# - name: Build Spring Boot 2.2 +# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE -Ddependency-check.skip=true +# - name: Build Spring Boot 2.3 +# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE -Ddependency-check.skip=true +# - name: Build Spring Boot 2.4 +# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 -Ddependency-check.skip=true +# - name: Build Spring Boot 2.5 +# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.14 -Dspring.version=5.3.20 -Dspringsecurity.version=5.5.8 -Ddependency-check.skip=true - build_struts2: - name: Build and test Struts - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Build latest - run: ./gha_build.sh struts true true +# build_struts2: +# name: Build and test Struts +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Build latest +# run: ./gha_build.sh struts true true From 0f40e3a51c7bd45acff5771b1f76e974a76105ca Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 12:12:10 +0200 Subject: [PATCH 0603/1214] chore: modify CI build for 2.x to use Corretto 17 --- .../continuous-integration-workflow.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c7780121..5728e10b 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -13,6 +13,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 - name: Build latest run: mvn -q clean install working-directory: ./aws-serverless-java-container-core @@ -22,6 +27,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 - name: Build latest run: ./gha_build.sh jersey true true # - name: Set up JDK 8 @@ -49,6 +59,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 - name: Build latest run: ./gha_build.sh spring true true # - name: Build Spring 5.0 @@ -63,6 +78,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 - name: Build latest run: ./gha_build.sh springboot3 true true # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions From 54befe7d43923c3462786ed75d4f76e8b84f3f45 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 12:21:24 +0200 Subject: [PATCH 0604/1214] chore: modify CI build for 2.x to no longer build with Gradle 5 as additional test --- gha_build.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gha_build.sh b/gha_build.sh index 9d0001ca..036ac4be 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -31,7 +31,7 @@ function archetype { cd ${WORKING_DIR}/${ARCHETYPE_NAME} && mvn -q clean install ARCHETYPE_TEST_DIR=${WORKING_DIR}/$1_archetype_test mkdir -p ${ARCHETYPE_TEST_DIR} - cd ${ARCHETYPE_TEST_DIR} && mvn archetype:generate -DgroupId=my.service -DartifactId=${PROJ_NAME} -Dversion=1.0-SNAPSHOT \ + cd ${ARCHETYPE_TEST_DIR} && mvn archetype:generate -DgroupId=my.service -DartifactId=${PROJ_NAME} -Dversion=2.0-SNAPSHOT \ -DarchetypeGroupId=com.amazonaws.serverless.archetypes \ -DarchetypeArtifactId=${ARCHETYPE_NAME} \ -DarchetypeCatalog=local \ @@ -51,10 +51,10 @@ function archetype { if [[ "$?" -ne 0 ]]; then exit 1 fi - cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew wrapper --gradle-version 5.0 - if [[ "$?" -ne 0 ]]; then - exit 1 - fi +# cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew wrapper --gradle-version 5.0 +# if [[ "$?" -ne 0 ]]; then +# exit 1 +# fi cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew -q clean build if [[ "$?" -ne 0 ]]; then exit 1 @@ -72,10 +72,10 @@ function sample { if [[ "$?" -ne 0 ]]; then exit 1 fi - cd ${SAMPLE_FOLDER} && ./gradlew wrapper --gradle-version 5.0 - if [[ "$?" -ne 0 ]]; then - exit 1 - fi +# cd ${SAMPLE_FOLDER} && ./gradlew wrapper --gradle-version 5.0 +# if [[ "$?" -ne 0 ]]; then +# exit 1 +# fi cd ${SAMPLE_FOLDER} && ./gradlew -q clean build if [[ "$?" -ne 0 ]]; then exit 1 From 22510fcfee417f5492f6b4a144f9e3f162324f34 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 13:26:17 +0200 Subject: [PATCH 0605/1214] feat: Support Jakarta EE along with Spring Boot 3 support - build fixes --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 8 ++++---- samples/springboot3/pet-store/build.gradle | 4 ++-- samples/springboot3/pet-store/pom.xml | 4 ++-- 14 files changed, 23 insertions(+), 23 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ad00d2ef..a530a49c 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -122,7 +122,7 @@ org.springframework.security spring-security-web - 6.0.2 + 6.0.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5fe784a4..af8d73f3 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 6.0.8 - 6.0.2 + 6.0.3 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index c20fab9f..63113f19 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -16,8 +16,8 @@ 6.0.8 - 3.0.5 - 6.0.2 + 3.0.6 + 6.0.3 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index b1ddfd4a..022d3e53 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 7aedaf58..307af9c8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'org.springframework:spring-webmvc:6.0.8', 'org.springframework:spring-context:6.0.8', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 85e071a0..80348e59 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.0.7 + 6.0.8 4.13.2 2.19.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 36a13b5d..d8baa549 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,8 +8,8 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:2.7.10', - 'com.amazonaws.serverless:aws-serverless-java-container-springboot2:[1.0,)', + 'org.springframework.boot:spring-boot-starter-web:3.0.6', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index fd770a9b..d841a723 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.5 + 3.0.6 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 11ad779d..6ff7cdd1 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'io.symphonia:lambda-logging:1.0.3' ) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 58511ca2..7846c163 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -34,7 +34,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - [2.0,) + [2.0-SNAPSHOT,) diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 46a7df70..0a056aca 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,9 +7,9 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.7', - 'org.springframework:spring-context:6.0.7', - 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0,)', + 'org.springframework:spring-webmvc:6.0.8', + 'org.springframework:spring-context:6.0.8', + 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.19.0', 'org.apache.logging.log4j:log4j-api:2.19.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 2194cee2..4562e444 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,18 +24,18 @@ - 6.0.7 + 6.0.8 4.13.2 2.19.0 - 17.0.6 - 17.0.6 + 17 + 17 com.amazonaws.serverless aws-serverless-java-container-spring - [2.0,) + [2.0-SNAPSHOT,) diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 37ba61a5..fe271292 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -8,10 +8,10 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.0.5') { + implementation('org.springframework.boot:spring-boot-starter-web:3.0.6') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, - 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0,)', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit") diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 3f0f283a..5b455458 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.5 + 3.0.6 @@ -43,7 +43,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - [2.0,) + [2.0-SNAPSHOT,) From e075be80de0a73219fd7ef2ce3947634f4cf0e05 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 13:38:19 +0200 Subject: [PATCH 0606/1214] chore: modify CI build for 2.x - fix naming --- .github/workflows/continuous-integration-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 5728e10b..2374a45b 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -55,7 +55,7 @@ jobs: # run: ./gha_build.sh spark true true build_spring: - name: Build and test Spring & SpringBoot + name: Build and test Spring runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From e82ba5743e6e0285f0a60b2c3776b576e37f1ecd Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 16:14:18 +0200 Subject: [PATCH 0607/1214] feat: Support Jakarta EE along with Spring Boot 3 support - build fixes --- .../src/main/resources/archetype-resources/build.gradle | 5 ++--- .../src/main/resources/archetype-resources/build.gradle | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 022d3e53..4f7bda47 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,16 +9,15 @@ dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', - 'io.symphonia:lambda-logging:1.0.3' ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:2.39.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:2.39.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.1") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index d8baa549..45e6ba1b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,7 +10,6 @@ dependencies { implementation ( 'org.springframework.boot:spring-boot-starter-web:3.0.6', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', - 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit:4.13.2") From c4c4f2eac4a365cdbe6cba24bb9353a940b163e9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 16:36:04 +0200 Subject: [PATCH 0608/1214] chore: create dependabot.yml --- .github/dependabot.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..6c2be00a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: maven + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: maven + directory: "/samples/spring/pet-store" + schedule: + interval: "weekly" + - package-ecosystem: maven + directory: "/samples/springboot3/pet-store" + schedule: + interval: "weekly" + - package-ecosystem: maven + directory: "/samples/jersey/pet-store" + schedule: + interval: "weekly" From 07550d1a466347dcd3e7a2727ad33a2db44fc614 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:19 +0000 Subject: [PATCH 0609/1214] chore(deps): bump maven-install-plugin in /samples/springboot3/pet-store Bumps [maven-install-plugin](https://github.com/apache/maven-install-plugin) from 3.0.0-M1 to 3.1.1. - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.0.0-M1...maven-install-plugin-3.1.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 5b455458..45937355 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true From 3a0d7b4cccb8cb09f98ed477d6e4c5974a7bbf70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:22 +0000 Subject: [PATCH 0610/1214] chore(deps-dev): bump mockito-core from 4.11.0 to 5.3.1 Bumps [mockito-core](https://github.com/mockito/mockito) from 4.11.0 to 5.3.1. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.11.0...v5.3.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c97633a..f3083b41 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.15.0 2.0.7 5.9.2 - 4.11.0 + 5.3.1 1.3 UTF-8 From 55d0f9c1797c95916b69336c846bc581291717b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:23 +0000 Subject: [PATCH 0611/1214] chore(deps): bump maven-dependency-plugin Bumps [maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.2.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.2.0...maven-dependency-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 5b455458..38562ebc 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -116,7 +116,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies From 7c43a2c5945f3717bdd78f67eece579fa54597b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:26 +0000 Subject: [PATCH 0612/1214] chore(deps): bump jacoco-maven-plugin from 0.8.8 to 0.8.10 Bumps [jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.8 to 0.8.10. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.8...v0.8.10) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c97633a..058e3c26 100644 --- a/pom.xml +++ b/pom.xml @@ -234,7 +234,7 @@ org.jacoco jacoco-maven-plugin - 0.8.8 + 0.8.10 From 92a0079f6e16b4981e6a2dc91d93033234af2c2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:26 +0000 Subject: [PATCH 0613/1214] chore(deps): bump maven-jar-plugin in /samples/springboot3/pet-store Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.0...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 5b455458..18f93447 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -96,7 +96,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar From 593076b7f78fa17911ebfe310344e2488f33f5f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:29 +0000 Subject: [PATCH 0614/1214] chore(deps): bump maven-assembly-plugin Bumps [maven-assembly-plugin](https://github.com/apache/maven-assembly-plugin) from 3.3.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-assembly-plugin/releases) - [Commits](https://github.com/apache/maven-assembly-plugin/compare/maven-assembly-plugin-3.3.0...maven-assembly-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-assembly-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 5b455458..9686aa4e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -134,7 +134,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.5.0 zip-assembly From 795843ca68923add8cecfbf06138c240afb2ded2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:29 +0000 Subject: [PATCH 0615/1214] chore(deps): bump maven-assembly-plugin in /samples/jersey/pet-store Bumps [maven-assembly-plugin](https://github.com/apache/maven-assembly-plugin) from 3.3.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-assembly-plugin/releases) - [Commits](https://github.com/apache/maven-assembly-plugin/compare/maven-assembly-plugin-3.3.0...maven-assembly-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-assembly-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7846c163..4e9ca784 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.5.0 zip-assembly From 485b51d76b04710d7b9c46c0ab0f21b1207de42f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:33 +0000 Subject: [PATCH 0616/1214] chore(deps): bump maven-install-plugin in /samples/jersey/pet-store Bumps [maven-install-plugin](https://github.com/apache/maven-install-plugin) from 3.0.0-M1 to 3.1.1. - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.0.0-M1...maven-install-plugin-3.1.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7846c163..044299bf 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -130,7 +130,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true From 7e70451ba08f856c284551ebe9a0d0048b695520 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:37 +0000 Subject: [PATCH 0617/1214] chore(deps): bump maven-jar-plugin in /samples/jersey/pet-store Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.0...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7846c163..a30a1d53 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar From 76a9348a97973ed2865d1ab0ed63325814dc28de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:38 +0000 Subject: [PATCH 0618/1214] chore(deps): bump maven-install-plugin in /samples/spring/pet-store Bumps [maven-install-plugin](https://github.com/apache/maven-install-plugin) from 3.0.0-M1 to 3.1.1. - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.0.0-M1...maven-install-plugin-3.1.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4562e444..2c062a99 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -153,7 +153,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true From e34558c48bc7ea841a7f96eceff255a713a7e1fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:40 +0000 Subject: [PATCH 0619/1214] chore(deps): bump maven-dependency-plugin in /samples/jersey/pet-store Bumps [maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.2.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.2.0...maven-dependency-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/jersey/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7846c163..94d3ebfa 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -139,7 +139,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies From 39987ed573d2415fb86156e0c2fbe69f4d852765 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:42 +0000 Subject: [PATCH 0620/1214] chore(deps): bump maven-assembly-plugin in /samples/spring/pet-store Bumps [maven-assembly-plugin](https://github.com/apache/maven-assembly-plugin) from 3.3.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-assembly-plugin/releases) - [Commits](https://github.com/apache/maven-assembly-plugin/compare/maven-assembly-plugin-3.3.0...maven-assembly-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-assembly-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4562e444..ebd952de 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -180,7 +180,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.5.0 zip-assembly From c17a7b6f94ee77b39662fe9badbbf4c1e517b8e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:36:48 +0000 Subject: [PATCH 0621/1214] chore(deps): bump maven-dependency-plugin in /samples/spring/pet-store Bumps [maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) from 3.2.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-dependency-plugin/releases) - [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.2.0...maven-dependency-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-dependency-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4562e444..1c4b8329 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -162,7 +162,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies From 65cc0dab53c0b935058835e0bbfae0c582773c9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:37:51 +0000 Subject: [PATCH 0622/1214] chore(deps): bump maven-enforcer-plugin from 3.0.0-M1 to 3.3.0 Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.0.0-M1 to 3.3.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.0.0-M1...enforcer-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c97633a..e46456d2 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.0.0-M1 + 3.3.0 enforce From b1667272f206fbfb75ae229d5669c0f453d1a0f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 14:37:55 +0000 Subject: [PATCH 0623/1214] chore(deps): bump spotbugs-maven-plugin from 4.7.3.0 to 4.7.3.4 Bumps [spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.3.0 to 4.7.3.4. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.3.0...spotbugs-maven-plugin-4.7.3.4) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c97633a..4a426893 100644 --- a/pom.xml +++ b/pom.xml @@ -205,7 +205,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.7.3.0 + 4.7.3.4 - com.google.code.findbugs - annotations - 3.0.1 + com.github.spotbugs + spotbugs-annotations + 4.7.3 provided From f5b12534f46e39d72e27cf8fbc633162d688da26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:17:47 +0000 Subject: [PATCH 0625/1214] chore(deps): bump maven-jar-plugin in /samples/spring/pet-store Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.0...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 3d27acc9..6f76c7a6 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -142,7 +142,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar From de3ff82ee0a9dc97774314f6420c800d1d1a8adc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:17:48 +0000 Subject: [PATCH 0626/1214] chore(deps): bump archetype-packaging from 3.0.1 to 3.2.1 Bumps [archetype-packaging](https://github.com/apache/maven-archetype) from 3.0.1 to 3.2.1. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.0.1...maven-archetype-3.2.1) --- updated-dependencies: - dependency-name: org.apache.maven.archetype:archetype-packaging dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-jersey-archetype/pom.xml | 2 +- aws-serverless-spring-archetype/pom.xml | 2 +- aws-serverless-springboot3-archetype/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 6df742a5..329e92db 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.0.1 + 3.2.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 396f5e79..97bc6ee3 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.0.1 + 3.2.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 040f4353..344aa986 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.0.1 + 3.2.1 From ad630e104cc2b5d64abbcb73ba568c043cd29b8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:17:53 +0000 Subject: [PATCH 0627/1214] chore(deps): bump maven-javadoc-plugin from 3.3.0 to 3.5.0 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.3.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.3.0...maven-javadoc-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca454100..33934a0a 100644 --- a/pom.xml +++ b/pom.xml @@ -188,7 +188,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.0 + 3.5.0 From 44a59d7f3a989991c0ad116e1251ba752657db8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:17:59 +0000 Subject: [PATCH 0628/1214] chore(deps): bump maven-archetype-plugin from 3.0.1 to 3.2.1 Bumps [maven-archetype-plugin](https://github.com/apache/maven-archetype) from 3.0.1 to 3.2.1. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.0.1...maven-archetype-3.2.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-archetype-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-jersey-archetype/pom.xml | 2 +- aws-serverless-spring-archetype/pom.xml | 2 +- aws-serverless-springboot3-archetype/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 6df742a5..a2e991f3 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.2.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 396f5e79..7fe877b9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -66,7 +66,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.2.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 040f4353..94dbcbba 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.2.1 From 8198040713e7e2f61c4af1ae0ce17d8ac1577f69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:18:10 +0000 Subject: [PATCH 0629/1214] chore(deps): bump dependency-check-maven from 8.1.2 to 8.2.1 Bumps [dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 8.1.2 to 8.2.1. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v8.1.2...v8.2.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca454100..fb131759 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 8.1.2 + 8.2.1 2.15.0 2.0.7 5.9.2 From 1cc6a13d122f9039922db4cd99a19e7b5daee08c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 20:54:16 +0200 Subject: [PATCH 0630/1214] feat: Support Jakarta EE along with Spring Boot 3 support - fixed sample --- .../serverless/sample/springboot3/Application.java | 4 ++-- .../serverless/sample/springboot3/StreamLambdaHandler.java | 4 ++-- .../sample/springboot3/controller/PetsController.java | 6 +++--- .../sample/springboot3/filter/CognitoIdentityFilter.java | 4 ++-- .../serverless/sample/springboot3/model/Error.java | 2 +- .../amazonaws/serverless/sample/springboot3/model/Pet.java | 2 +- .../serverless/sample/springboot3/model/PetData.java | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java index aeb63a25..c576521f 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java @@ -1,6 +1,6 @@ -package com.amazonaws.serverless.sample.springboot2; +package com.amazonaws.serverless.sample.springboot3; -import com.amazonaws.serverless.sample.springboot2.controller.PetsController; +import com.amazonaws.serverless.sample.springboot3.controller.PetsController; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java index 6df4b5ed..7f329357 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.sample.springboot2; +package com.amazonaws.serverless.sample.springboot3; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -6,7 +6,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.sample.springboot2.filter.CognitoIdentityFilter; +import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java index bbf69b08..680e629d 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java @@ -10,12 +10,12 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.sample.springboot2.controller; +package com.amazonaws.serverless.sample.springboot3.controller; -import com.amazonaws.serverless.sample.springboot2.model.Pet; -import com.amazonaws.serverless.sample.springboot2.model.PetData; +import com.amazonaws.serverless.sample.springboot3.model.Pet; +import com.amazonaws.serverless.sample.springboot3.model.PetData; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java index 1cc92708..d6ccae76 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java @@ -1,4 +1,4 @@ -package com.amazonaws.serverless.sample.springboot2.filter; +package com.amazonaws.serverless.sample.springboot3.filter; import com.amazonaws.serverless.proxy.RequestReader; @@ -20,7 +20,7 @@ /** * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot2.StreamLambdaHandler} class. + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. */ public class CognitoIdentityFilter implements Filter { public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java index a2278ed0..320f2158 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.sample.springboot2.model; +package com.amazonaws.serverless.sample.springboot3.model; public class Error { private String message; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java index ee9a1e02..4f0c4ba8 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.sample.springboot2.model; +package com.amazonaws.serverless.sample.springboot3.model; import java.util.Date; diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java index 34a32421..68ea3c18 100644 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java +++ b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java @@ -10,7 +10,7 @@ * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -package com.amazonaws.serverless.sample.springboot2.model; +package com.amazonaws.serverless.sample.springboot3.model; import java.util.ArrayList; From 5a8297ee368e000605d4489b78b952d0aa04eeac Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 21:25:24 +0200 Subject: [PATCH 0631/1214] feat: Support Jakarta EE along with Spring Boot 3 support - requestwrapper should delegate to original request --- .../proxy/internal/servlet/AwsHttpServletRequestWrapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java index 3817e797..58d7282b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestWrapper.java @@ -400,11 +400,11 @@ public String getRequestId() { @Override public String getProtocolRequestId() { - return ""; + return originalRequest.getProtocolRequestId(); } @Override public ServletConnection getServletConnection() { - return null; + return originalRequest.getServletConnection(); } } From 63f1ac561a434c70e14fec70190b2ac3fe141ad8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 21:44:08 +0200 Subject: [PATCH 0632/1214] feat: Support Jakarta EE along with Spring Boot 3 support - dependency cleanup --- aws-serverless-java-container-springboot3/pom.xml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 63113f19..159e9023 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -157,11 +157,6 @@ test - - jakarta.activation - jakarta.activation-api - 2.1.0 - jakarta.validation jakarta.validation-api @@ -173,7 +168,7 @@ jakarta.websocket jakarta.websocket-api 2.0.0 - provided + test From a70a5a6769ab022a7abab3731639dbbf2fb7e93d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 21:46:13 +0200 Subject: [PATCH 0633/1214] chore: add gradle samples to dependabot config --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6c2be00a..81c89630 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,11 +13,23 @@ updates: directory: "/samples/spring/pet-store" schedule: interval: "weekly" + - package-ecosystem: gradle + directory: "/samples/spring/pet-store" + schedule: + interval: "weekly" - package-ecosystem: maven directory: "/samples/springboot3/pet-store" schedule: interval: "weekly" + - package-ecosystem: gradle + directory: "/samples/springboot3/pet-store" + schedule: + interval: "weekly" - package-ecosystem: maven directory: "/samples/jersey/pet-store" schedule: interval: "weekly" + - package-ecosystem: gradle + directory: "/samples/jersey/pet-store" + schedule: + interval: "weekly" From 5d2d2bc68546a0655ff81b103bf886e55b80e1cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:46:32 +0000 Subject: [PATCH 0634/1214] chore(deps): bump maven-resources-plugin from 3.1.0 to 3.3.1 Bumps [maven-resources-plugin](https://github.com/apache/maven-resources-plugin) from 3.1.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-resources-plugin/releases) - [Commits](https://github.com/apache/maven-resources-plugin/compare/maven-resources-plugin-3.1.0...maven-resources-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-resources-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-jersey-archetype/pom.xml | 2 +- aws-serverless-spring-archetype/pom.xml | 2 +- aws-serverless-springboot3-archetype/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 091bf585..51c855ac 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -57,7 +57,7 @@ org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 \ diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 70a4acc4..3a17f167 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -57,7 +57,7 @@ org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 \ diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index fd409e78..21e17602 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -57,7 +57,7 @@ org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.3.1 \ From 65929975a90cadf1b30d3630031db0de0251cc40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:46:43 +0000 Subject: [PATCH 0635/1214] chore(deps-dev): bump jakarta.websocket-api from 2.0.0 to 2.1.0 Bumps [jakarta.websocket-api](https://github.com/eclipse-ee4j/websocket-api) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/eclipse-ee4j/websocket-api/releases) - [Changelog](https://github.com/jakartaee/websocket/blob/master/websocket-1.1-changes.txt) - [Commits](https://github.com/eclipse-ee4j/websocket-api/commits) --- updated-dependencies: - dependency-name: jakarta.websocket:jakarta.websocket-api dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 159e9023..411b16da 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -167,7 +167,7 @@ jakarta.websocket jakarta.websocket-api - 2.0.0 + 2.1.0 test From 901cc9779ce090e3795803204154cd7e6e086c15 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 25 Apr 2023 21:48:39 +0200 Subject: [PATCH 0636/1214] chore(deps): Update log4j version to 2.20.0 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 307af9c8..65aad235 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.0.8', 'org.springframework:spring-context:6.0.8', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.19.0', - 'org.apache.logging.log4j:log4j-api:2.19.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', + 'org.apache.logging.log4j:log4j-core:2.20.0', + 'org.apache.logging.log4j:log4j-api:2.20.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 80348e59..e7cd2ba0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.0.8 4.13.2 - 2.19.0 + 2.20.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 83e8e8bb..ebd3b1b6 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.0') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0') - implementation ('org.apache.logging.log4j:log4j-core:2.19.0') - implementation ('org.apache.logging.log4j:log4j-api:2.19.0') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.19.0') + implementation ('org.apache.logging.log4j:log4j-core:2.20.0') + implementation ('org.apache.logging.log4j:log4j-api:2.20.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.20.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation('junit:junit:4.13.2') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index c7aafda3..8029323d 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 6.1.2 2.15.0 4.13.2 - 2.19.0 + 2.20.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 0a056aca..de5a543b 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.0.8', 'org.springframework:spring-context:6.0.8', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.19.0', - 'org.apache.logging.log4j:log4j-api:2.19.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.19.0', + 'org.apache.logging.log4j:log4j-core:2.20.0', + 'org.apache.logging.log4j:log4j-api:2.20.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 6f76c7a6..0d21b90e 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -26,7 +26,7 @@ 6.0.8 4.13.2 - 2.19.0 + 2.20.0 17 17 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index bd4738f0..2daa1259 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -24,8 +24,8 @@ dependencies { 'javax.el:javax.el-api:3.0.0', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0', - 'org.apache.logging.log4j:log4j-core:2.19.0', - 'org.apache.logging.log4j:log4j-api:2.19.0', + 'org.apache.logging.log4j:log4j-core:2.20.0', + 'org.apache.logging.log4j:log4j-api:2.20.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 2a90ffc0..58d630fc 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 6.1.2 2.15.0 4.13.2 - 2.19.0 + 2.20.0 From 9bc0af81c11e2bf5a5c84afece0f06d7c9f780b5 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 26 Apr 2023 09:17:43 +0200 Subject: [PATCH 0637/1214] chore(deps): Update maven-shaded-log4j-transformer config --- .../src/main/resources/archetype-resources/pom.xml | 11 +++++------ samples/spring/pet-store/pom.xml | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index e7cd2ba0..a0b1bf4e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -94,7 +94,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 package @@ -102,10 +102,9 @@ shade - false + implementation="io.github.edwgiz.log4j.maven.plugins.shade.transformer.Log4j2PluginCacheFileTransformer"> @@ -113,9 +112,9 @@ - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - 2.8.1 + io.github.edwgiz + log4j-maven-shade-plugin-extensions + 2.20.0 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 0d21b90e..6500914f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -103,7 +103,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 package @@ -111,10 +111,9 @@ shade - false + implementation="io.github.edwgiz.log4j.maven.plugins.shade.transformer.Log4j2PluginCacheFileTransformer"> @@ -122,9 +121,9 @@ - com.github.edwgiz - maven-shade-plugin.log4j2-cachefile-transformer - 2.8.1 + io.github.edwgiz + log4j-maven-shade-plugin-extensions + 2.20.0 From 2aea94f4233b92d10b95bdbd1d7e269f198fe1c3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 26 Apr 2023 09:26:35 +0200 Subject: [PATCH 0638/1214] chore(deps): Update plugins versions in samples and archetypes --- .../src/main/resources/archetype-resources/pom.xml | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 8 ++++---- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 57dfdd6d..5fa0be4f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -81,7 +81,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 false @@ -108,7 +108,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true @@ -128,7 +128,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies @@ -146,7 +146,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.5.0 zip-assembly diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 358bbd5e..5e9ea5e3 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -108,7 +108,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index a0b1bf4e..3e27a514 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -132,7 +132,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar @@ -143,7 +143,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true @@ -152,7 +152,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index d841a723..ffbb37fc 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -57,7 +57,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 false @@ -102,7 +102,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true @@ -111,7 +111,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.5.0 copy-dependencies @@ -129,7 +129,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.5.0 zip-assembly diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index cac128b3..48749984 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -92,7 +92,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 false diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index e2d89cb3..e2bbd228 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -120,7 +120,7 @@ org.apache.maven.plugins maven-install-plugin - 3.0.0-M1 + 3.1.1 true diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 0810d02f..1d4b4f6e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -62,7 +62,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.4.1 false @@ -96,7 +96,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.2.0 default-jar From 510e49da476b0b6a2aadbf0ceddfc2414bafb82f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 08:02:03 +0000 Subject: [PATCH 0639/1214] chore(deps): bump maven-jar-plugin in /samples/springboot3/pet-store Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.0...maven-jar-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 1d4b4f6e..69445d34 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -96,7 +96,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.3.0 default-jar From ba10f811e4d4f1ec4c4f29e33d77253ef03c8c44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Apr 2023 08:02:07 +0000 Subject: [PATCH 0640/1214] chore(deps): bump junit-bom from 5.9.2 to 5.9.3 Bumps [junit-bom](https://github.com/junit-team/junit5) from 5.9.2 to 5.9.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.2...r5.9.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc5baf04..5c8a4edd 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 8.2.1 2.15.0 2.0.7 - 5.9.2 + 5.9.3 5.3.1 1.3 UTF-8 From 8a05c04980c19f85bf84ec7c64499a1f77e15d10 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Thu, 27 Apr 2023 10:14:13 -0700 Subject: [PATCH 0641/1214] feat: Support Jakarta EE along with Spring Boot 3 support - update Springboot3 sample app's README --- samples/springboot3/pet-store/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/springboot3/pet-store/README.md b/samples/springboot3/pet-store/README.md index 8e15b377..fb3fab3b 100644 --- a/samples/springboot3/pet-store/README.md +++ b/samples/springboot3/pet-store/README.md @@ -1,5 +1,5 @@ -# Serverless Spring Boot 2 example -A basic pet store written with the [Spring Boot 2 framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. +# Serverless Spring Boot 3 example +A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. From 8ed5650c69ebecc2bdda867519c0214636b5789d Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Mon, 6 Feb 2023 11:30:15 +0200 Subject: [PATCH 0642/1214] Load using the application class loader Fixes #506 --- .../serverless/proxy/internal/servlet/AwsServletContext.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 44ec701e..1732cfe2 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -519,9 +519,7 @@ public JspConfigDescriptor getJspConfigDescriptor() { @Override public ClassLoader getClassLoader() { - // for the time being we return the default class loader. We may want to let developers override this int the - // future. - return ClassLoader.getSystemClassLoader(); + return getClass().getClassLoader(); } From 5a3238d6ddf926f5433fc79b67f8a8647329e7dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 May 2023 04:56:57 +0000 Subject: [PATCH 0643/1214] chore(deps-dev): bump jakarta.activation-api from 2.1.1 to 2.1.2 Bumps [jakarta.activation-api](https://github.com/jakartaee/jaf-api) from 2.1.1 to 2.1.2. - [Release notes](https://github.com/jakartaee/jaf-api/releases) - [Commits](https://github.com/jakartaee/jaf-api/compare/2.1.1...2.1.2) --- updated-dependencies: - dependency-name: jakarta.activation:jakarta.activation-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index af8d73f3..fd0425b4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -62,7 +62,7 @@ jakarta.activation jakarta.activation-api - 2.1.1 + 2.1.2 test From ca25123411bbee02841567fc79c1b509df096660 Mon Sep 17 00:00:00 2001 From: Renato Valenzuela Date: Tue, 2 May 2023 21:33:53 +0000 Subject: [PATCH 0644/1214] chore(deps-dev): add jakarta-websocket-client-api Needed to upgrade `jakarta.websocket-api` to 2.1.0, because: - "Removed the copy of the jakarta.websocket.* classes from the jakarta.websocket-api jar" [1] [1] https://github.com/jakartaee/websocket/blob/ca41696e7d7a48d4f74d1546e0f006a2e82d657d/spec/src/main/asciidoc/WebSocket.adoc#a1-changes-between-21-and-20 --- aws-serverless-java-container-springboot3/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 411b16da..27aa3949 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -171,6 +171,13 @@ test + + jakarta.websocket + jakarta.websocket-client-api + 2.1.0 + test + + From 7b047ae3184196cf2d1119a529f862a3fc33de99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 May 2023 04:56:56 +0000 Subject: [PATCH 0645/1214] chore(deps): bump maven-gpg-plugin from 3.0.1 to 3.1.0 Bumps [maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.0.1 to 3.1.0. - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.0.1...maven-gpg-plugin-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5c8a4edd..f885a41f 100644 --- a/pom.xml +++ b/pom.xml @@ -253,7 +253,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.0.1 + 3.1.0 sign-artifacts From c5b67532bd7a211b41f8da767c1e41c414836b7e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 9 May 2023 16:11:06 +0200 Subject: [PATCH 0646/1214] chore: Remove outdated Micronaut and Quarkus sample code --- README.md | 6 +- samples/micronaut/pet-store/Dockerfile | 24 --- samples/micronaut/pet-store/README.md | 74 --------- samples/micronaut/pet-store/build.gradle | 77 ---------- samples/micronaut/pet-store/docker-build.sh | 25 ---- samples/micronaut/pet-store/gradle.properties | 1 - samples/micronaut/pet-store/micronaut-cli.yml | 5 - samples/micronaut/pet-store/sam-local.sh | 4 - samples/micronaut/pet-store/sam-native.yaml | 30 ---- samples/micronaut/pet-store/scripts/bootstrap | 3 - .../pet-store/scripts/graalvm-build.sh | 9 -- samples/micronaut/pet-store/settings.gradle | 1 - .../amazonaws/micronaut/demo/Application.java | 17 --- .../micronaut/demo/PetsController.java | 79 ---------- .../amazonaws/micronaut/demo/model/Pet.java | 61 -------- .../micronaut/demo/model/PetData.java | 114 -------------- .../native-image.properties | 4 - .../src/main/resources/application.yml | 6 - .../pet-store/src/main/resources/logback.xml | 15 -- samples/quarkus/pet-store/README.md | 68 --------- samples/quarkus/pet-store/pom.xml | 141 ------------------ samples/quarkus/pet-store/sam.native.yaml | 36 ----- .../quarkus/pet-store/src/assembly/zip.xml | 17 --- .../sample/quarkus/PetsController.java | 63 -------- .../serverless/sample/quarkus/model/Pet.java | 50 ------- .../sample/quarkus/model/PetData.java | 102 ------------- .../src/main/resources/application.properties | 4 - 27 files changed, 4 insertions(+), 1032 deletions(-) delete mode 100644 samples/micronaut/pet-store/Dockerfile delete mode 100644 samples/micronaut/pet-store/README.md delete mode 100644 samples/micronaut/pet-store/build.gradle delete mode 100755 samples/micronaut/pet-store/docker-build.sh delete mode 100644 samples/micronaut/pet-store/gradle.properties delete mode 100644 samples/micronaut/pet-store/micronaut-cli.yml delete mode 100755 samples/micronaut/pet-store/sam-local.sh delete mode 100644 samples/micronaut/pet-store/sam-native.yaml delete mode 100755 samples/micronaut/pet-store/scripts/bootstrap delete mode 100755 samples/micronaut/pet-store/scripts/graalvm-build.sh delete mode 100644 samples/micronaut/pet-store/settings.gradle delete mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java delete mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java delete mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java delete mode 100644 samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java delete mode 100644 samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties delete mode 100644 samples/micronaut/pet-store/src/main/resources/application.yml delete mode 100644 samples/micronaut/pet-store/src/main/resources/logback.xml delete mode 100644 samples/quarkus/pet-store/README.md delete mode 100644 samples/quarkus/pet-store/pom.xml delete mode 100644 samples/quarkus/pet-store/sam.native.yaml delete mode 100644 samples/quarkus/pet-store/src/assembly/zip.xml delete mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java delete mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java delete mode 100644 samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java delete mode 100644 samples/quarkus/pet-store/src/main/resources/application.properties diff --git a/README.md b/README.md index 89531389..9c483ae2 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,6 @@ Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serve * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) -* Micronaut [documentation](https://guides.micronaut.io/micronaut-function-aws-lambda/guide/index.html) and [demo](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples/micronaut/pet-store) (outdated! - needs to be updated to latest Micronaut version) - Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). ```java @@ -52,3 +50,7 @@ public class StreamLambdaHandler implements RequestStreamHandler { ### Videos - [Spring on AWS Lambda](https://www.youtube.com/watch?v=A1rYiHTy9Lg&list=PLCOG9xkUD90IDm9tcY-5nMK6X6g8SD-Sz) YouTube Playlist from [@plantpowerjames](https://twitter.com/plantpowerjames) + +### Java samples with different frameworks + +- [Dagger, Micronaut, Quarkus, Spring Boot](https://github.com/aws-samples/serverless-java-frameworks-samples/) \ No newline at end of file diff --git a/samples/micronaut/pet-store/Dockerfile b/samples/micronaut/pet-store/Dockerfile deleted file mode 100644 index 6bb80136..00000000 --- a/samples/micronaut/pet-store/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM amazonlinux:2017.03.1.20170812 as graalvm -# install graal to amazon linux. -ENV LANG=en_US.UTF-8 - -RUN yum install -y gcc gcc-c++ libc6-dev zlib1g-dev curl bash zlib zlib-devel zip \ -# && yum install -y libcxx libcxx-devel llvm-toolset-7 \ - && rm -rf /var/cache/yum - - -ENV GRAAL_VERSION 19.2.0.1 -ENV GRAAL_FILENAME graalvm-ce-linux-amd64-${GRAAL_VERSION}.tar.gz - -RUN curl -4 -L https://github.com/oracle/graal/releases/download/vm-${GRAAL_VERSION}/graalvm-ce-linux-amd64-${GRAAL_VERSION}.tar.gz -o /tmp/${GRAAL_FILENAME} - -RUN tar -zxvf /tmp/${GRAAL_FILENAME} -C /tmp \ - && mv /tmp/graalvm-ce-${GRAAL_VERSION} /usr/lib/graalvm - -RUN rm -rf /tmp/* -RUN /usr/lib/graalvm/bin/gu install native-image -ADD scripts/graalvm-build.sh /usr/local/bin/ -RUN chmod +x /usr/local/bin/graalvm-build.sh -VOLUME ["/func"] -WORKDIR /func -ENTRYPOINT ["/usr/local/bin/graalvm-build.sh"] \ No newline at end of file diff --git a/samples/micronaut/pet-store/README.md b/samples/micronaut/pet-store/README.md deleted file mode 100644 index fc5793a5..00000000 --- a/samples/micronaut/pet-store/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Micronaut Native Pet store example - -The [Micronaut framework](https://micronaut.io/) is compatible with Spring's annotations and makes it easy to use [GraalVM](https://www.graalvm.org/) to build application images into native binaries. Further, Micronaut includes builtin support for AWS Lambda. - -This demo application shows how to use Micronaut to compile our standard pet store example, using Spring annotations, into a native binary with GraalVM and execute it in AWS Lambda. To run this demo, you will need to have [Gradle](https://gradle.org/) installed as well as [Docker](https://www.docker.com/) to run the GraalVM build. - -With all the pre-requisites installed including: - -* JDK 8 or above -* Gradle 5.6.x - -You should be able to build a native image of the application by running the `docker-build.sh` from the repository's root. - -```bash -$ ./docker-build.sh -``` - -The build process will perform the following tasks: -1. Use gradle to compile the application -2. Create a `native-image` folder in the current directory -3. Check if a Docker image called `graalvm-lambda-build` exists on the local machine. If not, create it using the `Dockerfile` in the root of the repository -4. Run the docker image to execute the GraalVM build process - -The output of the build is an executable file called `server` and a deployable zip called `function.zip` in the `native-image` folder: - -```bash -$ ls -lh native-image/ -total 75M --rwxr-xr-x 1 user user 36 Oct 1 16:01 bootstrap --rw-r--r-- 1 user user 18M Oct 1 16:01 function.zip --rwxr-xr-x 1 user user 57M Oct 1 16:01 server -``` - -To run the lambda locally, you can utilize the SAM cli by running `./sam-local.sh`. This should start up the listeners in the `PetsController`, and you can test locally with your preferred http client. - -For example, to test the GET /pets endpoint via curl: -```bash -curl localhost:3000/pets -``` - -You should see JSON output of pets. - -To deploy the application to AWS Lambda you can use the pre-configured `sam-native.yaml` file included in the repo. Using the AWS or SAM CLI, run the following commands: - -```bash -$ aws cloudformation package --template-file sam-native.yaml \ - --output-template-file packaged-sam.yaml \ - --s3-bucket -Uploading to d3e2617f3c8c2e8ca78e35a0dc856884 18553505 / 18553505.0 (100.00%) -Successfully packaged artifacts and wrote output template to file packaged-sam.yaml. -Execute the following command to deploy the packaged template -aws cloudformation deploy --template-file /workspace/graal-spring-demo/packaged-sam.yaml --stack-name - - -$ aws cloudformation deploy --template-file ./packaged-sam.yaml --stack-name MicronautGraalVmDemo --capabilities CAPABILITY_IAM - -Waiting for changeset to be created.. -Waiting for stack create/update to complete -Successfully created/updated stack - MicronautGraalVmDemo -``` - -You can use the AWS CLI to get the API endpoint generated by the deployment process: - -```bash -aws cloudformation describe-stacks --stack-name MicronautGraalVmDemo --query Stacks[0].Outputs[0].OutputValue -"https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets" -``` - -Make a test request to the API endpoint using curl or your preferred http client. - -For example, to check the GET /pets endpoint via curl: -```bash -curl https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets -``` diff --git a/samples/micronaut/pet-store/build.gradle b/samples/micronaut/pet-store/build.gradle deleted file mode 100644 index b262a469..00000000 --- a/samples/micronaut/pet-store/build.gradle +++ /dev/null @@ -1,77 +0,0 @@ -plugins { - id "java" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "application" - id "net.ltgt.apt-eclipse" version "0.21" - id "org.springframework.boot" version "3.0.5" - id "io.spring.dependency-management" version "1.1.0" -} - -version "0.1" -group "graal.spring.demo" - -repositories { - mavenCentral() - maven { url "https://jcenter.bintray.com" } -} - -configurations { - // for dependencies that are needed for development only - developmentOnly -} - -dependencies { - annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") - annotationProcessor "io.micronaut:micronaut-graal" - annotationProcessor "io.micronaut:micronaut-inject-java" - annotationProcessor "io.micronaut:micronaut-validation" - annotationProcessor "io.micronaut.spring:micronaut-spring-boot" - annotationProcessor "io.micronaut.spring:micronaut-spring-boot-annotation" - annotationProcessor "io.micronaut.spring:micronaut-spring-web-annotation" - testAnnotationProcessor "io.micronaut.spring:micronaut-spring-web-annotation" - - compileOnly "com.oracle.substratevm:svm" - implementation platform("io.micronaut:micronaut-bom:$micronautVersion") - implementation "io.micronaut:micronaut-http-client" - implementation "io.micronaut:micronaut-inject" - implementation "io.micronaut:micronaut-validation" - implementation "io.micronaut:micronaut-runtime" - implementation("io.micronaut.aws:micronaut-function-aws-custom-runtime:1.3.2") { - exclude group: "com.fasterxml.jackson.module", module: "jackson-module-afterburner" - } - implementation("io.micronaut.aws:micronaut-function-aws-api-proxy:1.3.2") { - exclude group: "com.fasterxml.jackson.module", module: "jackson-module-afterburner" - } - developmentOnly "io.micronaut:micronaut-http-server-netty" - runtimeOnly "ch.qos.logback:logback-classic:1.2.3" - testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") - testAnnotationProcessor "io.micronaut:micronaut-inject-java" - testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion") - testImplementation "org.junit.jupiter:junit-jupiter-api" - testImplementation "io.micronaut.test:micronaut-test-junit5" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine" - - // spring support - implementation("org.springframework.boot:spring-boot-starter-web") - runtime("io.micronaut.spring:micronaut-spring-boot:5.0.0-M1") - runtime("io.micronaut.spring:micronaut-spring-web:5.0.0-M1") -} - -test.classpath += configurations.developmentOnly - -mainClassName = "graal.spring.demo.Application" -// use JUnit 5 platform -test { - useJUnitPlatform() -} - -shadowJar { - mergeServiceFiles() -} - -run.classpath += configurations.developmentOnly -run.jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote') -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" - options.compilerArgs.add('-parameters') -} diff --git a/samples/micronaut/pet-store/docker-build.sh b/samples/micronaut/pet-store/docker-build.sh deleted file mode 100755 index 41a644cc..00000000 --- a/samples/micronaut/pet-store/docker-build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -DOCKER_IMAGE_NAME=graalvm-lambda-build - -if [[ -d "${PWD}/native-image" ]]; then - rm -rf native-image/* -fi - -gradle clean build --info - -if [[ $? -ne 0 ]]; then - echo "Gradle build failed" - exit 1 -fi - -mkdir -p ${PWD}/native-image - -if [[ "$(docker images -q ${DOCKER_IMAGE_NAME} 2> /dev/null)" == "" ]]; then - docker build . -t ${DOCKER_IMAGE_NAME} -fi - -docker run --rm -v ${PWD}:/func ${DOCKER_IMAGE_NAME} - -if [[ -f "${PWD}/native-image/function.zip" ]]; then - echo "The function is ready to deploy in the ./native-image/function.zip file. Use the sam-native.yaml template to set up your Lambda function and API" -fi diff --git a/samples/micronaut/pet-store/gradle.properties b/samples/micronaut/pet-store/gradle.properties deleted file mode 100644 index 04c81860..00000000 --- a/samples/micronaut/pet-store/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -micronautVersion=1.2.3 \ No newline at end of file diff --git a/samples/micronaut/pet-store/micronaut-cli.yml b/samples/micronaut/pet-store/micronaut-cli.yml deleted file mode 100644 index 262c35c0..00000000 --- a/samples/micronaut/pet-store/micronaut-cli.yml +++ /dev/null @@ -1,5 +0,0 @@ -profile: service -defaultPackage: com.amazonaws.micronaut.demo ---- -testFramework: junit -sourceLanguage: java \ No newline at end of file diff --git a/samples/micronaut/pet-store/sam-local.sh b/samples/micronaut/pet-store/sam-local.sh deleted file mode 100755 index 0c82b851..00000000 --- a/samples/micronaut/pet-store/sam-local.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -./docker-build.sh -sam local start-api -t sam-native.yaml \ No newline at end of file diff --git a/samples/micronaut/pet-store/sam-native.yaml b/samples/micronaut/pet-store/sam-native.yaml deleted file mode 100644 index 76a08d1e..00000000 --- a/samples/micronaut/pet-store/sam-native.yaml +++ /dev/null @@ -1,30 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Micronaut API - graal.spring.demo::graal-spring-demo -Globals: - Api: - EndpointConfiguration: REGIONAL -Resources: - GraalVMApiService: - Type: AWS::Serverless::Function - Properties: - Handler: not.used.in.provided.runtime - Runtime: provided - CodeUri: native-image/function.zip - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Tracing: Active - Timeout: 15 - Events: - GetResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - MicronautNativeServiceApi: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/pets' - Export: - Name: MicronautNativeServiceApi diff --git a/samples/micronaut/pet-store/scripts/bootstrap b/samples/micronaut/pet-store/scripts/bootstrap deleted file mode 100755 index f10361a2..00000000 --- a/samples/micronaut/pet-store/scripts/bootstrap +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -set -euo pipefail -./server \ No newline at end of file diff --git a/samples/micronaut/pet-store/scripts/graalvm-build.sh b/samples/micronaut/pet-store/scripts/graalvm-build.sh deleted file mode 100755 index 44b8b260..00000000 --- a/samples/micronaut/pet-store/scripts/graalvm-build.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -echo "Startin GraalVM build" -/usr/lib/graalvm/bin/native-image -H:+TraceClassInitialization --initialize-at-build-time=reactor.core.publisher.Mono --initialize-at-build-time=reactor.core.publisher.Flux --no-fallback --no-server -cp /func/build/libs/pet-store-*-all.jar -rm -rf /func/native-image/* - -chmod 755 /func/server -mv /func/server /func/native-image/server -cp /func/scripts/bootstrap /func/native-image/bootstrap -cd /func/native-image && zip -j function.zip bootstrap server diff --git a/samples/micronaut/pet-store/settings.gradle b/samples/micronaut/pet-store/settings.gradle deleted file mode 100644 index a6e417eb..00000000 --- a/samples/micronaut/pet-store/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name="pet-store" \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java deleted file mode 100644 index 0340d5c4..00000000 --- a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/Application.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.amazonaws.micronaut.demo; - -import org.springframework.boot.autoconfigure.SpringBootApplication; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import io.micronaut.runtime.Micronaut; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - Logger rootLogger = (ch.qos.logback.classic.Logger)org.slf4j.LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); - rootLogger.setLevel(Level.TRACE); - Micronaut.run(Application.class); - } -} \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java deleted file mode 100644 index a0d43e61..00000000 --- a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/PetsController.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.micronaut.demo; - -import com.amazonaws.micronaut.demo.model.Pet; -import com.amazonaws.micronaut.demo.model.PetData; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import javax.annotation.Nullable; -import java.security.Principal; -import java.util.Optional; -import java.util.UUID; - -@RestController -@EnableWebMvc -public class PetsController { - - private PetData petData; - - @Autowired - public PetsController(PetData data) { - petData = data; - } - - @RequestMapping(path = "/pets", method = RequestMethod.POST) - public Pet createPet(@RequestBody Pet newPet) { - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit, @Nullable Principal principal) { - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(petData.getRandomName()); - newPet.setBreed(petData.getRandomBreed()); - newPet.setDateOfBirth(petData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) - public Pet getPet(@RequestParam("petId") String petId) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(petData.getRandomBreed()); - newPet.setDateOfBirth(petData.getRandomDoB()); - newPet.setName(petData.getRandomName()); - return newPet; - } - -} diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java deleted file mode 100644 index 3f0328ee..00000000 --- a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/Pet.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.micronaut.demo.model; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.micronaut.core.annotation.Introspected; - -import java.util.Date; - -@Introspected -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - @JsonProperty("petId") - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @JsonFormat(pattern = "YYYY-mm-dd") - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java b/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java deleted file mode 100644 index f7bc03c4..00000000 --- a/samples/micronaut/pet-store/src/main/java/com/amazonaws/micronaut/demo/model/PetData.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.micronaut.demo.model; - -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -@Component -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public List getBreeds() { - return breeds; - } - - public List getNames() { - return names; - } - - public String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties b/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties deleted file mode 100644 index fd9f904e..00000000 --- a/samples/micronaut/pet-store/src/main/resources/META-INF/native-image/graal.spring.demo/graal-spring-demo-application/native-image.properties +++ /dev/null @@ -1,4 +0,0 @@ -Args = -H:IncludeResources=application.yml|log4j2.xml \ - -H:Name=server \ - -H:-AllowVMInspection \ - -H:Class=io.micronaut.function.aws.runtime.MicronautLambdaRuntime \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/resources/application.yml b/samples/micronaut/pet-store/src/main/resources/application.yml deleted file mode 100644 index c16e60c1..00000000 --- a/samples/micronaut/pet-store/src/main/resources/application.yml +++ /dev/null @@ -1,6 +0,0 @@ -micronaut: - application: - name: pet-store -jackson: - serialization: - indentOutput: true \ No newline at end of file diff --git a/samples/micronaut/pet-store/src/main/resources/logback.xml b/samples/micronaut/pet-store/src/main/resources/logback.xml deleted file mode 100644 index 6010eb52..00000000 --- a/samples/micronaut/pet-store/src/main/resources/logback.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - true - - - %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n - - - - - - - diff --git a/samples/quarkus/pet-store/README.md b/samples/quarkus/pet-store/README.md deleted file mode 100644 index 3ff1371d..00000000 --- a/samples/quarkus/pet-store/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# Quarkus Native Pet store example - -The [Quarkus framework](https://quarkus.io/) is compatible with Spring's annotations and makes it easy to use [GraalVM](https://www.graalvm.org/) to build application images into native binaries. Further, Micronaut includes builtin support for AWS Lambda. - -This demo application shows how to use Quarkus to compile our standard pet store example, using Spring annotations, into a native binary with GraalVM and execute it in AWS Lambda. To run this demo, you will need to have [Maven](https://maven.apache.org/) installed as well as [Docker](https://www.docker.com/) to build GraalVM native image. - -With all the pre-requisites installed including: - -* JDK 8 or above -* Maven 3.5.x - -You should be able to build a native image of the application by running mvn from the repository's root. - -```bash -$ mvn clean install -Pnative -``` - -The output of the build is a deployable zip called `function.zip` in the `target` folder. - -To run the lambda locally, you can utilize the SAM cli. This should start up the listeners in the `PetsController`, and you can test locally with your preferred http client. - -```bash -sam local start-api -t sam.native.yaml -``` - -For example, to test the GET /pets endpoint via curl: -```bash -curl localhost:3000/pets -``` - -You should see JSON output of pets. - -To deploy the application to AWS Lambda you can use the pre-configured `sam-native.yaml` file included in the repo. Using the AWS or SAM CLI, run the following commands: - -```bash -sam deploy -g -t sam.native.yaml -``` - -You should see the stack deployed successfully: - -```bash -Stack quarkus-sample-pet-store outputs: -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -PetStoreNativeApi - URL for application https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Successfully created/updated stack - quarkus-sample-pet-store in xx-xxxx-1 - -``` - -Make a test request to the API endpoint using curl or your preferred http client. - -For example, to check the GET /pets endpoint via curl: -```bash -curl https://xxxxxxxxxx.execute-api.xx-xxxx-1.amazonaws.com/Prod/pets -``` - -Finally, there’s an environment variable that must be set for native GraalVM deployments. If you look at sam.native.yaml you’ll see this: - -```bash - Environment: - Variables: - DISABLE_SIGNAL_HANDLERS: true -``` - -This environment variable resolves some incompatibilites between GraalVM and the Amazon Lambda Custom Runtime environment. \ No newline at end of file diff --git a/samples/quarkus/pet-store/pom.xml b/samples/quarkus/pet-store/pom.xml deleted file mode 100644 index d13958ad..00000000 --- a/samples/quarkus/pet-store/pom.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - 4.0.0 - com.amazonaws.serverless.sample - serverless-quarkus-example - 2.0-SNAPSHOT - - 3.8.1 - true - 17 - 17 - UTF-8 - UTF-8 - 1.0.1.Final - quarkus-universe-bom - io.quarkus - 1.0.1.Final - 2.22.1 - - - - - ${quarkus.platform.group-id} - ${quarkus.platform.artifact-id} - ${quarkus.platform.version} - pom - import - - - - - - io.quarkus - quarkus-resteasy - - - io.quarkus - quarkus-amazon-lambda-http - - - io.quarkus - quarkus-spring-web - - - io.quarkus - quarkus-junit5 - test - - - io.rest-assured - rest-assured - test - - - - - - io.quarkus - quarkus-maven-plugin - ${quarkus-plugin.version} - - - - build - - - - - - maven-compiler-plugin - ${compiler-plugin.version} - - - maven-surefire-plugin - ${surefire-plugin.version} - - - org.jboss.logmanager.LogManager - - - - - - - - native - - - native - - - - - - maven-failsafe-plugin - ${surefire-plugin.version} - - - - integration-test - verify - - - - ${project.build.directory}/${project.build.finalName}-runner - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - zip-assembly - package - - single - - - function - - src/assembly/zip.xml - - false - false - - - - - - - - native - - - - diff --git a/samples/quarkus/pet-store/sam.native.yaml b/samples/quarkus/pet-store/sam.native.yaml deleted file mode 100644 index 54ca55d0..00000000 --- a/samples/quarkus/pet-store/sam.native.yaml +++ /dev/null @@ -1,36 +0,0 @@ - AWSTemplateFormatVersion: '2010-09-09' - Transform: AWS::Serverless-2016-10-31 - Description: AWS Serverless Quarkus HTTP - com.amazon.quarkus.demo::pet-store - Globals: - Api: - EndpointConfiguration: REGIONAL - BinaryMediaTypes: - - "*/*" - - Resources: - PetStoreNativeFunction: - Type: AWS::Serverless::Function - Properties: - Handler: not.used.in.provided.runtime - Runtime: provided - CodeUri: target/function.zip - MemorySize: 128 - Policies: AWSLambdaBasicExecutionRole - Tracing: Active - Timeout: 15 - Environment: - Variables: - DISABLE_SIGNAL_HANDLERS: true - Events: - GetResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - - Outputs: - PetStoreNativeApi: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/' - Export: - Name: PetStoreNativeApi diff --git a/samples/quarkus/pet-store/src/assembly/zip.xml b/samples/quarkus/pet-store/src/assembly/zip.xml deleted file mode 100644 index ce2cb642..00000000 --- a/samples/quarkus/pet-store/src/assembly/zip.xml +++ /dev/null @@ -1,17 +0,0 @@ - - lambda-package - - zip - - false - - - ${project.build.directory}${file.separator}${artifactId}-${version}-runner - / - bootstrap - 755 - - - diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java deleted file mode 100644 index 57188785..00000000 --- a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/PetsController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.amazonaws.serverless.sample.quarkus; - -import com.amazonaws.serverless.sample.quarkus.model.Pet; -import com.amazonaws.serverless.sample.quarkus.model.PetData; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Optional; -import java.util.UUID; - -@RestController -public class PetsController { - - private PetData petData; - - @Autowired - public PetsController(PetData data) { - petData = data; - } - - @RequestMapping(path = "/pets", method = RequestMethod.POST) - public Pet createPet(@RequestBody Pet newPet) { - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit) { - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(petData.getRandomName()); - newPet.setBreed(petData.getRandomBreed()); - newPet.setDateOfBirth(petData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) - public Pet getPet(@RequestParam("petId") String petId) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(petData.getRandomBreed()); - newPet.setDateOfBirth(petData.getRandomDoB()); - newPet.setName(petData.getRandomName()); - return newPet; - } - -} diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java deleted file mode 100644 index 47521336..00000000 --- a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/Pet.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.amazonaws.serverless.sample.quarkus.model; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.quarkus.runtime.annotations.RegisterForReflection; - -import java.util.Date; - -@RegisterForReflection -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - @JsonProperty("petId") - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @JsonFormat(pattern = "YYYY-mm-dd") - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } - -} diff --git a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java b/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java deleted file mode 100644 index 90b837d0..00000000 --- a/samples/quarkus/pet-store/src/main/java/com/amazonaws/serverless/sample/quarkus/model/PetData.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.amazonaws.serverless.sample.quarkus.model; - -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -@Component -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public List getBreeds() { - return breeds; - } - - public List getNames() { - return names; - } - - public String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/quarkus/pet-store/src/main/resources/application.properties b/samples/quarkus/pet-store/src/main/resources/application.properties deleted file mode 100644 index ee9b09c9..00000000 --- a/samples/quarkus/pet-store/src/main/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -quarkus.native.container-build=true -quarkus.native.container-runtime=docker -quarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.2.1 -quarkus.log.level=INFO \ No newline at end of file From d0fc7b564d3278896d26af85d4c301c45a9f3e7c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 06:04:58 +0200 Subject: [PATCH 0647/1214] chore(deps): Update Spring dependencies (framework to 6.0.9, security to 6.1.0, boot to 3.1.0) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a530a49c..9b0a5f4b 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -122,7 +122,7 @@ org.springframework.security spring-security-web - 6.0.3 + 6.1.0 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index fd0425b4..f4eb8376 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.0.8 - 6.0.3 + 6.0.9 + 6.1.0 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 27aa3949..a36ebb3a 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.0-SNAPSHOT - 6.0.8 - 3.0.6 - 6.0.3 + 6.0.9 + 3.1.0 + 6.1.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 65aad235..713a3cdf 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.8', - 'org.springframework:spring-context:6.0.8', + 'org.springframework:spring-webmvc:6.0.9', + 'org.springframework:spring-context:6.0.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 3e27a514..16b92840 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.0.8 + 6.0.9 4.13.2 2.20.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 45e6ba1b..f5f769dc 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.0.6', + 'org.springframework.boot:spring-boot-starter-web:3.1.0', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index ffbb37fc..ddb9fdb4 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.6 + 3.1.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index de5a543b..124c9253 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.8', - 'org.springframework:spring-context:6.0.8', + 'org.springframework:spring-webmvc:6.0.9', + 'org.springframework:spring-context:6.0.9', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 6500914f..c08616f6 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.0.8 + 6.0.9 4.13.2 2.20.0 17 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index fe271292..763fbea9 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.0.6') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.0') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 69445d34..85c31455 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.0.6 + 3.1.0 From 660dd8dbf88298bf31cc604b574ac283f2558fa2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 06:28:56 +0200 Subject: [PATCH 0648/1214] fix: remove symphonia-logging for now as it is no longer maintained (#496) --- .../src/main/resources/archetype-resources/build.gradle | 1 - samples/jersey/pet-store/build.gradle | 1 - samples/jersey/pet-store/pom.xml | 7 ------- samples/spark/pet-store/build.gradle | 1 - samples/spark/pet-store/pom.xml | 7 ------- samples/springboot3/pet-store/build.gradle | 1 - samples/springboot3/pet-store/pom.xml | 7 ------- 7 files changed, 25 deletions(-) diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 73adc7fe..b7d4672b 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,7 +10,6 @@ dependencies { 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', - 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit:4.13.2") diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 6ff7cdd1..d12cb422 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -9,7 +9,6 @@ dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', - 'io.symphonia:lambda-logging:1.0.3' ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 48749984..86c8eef6 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -75,13 +75,6 @@ ${jackson.version} - - - io.symphonia - lambda-logging - 1.0.3 - - diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 78b700c3..69b1ccf9 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -10,7 +10,6 @@ dependencies { 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', 'com.fasterxml.jackson.core:jackson-databind:2.15.0', - 'io.symphonia:lambda-logging:1.0.3' ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index e2bbd228..99e63df5 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -50,13 +50,6 @@ jackson-databind ${jackson.version} - - - - io.symphonia - lambda-logging - 1.0.3 - diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 763fbea9..eed20ae1 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -12,7 +12,6 @@ dependencies { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', - 'io.symphonia:lambda-logging:1.0.3' ) testImplementation("junit:junit") } diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 85c31455..b58483d7 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -45,13 +45,6 @@ aws-serverless-java-container-springboot3 [2.0-SNAPSHOT,) - - - - io.symphonia - lambda-logging - 1.0.3 - From 34a922fac121dafa193768a762b586a5d783f40d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 06:49:37 +0200 Subject: [PATCH 0649/1214] chore: cleanup Gradle files --- .../src/main/resources/archetype-resources/build.gradle | 1 - samples/springboot3/pet-store/build.gradle | 2 -- 2 files changed, 3 deletions(-) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index f5f769dc..460f0f33 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'java' repositories { - jcenter() mavenLocal() mavenCentral() } diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index eed20ae1..216fc83e 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'java' repositories { - jcenter() mavenLocal() mavenCentral() } @@ -13,7 +12,6 @@ dependencies { }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) - testImplementation("junit:junit") } task buildZip(type: Zip) { From f51f957df0f0160932eb4e525cb81feb6e285f28 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 06:53:28 +0200 Subject: [PATCH 0650/1214] feat: Support Jakarta EE along with Spring Boot 3 support - java17 runtime should be used --- .../src/main/resources/archetype-resources/template.yml | 2 +- .../src/main/resources/archetype-resources/template.yml | 2 +- .../src/main/resources/archetype-resources/template.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml index e6e7e59b..d8c3cca3 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java11 + Runtime: java17 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml index 1c919d02..ec933bc7 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java11 + Runtime: java17 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml index 8d8e0946..183b64d2 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml @@ -32,7 +32,7 @@ Resources: Type: AWS::Serverless::Function Properties: Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java11 + Runtime: java17 CodeUri: . MemorySize: 512 Policies: AWSLambdaBasicExecutionRole From 79cf55d470edfdbcc6fd03cce65e0dfdbcdfc960 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 08:19:34 +0200 Subject: [PATCH 0651/1214] test: move some testutil classes to test-jar (related to #394) --- aws-serverless-java-container-core/pom.xml | 16 +++++++++++++--- .../testutils/AwsProxyRequestBuilder.java | 0 .../testutils/MockLambdaConsoleLogger.java | 0 .../internal/testutils/MockLambdaContext.java | 0 .../proxy/internal/testutils/MockServlet.java | 0 aws-serverless-java-container-jersey/pom.xml | 8 ++++++++ aws-serverless-java-container-spring/pom.xml | 8 ++++++++ .../pom.xml | 8 ++++++++ .../resources/archetype-resources/build.gradle | 1 + .../main/resources/archetype-resources/pom.xml | 10 +++++++++- .../resources/archetype-resources/build.gradle | 1 + .../main/resources/archetype-resources/pom.xml | 12 ++++++++++-- .../resources/archetype-resources/build.gradle | 1 + .../main/resources/archetype-resources/pom.xml | 8 ++++++++ .../resources/archetype-resources/build.gradle | 1 + .../main/resources/archetype-resources/pom.xml | 10 +++++++++- .../resources/archetype-resources/build.gradle | 1 + .../main/resources/archetype-resources/pom.xml | 8 ++++++++ 18 files changed, 86 insertions(+), 7 deletions(-) rename aws-serverless-java-container-core/src/{main => test}/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java (100%) rename aws-serverless-java-container-core/src/{main => test}/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java (100%) rename aws-serverless-java-container-core/src/{main => test}/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaContext.java (100%) rename aws-serverless-java-container-core/src/{main => test}/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java (100%) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9b0a5f4b..f4c89c4e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -115,9 +115,7 @@ org.apache.httpcomponents.core5 httpcore5 5.2.1 - compile - true + test org.springframework.security @@ -129,6 +127,18 @@ + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + test-jar + + + + org.apache.maven.plugins maven-surefire-plugin diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java similarity index 100% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java similarity index 100% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaConsoleLogger.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaContext.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaContext.java similarity index 100% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaContext.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockLambdaContext.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java similarity index 100% rename from aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java rename to aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/MockServlet.java diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e94af803..5467c1ed 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -32,6 +32,14 @@ + + com.amazonaws.serverless + aws-serverless-java-container-core + 2.0-SNAPSHOT + tests + test-jar + test + diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f4eb8376..8ce88a59 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -27,6 +27,14 @@ aws-serverless-java-container-core 2.0-SNAPSHOT + + com.amazonaws.serverless + aws-serverless-java-container-core + 2.0-SNAPSHOT + tests + test-jar + test + diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index a36ebb3a..f358dd8f 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -27,6 +27,14 @@ aws-serverless-java-container-core 2.0-SNAPSHOT + + com.amazonaws.serverless + aws-serverless-java-container-core + 2.0-SNAPSHOT + tests + test-jar + test + org.springframework spring-webflux diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 4f7bda47..0421ac5b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -21,6 +21,7 @@ dependencies { exclude group: 'javax.inject', module: "javax.inject" } + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 5fa0be4f..738639ce 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -25,6 +25,14 @@ aws-serverless-java-container-jersey ${project.version} + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + org.glassfish.jersey.media @@ -68,7 +76,7 @@ junit junit - 4.12 + 4.13.2 test diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index b7d4672b..420550dd 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -12,6 +12,7 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.15.0', ) + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 5e9ea5e3..3c4910a5 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 2.15.0 - 2.9.1 + 2.9.4 @@ -26,6 +26,14 @@ aws-serverless-java-container-spark ${project.version} + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + com.sparkjava @@ -42,7 +50,7 @@ junit junit - 4.12 + 4.13.2 test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 713a3cdf..89d2e99a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -17,6 +17,7 @@ dependencies { 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 16b92840..f3f283cf 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -27,6 +27,14 @@ aws-serverless-java-container-spring ${project.version} + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + org.springframework diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 460f0f33..2c8bf5ca 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,6 +11,7 @@ dependencies { 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index ddb9fdb4..9bb3ee08 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -29,6 +29,14 @@ aws-serverless-java-container-springboot3 ${project.version} + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + org.springframework.boot @@ -44,7 +52,7 @@ junit junit - 4.12 + 4.13.2 test diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index ebd3b1b6..0ff8c3a1 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.20.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 8029323d..8bce22df 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -27,6 +27,14 @@ aws-serverless-java-container-struts ${project.version} + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + org.apache.struts From 1792d599baef22d06149b809544995132012cb76 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 09:14:13 +0200 Subject: [PATCH 0652/1214] chore: cleanup pom files --- aws-serverless-java-container-core/pom.xml | 21 -------------------- aws-serverless-java-container-jersey/pom.xml | 5 ----- aws-serverless-java-container-spark/pom.xml | 1 - aws-serverless-java-container-spring/pom.xml | 3 --- aws-serverless-java-container-struts/pom.xml | 1 - pom.xml | 4 ---- samples/spark/pet-store/pom.xml | 2 -- 7 files changed, 37 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f4c89c4e..23fe75c5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -36,35 +36,30 @@ - com.amazonaws aws-lambda-java-core 1.2.2 - jakarta.servlet jakarta.servlet-api ${servlet.version} - jakarta.ws.rs jakarta.ws.rs-api ${jaxrs.version} - com.fasterxml.jackson.core jackson-databind ${jackson.version} - com.fasterxml.jackson.module jackson-module-afterburner @@ -82,7 +77,6 @@ 2.0.1 - org.apache.httpcomponents httpmime @@ -96,21 +90,6 @@ 5.2.1 test - - org.junit.jupiter - junit-jupiter-api - test - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.junit.jupiter - junit-jupiter-params - test - org.apache.httpcomponents.core5 httpcore5 diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 5467c1ed..f7f7476d 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -41,7 +41,6 @@ test - org.glassfish.jersey.core jersey-server @@ -62,7 +61,6 @@ - commons-codec commons-codec @@ -70,7 +68,6 @@ test - com.fasterxml.jackson.core jackson-databind @@ -79,7 +76,6 @@ test - org.glassfish.jersey.media jersey-media-json-jackson @@ -113,7 +109,6 @@ junit-jupiter test - jakarta.ws.rs jakarta.ws.rs-api diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index f5ea6b86..90ce0e27 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -27,7 +27,6 @@ 1.10-SNAPSHOT - com.sparkjava spark-core diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8ce88a59..d5fe921e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -36,7 +36,6 @@ test - org.springframework spring-webmvc @@ -44,7 +43,6 @@ true - org.springframework spring-test @@ -52,7 +50,6 @@ test - commons-codec commons-codec diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 1c628e94..30e68b0b 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -57,7 +57,6 @@ - commons-codec commons-codec diff --git a/pom.xml b/pom.xml index f885a41f..e5cfc7d6 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,6 @@ - org.junit.jupiter junit-jupiter-api @@ -104,14 +103,12 @@ test - org.slf4j slf4j-api ${slf4j.version} - org.slf4j slf4j-simple @@ -119,7 +116,6 @@ test - org.mockito mockito-core diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 99e63df5..5eef72f4 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -37,14 +37,12 @@ [1.6,) - com.sparkjava spark-core ${spark.version} - com.fasterxml.jackson.core jackson-databind From 48784a1f10eb28ef52a86b6af4d0a835f9c201e7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 09:59:43 +0200 Subject: [PATCH 0653/1214] chore(deps): Update Jackson dependency to 2.15.1 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 0421ac5b..8dc113dd 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 738639ce..74148382 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.1 - 2.15.0 + 2.15.1 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 420550dd..3cd7c716 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 3c4910a5..a09d3555 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.15.0 + 2.15.1 2.9.4 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 89d2e99a..693cd2ab 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 0ff8c3a1..6e323785 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.0') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.1') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1') implementation ('org.apache.logging.log4j:log4j-core:2.20.0') implementation ('org.apache.logging.log4j:log4j-api:2.20.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.20.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 8bce22df..e2688892 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.1.2 - 2.15.0 + 2.15.1 4.13.2 2.20.0 diff --git a/pom.xml b/pom.xml index e5cfc7d6..48536ab5 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 8.2.1 - 2.15.0 + 2.15.1 2.0.7 5.9.3 5.3.1 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index d12cb422..64562ddd 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 86c8eef6..3fb17ea5 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.1 - 2.15.0 + 2.15.1 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 69b1ccf9..840e7116 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 5eef72f4..dc49e00e 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.15.0 + 2.15.1 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 124c9253..f92b56bc 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 2daa1259..a146276a 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.0', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.0', + 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 58d630fc..1ec2bb4a 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.1.2 - 2.15.0 + 2.15.1 4.13.2 2.20.0 From 127333144998c5a23bc48551d29e02012ab9ea12 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 10:31:02 +0200 Subject: [PATCH 0654/1214] chore(deps): Update Jersey dependency to 3.1.2 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f7f7476d..d8645134 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.1 + 3.1.2 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 8dc113dd..bf493c5b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.2") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 74148382..8dde5e32 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.1 + 3.1.2 2.15.1 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 64562ddd..bc4742cd 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.15.1', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.1") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.1") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.2") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 3fb17ea5..585fb9d2 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.1 + 3.1.2 2.15.1 From c95180d8dd0aef5af3235462d073738566b5eed6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 10:56:42 +0200 Subject: [PATCH 0655/1214] chore: Maven plugin updates --- aws-serverless-java-container-core/pom.xml | 3 +- aws-serverless-java-container-jersey/pom.xml | 3 +- aws-serverless-java-container-spark/pom.xml | 3 +- aws-serverless-java-container-spring/pom.xml | 3 +- .../pom.xml | 3 +- aws-serverless-java-container-struts/pom.xml | 1 - pom.xml | 42 ++++++++++++++++++- 7 files changed, 46 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 23fe75c5..3f8ba081 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -121,9 +121,8 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 - always + false diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d8645134..eccc0fb0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -166,9 +166,8 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 - always + false diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 90ce0e27..7243a43d 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -88,9 +88,8 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 - always + false diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d5fe921e..f5f53909 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -209,9 +209,8 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 - always + false diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index f358dd8f..87cf8d7e 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -239,9 +239,8 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 - always + false diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 30e68b0b..73a174c6 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -161,7 +161,6 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 false diff --git a/pom.xml b/pom.xml index 48536ab5..5dc36752 100644 --- a/pom.xml +++ b/pom.xml @@ -151,6 +151,12 @@ + + + org.apache.maven.plugins + maven-enforcer-plugin + + @@ -163,6 +169,9 @@ + + 3.6 + @@ -174,6 +183,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.11.0 1.8 1.8 @@ -186,10 +196,40 @@ maven-javadoc-plugin 3.5.0 - + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-clean-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + + org.apache.maven.plugins + maven-deploy-plugin + 3.1.1 + + + org.apache.maven.plugins + maven-install-plugin + 3.1.1 + org.apache.maven.plugins maven-release-plugin + 3.0.0 clean verify install true From 0601ce7438400594e05b16ecce376952b7860317 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 11:02:01 +0200 Subject: [PATCH 0656/1214] chore: remove old OWASP suppressions --- aws-serverless-java-container-core/pom.xml | 3 -- aws-serverless-java-container-jersey/pom.xml | 3 -- aws-serverless-java-container-spark/pom.xml | 3 -- aws-serverless-java-container-spring/pom.xml | 3 -- .../pom.xml | 3 -- aws-serverless-java-container-struts/pom.xml | 3 -- owasp-suppression.xml | 35 ------------------- 7 files changed, 53 deletions(-) delete mode 100644 owasp-suppression.xml diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3f8ba081..ff6e4b71 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -193,9 +193,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index eccc0fb0..4ae4c732 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -192,9 +192,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 7243a43d..3a5547ea 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -114,9 +114,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f5f53909..b83b4742 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -235,9 +235,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 87cf8d7e..5349fc53 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -265,9 +265,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 73a174c6..ee1784d7 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -187,9 +187,6 @@ ${dependencyCheck.version} true - - ${project.basedir}/../owasp-suppression.xml - 7 false diff --git a/owasp-suppression.xml b/owasp-suppression.xml deleted file mode 100644 index 83fde581..00000000 --- a/owasp-suppression.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - cpe:/a:amazon_aws_project:amazon_aws:7.x-1.2::~~~drupal~~ - - - - cpe:/a:restful_web_services_project:restful_web_services:7.x-2.1::~~~drupal~~ - - - - ^pkg:maven/org\.springframework/spring.*$ - CVE-2016-1000027 - - \ No newline at end of file From e11700a70ad08d04ab5e9dc716372eb13bbace5e Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 3 Feb 2023 16:00:43 +0200 Subject: [PATCH 0657/1214] fix: Provide correct mime type for javascript and css The correct mimetype for javascript is a requirement when loading javascript modules# --- .../proxy/internal/servlet/AwsServletContext.java | 7 ++++++- .../proxy/internal/servlet/AwsServletContextTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 1531315e..3ffca36b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -167,7 +167,12 @@ public String getMimeType(String s) { if (mimeTypes == null) { mimeTypes = new MimetypesFileTypeMap(); } - + if (s.endsWith(".css")) { + return "text/css"; + } + if (s.endsWith(".js")) { + return "application/javascript"; + } // TODO: The getContentType method of the MimetypesFileTypeMap returns application/octet-stream // instead of null when the type cannot be found. We should replace with an implementation that // loads the System mime types ($JAVA_HOME/lib/mime.types diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index ed84462a..4d61f428 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -65,6 +65,13 @@ void getMimeType_mimeTypeOfCorrectFile_expectMime() { mimeType = ctx.getMimeType("file://" + tmpFilePath); assertEquals("text/plain", mimeType); } + @Test + void getMimeType_mimeTypeOfJavascript_expectApplicationJavascript() { + String tmpFilePath = TMP_DIR + "some.js"; + AwsServletContext ctx = new AwsServletContext(null); + String mimeType = ctx.getMimeType(tmpFilePath); + assertEquals("application/javascript", mimeType); + } @Test void getMimeType_unknownExtension_expectAppOctetStream() { From 7d2a74c405eb89a390bfdad2c1f4b49c4987b9f2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 6 Feb 2023 11:24:21 +0100 Subject: [PATCH 0658/1214] fix: provide more accurate result for content type --- .../internal/servlet/AwsServletContext.java | 36 +++++++++++++------ .../servlet/AwsServletContextTest.java | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 3ffca36b..0374c7a0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -27,10 +27,14 @@ import jakarta.activation.MimetypesFileTypeMap; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; @@ -160,23 +164,33 @@ public int getEffectiveMinorVersion() { @Override @SuppressFBWarnings("PATH_TRAVERSAL_IN") // suppressing because we are using the getValidFilePath - public String getMimeType(String s) { - if (s == null || !s.contains(".")) { + public String getMimeType(String file) { + if (file == null || !file.contains(".")) { return null; } + String mimeType = null; + try { + mimeType = Files.probeContentType(Paths.get(file)); + } catch (IOException | InvalidPathException e) { + log("unable to probe for content type, will use fallback", e); + } + + // MimetypesFileTypeMap is kept for backwards compatibility, remove in 2.0 if (mimeTypes == null) { mimeTypes = new MimetypesFileTypeMap(); } - if (s.endsWith(".css")) { - return "text/css"; + String backwardsCompatibleMimeType = mimeTypes.getContentType(file); + // The getContentType method of the MimetypesFileTypeMap + // returns MimetypesFileTypeMap.defaultType = application/octet-stream + // instead of null when the type cannot be found. + if (mimeType == null || (backwardsCompatibleMimeType != null && !backwardsCompatibleMimeType.equals(mimeType) + && !MediaType.APPLICATION_OCTET_STREAM.equals(backwardsCompatibleMimeType))) { + log("using type " + backwardsCompatibleMimeType + " from MimetypesFileTypeMap for " + file + + " instead of " + mimeType + " for backwards compatibility"); + mimeType = backwardsCompatibleMimeType; } - if (s.endsWith(".js")) { - return "application/javascript"; - } - // TODO: The getContentType method of the MimetypesFileTypeMap returns application/octet-stream - // instead of null when the type cannot be found. We should replace with an implementation that - // loads the System mime types ($JAVA_HOME/lib/mime.types - return mimeTypes.getContentType(s); + + return mimeType; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 4d61f428..04209e40 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -70,7 +70,7 @@ void getMimeType_mimeTypeOfJavascript_expectApplicationJavascript() { String tmpFilePath = TMP_DIR + "some.js"; AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType(tmpFilePath); - assertEquals("application/javascript", mimeType); + assertEquals("text/javascript", mimeType); } @Test From 332a8c5f1e98727ce00c3275bd7c5c200bf23577 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 8 Feb 2023 16:38:41 +0100 Subject: [PATCH 0659/1214] fix: provide more accurate result for content type (another try as Files.probeContentType returns null on Lambda) --- .../internal/servlet/AwsServletContext.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 0374c7a0..46328ee7 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -27,14 +27,11 @@ import jakarta.activation.MimetypesFileTypeMap; import java.io.File; -import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.Files; -import java.nio.file.InvalidPathException; -import java.nio.file.Paths; +import java.net.URLConnection; import java.util.*; import java.util.stream.Collectors; @@ -168,26 +165,31 @@ public String getMimeType(String file) { if (file == null || !file.contains(".")) { return null; } - String mimeType = null; - try { - mimeType = Files.probeContentType(Paths.get(file)); - } catch (IOException | InvalidPathException e) { - log("unable to probe for content type, will use fallback", e); - } - // MimetypesFileTypeMap is kept for backwards compatibility, remove in 2.0 + // this implementation would be nice but returns null on Lambda +// try { +// mimeType = Files.probeContentType(Paths.get(file)); +// } catch (IOException | InvalidPathException e) { +// log("unable to probe for content type, will use fallback", e); +// } + if (mimeTypes == null) { mimeTypes = new MimetypesFileTypeMap(); } - String backwardsCompatibleMimeType = mimeTypes.getContentType(file); + String mimeType = mimeTypes.getContentType(file); + // The getContentType method of the MimetypesFileTypeMap // returns MimetypesFileTypeMap.defaultType = application/octet-stream - // instead of null when the type cannot be found. - if (mimeType == null || (backwardsCompatibleMimeType != null && !backwardsCompatibleMimeType.equals(mimeType) - && !MediaType.APPLICATION_OCTET_STREAM.equals(backwardsCompatibleMimeType))) { - log("using type " + backwardsCompatibleMimeType + " from MimetypesFileTypeMap for " + file - + " instead of " + mimeType + " for backwards compatibility"); - mimeType = backwardsCompatibleMimeType; + // instead of null when the type cannot be found. trying to improve the result... + if (mimeType == null || MediaType.APPLICATION_OCTET_STREAM.equals(mimeType)) { + try { + String mimeTypeGuess = URLConnection.guessContentTypeFromName(new File(file).getName()); + if (mimeTypeGuess !=null) { + mimeType = mimeTypeGuess; + } + } catch (Exception e) { + log("couldn't find a better contentType than " + mimeType + " for file " + file, e); + } } return mimeType; From 0c0650edcdf2486868b91d473c7f0434daeccb0f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 11:14:24 +0200 Subject: [PATCH 0660/1214] fix: for 2.0 we return null instead of application/octet-stream if content type cannot be resolved (as per servlet-api docs), a fix to make probeContentType work in Lambda execution environment is being worked on by the Lambda service team --- aws-serverless-java-container-core/pom.xml | 5 ---- .../internal/servlet/AwsServletContext.java | 29 ++++++++----------- .../servlet/AwsServletContextTest.java | 4 +-- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ff6e4b71..21f73ae9 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -71,11 +71,6 @@ commons-fileupload2 2.0-SNAPSHOT - - org.eclipse.angus - angus-mail - 2.0.1 - org.apache.httpcomponents diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 46328ee7..5211e68d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -17,23 +17,25 @@ import com.amazonaws.serverless.proxy.internal.SecurityUtils; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import jakarta.activation.spi.MimeTypeRegistryProvider; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jakarta.servlet.*; import jakarta.servlet.ServletContext; import jakarta.servlet.descriptor.JspConfigDescriptor; -import jakarta.activation.MimetypesFileTypeMap; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Paths; import java.util.*; -import java.util.stream.Collectors; /** @@ -61,7 +63,6 @@ public class AwsServletContext private Map initParameters; private AwsLambdaServletContainerHandler containerHandler; private Logger log = LoggerFactory.getLogger(AwsServletContext.class); - private MimetypesFileTypeMap mimeTypes; // lazily loaded in the getMimeType method //------------------------------------------------------------- @@ -166,22 +167,16 @@ public String getMimeType(String file) { return null; } - // this implementation would be nice but returns null on Lambda -// try { -// mimeType = Files.probeContentType(Paths.get(file)); -// } catch (IOException | InvalidPathException e) { -// log("unable to probe for content type, will use fallback", e); -// } + String mimeType = null; - if (mimeTypes == null) { - mimeTypes = new MimetypesFileTypeMap(); + // may not work on Lambda until mailcap package is present https://github.com/awslabs/aws-serverless-java-container/pull/504 + try { + mimeType = Files.probeContentType(Paths.get(file)); + } catch (IOException | InvalidPathException e) { + log("unable to probe for content type, will use fallback", e); } - String mimeType = mimeTypes.getContentType(file); - // The getContentType method of the MimetypesFileTypeMap - // returns MimetypesFileTypeMap.defaultType = application/octet-stream - // instead of null when the type cannot be found. trying to improve the result... - if (mimeType == null || MediaType.APPLICATION_OCTET_STREAM.equals(mimeType)) { + if (mimeType == null) { try { String mimeTypeGuess = URLConnection.guessContentTypeFromName(new File(file).getName()); if (mimeTypeGuess !=null) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java index 04209e40..58d0b054 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContextTest.java @@ -74,10 +74,10 @@ void getMimeType_mimeTypeOfJavascript_expectApplicationJavascript() { } @Test - void getMimeType_unknownExtension_expectAppOctetStream() { + void getMimeType_unknownExtension_expectNull() { AwsServletContext ctx = new AwsServletContext(null); String mimeType = ctx.getMimeType("myfile.unkext"); - assertEquals("application/octet-stream", mimeType); + assertNull(mimeType); } From 04d8509172ebf17fcfdad5952c154175ae2dba6f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 13:37:54 +0200 Subject: [PATCH 0661/1214] test: move to Apache HTTP Client 5 for testing --- aws-serverless-java-container-core/pom.xml | 19 ------------------- .../internal/LambdaContainerHandlerTest.java | 2 +- .../AwsProxyHttpServletRequestFormTest.java | 10 +++++----- .../testutils/AwsProxyRequestBuilder.java | 15 ++++++++------- .../archetype-resources/build.gradle | 1 + .../resources/archetype-resources/pom.xml | 6 ++++++ .../archetype-resources/build.gradle | 1 + .../resources/archetype-resources/pom.xml | 6 ++++++ .../archetype-resources/build.gradle | 1 + .../resources/archetype-resources/pom.xml | 6 ++++++ .../archetype-resources/build.gradle | 1 + .../resources/archetype-resources/pom.xml | 6 ++++++ .../archetype-resources/build.gradle | 1 + .../resources/archetype-resources/pom.xml | 6 ++++++ pom.xml | 7 +++++++ 15 files changed, 56 insertions(+), 32 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 21f73ae9..9d8b5a13 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -72,25 +72,6 @@ 2.0-SNAPSHOT - - org.apache.httpcomponents - httpmime - 4.5.14 - compile - - - - org.apache.httpcomponents.client5 - httpclient5 - 5.2.1 - test - - - org.apache.httpcomponents.core5 - httpcore5 - 5.2.1 - test - org.springframework.security spring-security-web diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java index 98b45fd1..d6af5112 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandlerTest.java @@ -10,7 +10,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.apache.http.impl.execchain.RequestAbortedException; +import org.apache.hc.client5.http.impl.classic.RequestAbortedException; import org.junit.jupiter.api.Test; import jakarta.servlet.http.HttpServletRequest; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 07a2f410..79bfa6cd 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -5,9 +5,9 @@ import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; import org.apache.commons.io.IOUtils; -import org.apache.http.HttpEntity; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;; import org.junit.jupiter.api.Test; import jakarta.servlet.ServletException; @@ -71,7 +71,7 @@ void postForm_getParam_getEncodedFullValue() { void postForm_getParts_parsing() { try { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(MULTIPART_FORM_DATA.getContentType().getName(), MULTIPART_FORM_DATA.getContentType().getValue()) + .header(HttpHeaders.CONTENT_TYPE, MULTIPART_FORM_DATA.getContentType()) //.header(formData.getContentEncoding().getName(), formData.getContentEncoding().getValue()) .body(IOUtils.toString(MULTIPART_FORM_DATA.getContent(), Charset.defaultCharset())) .build(); @@ -90,7 +90,7 @@ void postForm_getParts_parsing() { void multipart_getParts_binary() { try { AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") - .header(MULTIPART_BINARY_DATA.getContentType().getName(), MULTIPART_BINARY_DATA.getContentType().getValue()) + .header(HttpHeaders.CONTENT_TYPE, MULTIPART_BINARY_DATA.getContentType()) .header(HttpHeaders.CONTENT_LENGTH, MULTIPART_BINARY_DATA.getContentLength() + "") .binaryBody(MULTIPART_BINARY_DATA.getContent()) .build(); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index adcebb89..9df66a89 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -18,10 +18,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; -import org.apache.http.HttpEntity; -import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.apache.http.entity.mime.content.ByteArrayBody; -import org.apache.http.entity.mime.content.StringBody; +import org.apache.hc.core5.http.ContentType; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; +import org.apache.hc.client5.http.entity.mime.ByteArrayBody; +import org.apache.hc.client5.http.entity.mime.StringBody; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; @@ -162,7 +163,7 @@ public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, by return this; } - public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) + public AwsProxyRequestBuilder formTextFieldPart(String fieldName, String fieldValue) throws IOException { if (request.getMultiValueHeaders() == null) { request.setMultiValueHeaders(new Headers()); @@ -170,7 +171,7 @@ public AwsProxyRequestBuilder formFieldPart(String fieldName, String fieldValue) if (multipartBuilder == null) { multipartBuilder = MultipartEntityBuilder.create(); } - multipartBuilder.addPart(fieldName, new StringBody(fieldValue)); + multipartBuilder.addPart(fieldName, new StringBody(fieldValue, ContentType.TEXT_PLAIN)); buildMultipartBody(); return this; } @@ -188,7 +189,7 @@ private void buildMultipartBody() request.setBody(Base64.getMimeEncoder().encodeToString(finalBuffer)); request.setIsBase64Encoded(true); this.request.setMultiValueHeaders(new Headers()); - header(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType().getValue()); + header(HttpHeaders.CONTENT_TYPE, bodyEntity.getContentType()); header(HttpHeaders.CONTENT_LENGTH, bodyEntity.getContentLength() + ""); } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index bf493c5b..3b18be4c 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,6 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 8dde5e32..4196c83e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -33,6 +33,12 @@ test-jar test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + org.glassfish.jersey.media diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 3cd7c716..b2d0dbe0 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,6 +13,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index a09d3555..a4281cde 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -34,6 +34,12 @@ test-jar test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + com.sparkjava diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 693cd2ab..45f39c26 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,6 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index f3f283cf..d7e6e563 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -35,6 +35,12 @@ test-jar test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + org.springframework diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 2c8bf5ca..94897b2d 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -12,6 +12,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation("junit:junit:4.13.2") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 9bb3ee08..745498e5 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -37,6 +37,12 @@ test-jar test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + org.springframework.boot diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 6e323785..71f27009 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -42,6 +42,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.5.1') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation('junit:junit:4.13.2') testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index e2688892..bb558e1c 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -35,6 +35,12 @@ test-jar test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + org.apache.struts diff --git a/pom.xml b/pom.xml index 5dc36752..84dd8961 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,13 @@ test + + org.apache.httpcomponents.client5 + httpclient5 + 5.2.1 + test + + org.mockito mockito-core From 9c05f8527b7cc50f8be88b09feea2b81590606ce Mon Sep 17 00:00:00 2001 From: mbfreder Date: Fri, 28 Apr 2023 14:22:26 -0700 Subject: [PATCH 0662/1214] refactor: temporarily removing fileupload support until release version is available (https://issues.apache.org/jira/browse/FILEUPLOAD-309) --- aws-serverless-java-container-core/pom.xml | 6 +-- .../servlet/AwsHttpServletRequest.java | 39 +------------------ .../AwsProxyHttpServletRequestFormTest.java | 6 ++- .../testutils/AwsProxyRequestBuilder.java | 7 +--- .../proxy/jersey/JerseyParamEncodingTest.java | 1 + .../proxy/spring/SpringAwsProxyTest.java | 2 + 6 files changed, 13 insertions(+), 48 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9d8b5a13..26bafa9a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -67,9 +67,9 @@ - org.apache.commons - commons-fileupload2 - 2.0-SNAPSHOT + commons-io + commons-io + 2.11.0 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 99b2782c..44fd84a9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -22,11 +22,6 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.commons.fileupload2.FileItem; -import org.apache.commons.fileupload2.FileUploadException; -import org.apache.commons.fileupload2.disk.DiskFileItemFactory; -import org.apache.commons.fileupload2.jaksrvlt.JakSrvltFileUpload; -import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; @@ -508,39 +503,7 @@ protected Map> getFormUrlEncodedParametersMap() { @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) protected Map getMultipartFormParametersMap() { - if (multipartFormParameters != null) { - return multipartFormParameters; - } - if (!JakSrvltFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type - multipartFormParameters = new HashMap<>(); - return multipartFormParameters; - } - Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - - JakSrvltFileUpload upload = new JakSrvltFileUpload(new DiskFileItemFactory()); - - try { - List items = upload.parseRequest(this); - for (FileItem item : items) { - String fileName = FilenameUtils.getName(item.getName()); - AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(item.getFieldName()); - newPart.setSubmittedFileName(fileName); - newPart.setContentType(item.getContentType()); - newPart.setSize(item.getSize()); - item.getHeaders().getHeaderNames().forEachRemaining(h -> { - newPart.addHeader(h, item.getHeaders().getHeader(h)); - }); - - multipartFormParameters.put(item.getFieldName(), newPart); - } - } catch (FileUploadException e) { - Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - log.error("Could not read multipart upload file", e); - } - Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); - return multipartFormParameters; + throw new UnsupportedOperationException(); } protected String[] getQueryParamValues(MultiValuedTreeMap qs, String key, boolean isCaseSensitive) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 79bfa6cd..efe32ba2 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -7,7 +7,8 @@ import org.apache.commons.io.IOUtils; import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; -import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;; +import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import jakarta.servlet.ServletException; @@ -51,6 +52,7 @@ public class AwsProxyHttpServletRequestFormTest { .build(); private static final String ENCODED_FORM_ENTITY = PART_KEY_1 + "=" + ENCODED_VALUE + "&" + PART_KEY_2 + "=" + PART_VALUE_2; + @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void postForm_getParam_getEncodedFullValue() { try { @@ -67,6 +69,7 @@ void postForm_getParam_getEncodedFullValue() { } } + @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void postForm_getParts_parsing() { try { @@ -86,6 +89,7 @@ void postForm_getParts_parsing() { } } + @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void multipart_getParts_binary() { try { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 9df66a89..725fada8 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -155,12 +155,7 @@ public AwsProxyRequestBuilder form(String key, String value) { } public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, byte[] content) throws IOException { - if (multipartBuilder == null) { - multipartBuilder = MultipartEntityBuilder.create(); - } - multipartBuilder.addPart(fieldName, new ByteArrayBody(content, fileName)); - buildMultipartBody(); - return this; + throw new UnsupportedOperationException(); } public AwsProxyRequestBuilder formTextFieldPart(String fieldName, String fieldValue) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 9dc1ab32..6c575da6 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -263,6 +263,7 @@ void queryParam_listOfString_expectCorrectLength(String reqType) { validateSingleValueModel(resp, "3"); } + @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @MethodSource("data") @ParameterizedTest void multipart_getFileSize_expectCorrectLength(String reqType) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 1101efc8..f78d4381 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.web.servlet.DispatcherServlet; @@ -468,6 +469,7 @@ void contextPath_generateLink_returnsCorrectPath(String reqType) { SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } + @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @MethodSource("data") @ParameterizedTest void multipart_getFileName_returnsCorrectFileName(String reqType) From ac04f4c0044bcdc8810663730bdf1d196fbd45ea Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 13:57:43 +0200 Subject: [PATCH 0663/1214] chore(deps): Update Commons IO dependency to 2.12.0 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-struts/pom.xml | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 26bafa9a..0da33fdd 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -69,7 +69,7 @@ commons-io commons-io - 2.11.0 + 2.12.0 diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index ee1784d7..d38edb3c 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -94,11 +94,6 @@ - - commons-io - commons-io - 2.11.0 - org.apache.commons commons-text From c8c62f4f6abf40bb554d98bdb3dc6f7d8ff77470 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 14:32:58 +0200 Subject: [PATCH 0664/1214] chore: Use Corretto 17 for release builds --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 64ec8e2d..7ff2bea7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'corretto' - java-version: 8 + java-version: 17 server-id: sonatype-nexus-staging server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD From 411214de82c9c838a0d7b550a14dd093e6b356b3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 15:29:33 +0200 Subject: [PATCH 0665/1214] chore: Maven release plugin configuration --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 84dd8961..1dd7c8af 100644 --- a/pom.xml +++ b/pom.xml @@ -238,8 +238,6 @@ maven-release-plugin 3.0.0 - clean verify install - true chore: release - From 0e13fda7746c1e5256eae275507ebd6356e14a9d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 15:39:48 +0200 Subject: [PATCH 0666/1214] chore: Maven release plugin configuration --- pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1dd7c8af..5931bd95 100644 --- a/pom.xml +++ b/pom.xml @@ -236,8 +236,10 @@ org.apache.maven.plugins maven-release-plugin - 3.0.0 + 2.5.3 + clean verify install + true chore: release - From 21eeec525ab4fef6958e157cce8e8a4a7d0a3ca0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 16:01:40 +0200 Subject: [PATCH 0667/1214] chore: Maven release plugin configuration (avoid archetype integ tests run twice) --- aws-serverless-jersey-archetype/pom.xml | 7 ------- aws-serverless-spring-archetype/pom.xml | 7 ------- aws-serverless-springboot3-archetype/pom.xml | 7 ------- pom.xml | 3 ++- 4 files changed, 2 insertions(+), 22 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 51c855ac..31500701 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -66,13 +66,6 @@ org.apache.maven.plugins maven-archetype-plugin 3.2.1 - - - - integration-test - - - diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 3a17f167..178e0de0 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -67,13 +67,6 @@ org.apache.maven.plugins maven-archetype-plugin 3.2.1 - - - - integration-test - - - diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 21e17602..62efb1a2 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -66,13 +66,6 @@ org.apache.maven.plugins maven-archetype-plugin 3.2.1 - - - - integration-test - - - diff --git a/pom.xml b/pom.xml index 5931bd95..592f43b4 100644 --- a/pom.xml +++ b/pom.xml @@ -236,11 +236,12 @@ org.apache.maven.plugins maven-release-plugin - 2.5.3 + 3.0.0 clean verify install true chore: release - + true From 2fdb951dd3300de9f2d7ef1a23544098e8d96013 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 16:14:25 +0200 Subject: [PATCH 0668/1214] chore: Maven release plugin configuration (downgrade maven-archetype-plugin to fix integ-tests) --- aws-serverless-jersey-archetype/pom.xml | 9 ++++++++- aws-serverless-spring-archetype/pom.xml | 9 ++++++++- aws-serverless-springboot3-archetype/pom.xml | 9 ++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 31500701..d2bace46 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -65,7 +65,14 @@ org.apache.maven.plugins maven-archetype-plugin - 3.2.1 + 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 178e0de0..6f5f2d7d 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -66,7 +66,14 @@ org.apache.maven.plugins maven-archetype-plugin - 3.2.1 + 3.0.1 + + + + integration-test + + + diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 62efb1a2..09c1617b 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -65,7 +65,14 @@ org.apache.maven.plugins maven-archetype-plugin - 3.2.1 + 3.0.1 + + + + integration-test + + + From 49cd3204b61605729de6d9364e5bb6b400555e69 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 14:22:34 +0000 Subject: [PATCH 0669/1214] chore: release - prepare release aws-serverless-java-container-2.0.0-M1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0da33fdd..819cce1d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 4ae4c732..b54d0001 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b83b4742..fb7ac742 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 5349fc53..89a7d24d 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0-SNAPSHOT + 2.0.0-M1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0-SNAPSHOT + 2.0.0-M1 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d2bace46..7e21a9d2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 6f5f2d7d..e6026b8a 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 09c1617b..abf8a9a5 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/pom.xml b/pom.xml index 592f43b4..a2185f05 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0-SNAPSHOT + 2.0.0-M1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 From 6271330c1bcaa6bcf250e4d08febb50cc71f8252 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 14:22:36 +0000 Subject: [PATCH 0670/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 819cce1d..3693ded8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b54d0001..d4e9f42a 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index fb7ac742..c734576a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 89a7d24d..8e7d42a0 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-M1 + 2.0.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 7e21a9d2..e328fee7 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e6026b8a..747ff083 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index abf8a9a5..8f478b22 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/pom.xml b/pom.xml index a2185f05..55d546b0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-M1 + 2.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD From d04202ecaafe3663540e792cbede96c0ac224bbe Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 16:35:44 +0200 Subject: [PATCH 0671/1214] chore: set next version to 2.0.0-SNAPSHOT (although Spark/ Struts are currently not being build for 2.x) --- aws-serverless-java-container-spark/pom.xml | 6 +++--- aws-serverless-java-container-struts/pom.xml | 6 +++--- aws-serverless-spark-archetype/pom.xml | 4 ++-- aws-serverless-struts-archetype/pom.xml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 3a5547ea..8dd1abe2 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spark implementation Allows Java applications written for Spark to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index d38edb3c..4f1c10b7 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT @@ -23,7 +23,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index ca3ad395..90dcabf4 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spark-archetype - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index b91cfa4b..1d0e078a 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 1.10-SNAPSHOT + 2.0.0-SNAPSHOT maven-archetype From a1eaf0d06aa53e520c8683f34a5600cee75db40c Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 14:58:38 +0000 Subject: [PATCH 0672/1214] chore: release - prepare release aws-serverless-java-container-2.0.0-M1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3693ded8..819cce1d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d4e9f42a..b54d0001 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c734576a..fb7ac742 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 8e7d42a0..89a7d24d 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-SNAPSHOT + 2.0.0-M1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e328fee7..7e21a9d2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 747ff083..e6026b8a 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 8f478b22..abf8a9a5 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/pom.xml b/pom.xml index 55d546b0..a2185f05 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-SNAPSHOT + 2.0.0-M1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 From 5fb45c1f77a8ad687b6f6921f79f350ed5bc26f0 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 14:58:41 +0000 Subject: [PATCH 0673/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 819cce1d..3693ded8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b54d0001..d4e9f42a 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index fb7ac742..c734576a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 89a7d24d..8e7d42a0 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-M1 + 2.0.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 7e21a9d2..e328fee7 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e6026b8a..747ff083 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index abf8a9a5..8f478b22 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/pom.xml b/pom.xml index a2185f05..55d546b0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-M1 + 2.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD From 482a36270eb91c70b170a2f84585f566089df1a4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 16:48:43 +0200 Subject: [PATCH 0674/1214] chore: Maven release plugin configuration --- pom.xml | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 55d546b0..dbc78441 100644 --- a/pom.xml +++ b/pom.xml @@ -238,6 +238,7 @@ maven-release-plugin 3.0.0 + serverless-java-container-release clean verify install true chore: release - @@ -285,13 +286,7 @@ - release-sign-artifacts - - - performRelease - true - - + serverless-java-container-release @@ -308,6 +303,31 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar-no-fork + + + + From 4782761e7fb0553d6f5ba3e18bf542ec90704c21 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 15:19:58 +0000 Subject: [PATCH 0675/1214] chore: release - prepare release aws-serverless-java-container-2.0.0-M1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3693ded8..819cce1d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d4e9f42a..b54d0001 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c734576a..fb7ac742 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 8e7d42a0..89a7d24d 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-SNAPSHOT + 2.0.0-M1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M1 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e328fee7..7e21a9d2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 747ff083..e6026b8a 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 8f478b22..abf8a9a5 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-SNAPSHOT + 2.0.0-M1 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 diff --git a/pom.xml b/pom.xml index dbc78441..3dadc5ed 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-SNAPSHOT + 2.0.0-M1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M1 From 379f48bc32078d3a7a29063927012a00cd8b375f Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 19 May 2023 15:20:00 +0000 Subject: [PATCH 0676/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 819cce1d..3693ded8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index b54d0001..d4e9f42a 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index fb7ac742..c734576a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 89a7d24d..8e7d42a0 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-M1 + 2.0.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M1 + 2.0.0-SNAPSHOT 6.0.9 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M1 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 7e21a9d2..e328fee7 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e6026b8a..747ff083 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index abf8a9a5..8f478b22 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M1 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-M1 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD diff --git a/pom.xml b/pom.xml index 3dadc5ed..dbc78441 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-M1 + 2.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M1 + HEAD From 02321c4cff616554c7266a843d494b9e8a523bd0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 17:30:26 +0200 Subject: [PATCH 0677/1214] refactor: reintegrate fileupload support This reverts commit 9c05f852 --- aws-serverless-java-container-core/pom.xml | 6 +-- .../servlet/AwsHttpServletRequest.java | 39 ++++++++++++++++++- .../AwsProxyHttpServletRequestFormTest.java | 4 -- .../testutils/AwsProxyRequestBuilder.java | 7 +++- .../proxy/jersey/JerseyParamEncodingTest.java | 1 - .../proxy/spring/SpringAwsProxyTest.java | 2 - 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3693ded8..6fedd2e1 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -67,9 +67,9 @@ - commons-io - commons-io - 2.12.0 + org.apache.commons + commons-fileupload2 + 2.0-SNAPSHOT diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 44fd84a9..99b2782c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -22,6 +22,11 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.apache.commons.fileupload2.FileItem; +import org.apache.commons.fileupload2.FileUploadException; +import org.apache.commons.fileupload2.disk.DiskFileItemFactory; +import org.apache.commons.fileupload2.jaksrvlt.JakSrvltFileUpload; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; import org.slf4j.Logger; @@ -503,7 +508,39 @@ protected Map> getFormUrlEncodedParametersMap() { @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) protected Map getMultipartFormParametersMap() { - throw new UnsupportedOperationException(); + if (multipartFormParameters != null) { + return multipartFormParameters; + } + if (!JakSrvltFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type + multipartFormParameters = new HashMap<>(); + return multipartFormParameters; + } + Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + JakSrvltFileUpload upload = new JakSrvltFileUpload(new DiskFileItemFactory()); + + try { + List items = upload.parseRequest(this); + for (FileItem item : items) { + String fileName = FilenameUtils.getName(item.getName()); + AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); + newPart.setName(item.getFieldName()); + newPart.setSubmittedFileName(fileName); + newPart.setContentType(item.getContentType()); + newPart.setSize(item.getSize()); + item.getHeaders().getHeaderNames().forEachRemaining(h -> { + newPart.addHeader(h, item.getHeaders().getHeader(h)); + }); + + multipartFormParameters.put(item.getFieldName(), newPart); + } + } catch (FileUploadException e) { + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + log.error("Could not read multipart upload file", e); + } + Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); + return multipartFormParameters; } protected String[] getQueryParamValues(MultiValuedTreeMap qs, String key, boolean isCaseSensitive) { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index efe32ba2..98906632 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -8,7 +8,6 @@ import org.apache.hc.core5.http.ContentType; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import jakarta.servlet.ServletException; @@ -52,7 +51,6 @@ public class AwsProxyHttpServletRequestFormTest { .build(); private static final String ENCODED_FORM_ENTITY = PART_KEY_1 + "=" + ENCODED_VALUE + "&" + PART_KEY_2 + "=" + PART_VALUE_2; - @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void postForm_getParam_getEncodedFullValue() { try { @@ -69,7 +67,6 @@ void postForm_getParam_getEncodedFullValue() { } } - @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void postForm_getParts_parsing() { try { @@ -89,7 +86,6 @@ void postForm_getParts_parsing() { } } - @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @Test void multipart_getParts_binary() { try { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 725fada8..9df66a89 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -155,7 +155,12 @@ public AwsProxyRequestBuilder form(String key, String value) { } public AwsProxyRequestBuilder formFilePart(String fieldName, String fileName, byte[] content) throws IOException { - throw new UnsupportedOperationException(); + if (multipartBuilder == null) { + multipartBuilder = MultipartEntityBuilder.create(); + } + multipartBuilder.addPart(fieldName, new ByteArrayBody(content, fileName)); + buildMultipartBody(); + return this; } public AwsProxyRequestBuilder formTextFieldPart(String fieldName, String fieldValue) diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 6c575da6..9dc1ab32 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -263,7 +263,6 @@ void queryParam_listOfString_expectCorrectLength(String reqType) { validateSingleValueModel(resp, "3"); } - @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @MethodSource("data") @ParameterizedTest void multipart_getFileSize_expectCorrectLength(String reqType) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index f78d4381..1101efc8 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -19,7 +19,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.web.servlet.DispatcherServlet; @@ -469,7 +468,6 @@ void contextPath_generateLink_returnsCorrectPath(String reqType) { SpringLambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } - @Disabled("Disabled until new release of commons-fileupload based on Jakarta APIs") @MethodSource("data") @ParameterizedTest void multipart_getFileName_returnsCorrectFileName(String reqType) From a1054e9be5e3ad43fcf761c0e21c5bcf3d906bb5 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 19 May 2023 20:32:06 +0200 Subject: [PATCH 0678/1214] doc: add Spring Boot 3 quick start to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9c483ae2..33622db3 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Currently the following versions are maintained: Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) +* [Spring Boot 3 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot3) * [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) From 46312b7e765a2a8db90401c4b5021b8ae47cbd61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 May 2023 18:37:00 +0000 Subject: [PATCH 0679/1214] chore(deps): bump maven-surefire-plugin from 3.0.0 to 3.1.0 Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0...surefire-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbc78441..0745c0a3 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.1.0 org.apache.maven.plugins From da6af0f08ff5f2416cd7abfac4b681aa3ecaecfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 May 2023 04:56:53 +0000 Subject: [PATCH 0680/1214] chore(deps): bump maven-source-plugin from 3.2.1 to 3.3.0 Bumps [maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.2.1 to 3.3.0. - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.2.1...maven-source-plugin-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-source-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbc78441..eb5ef395 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ org.apache.maven.plugins maven-source-plugin - 3.2.1 + 3.3.0 attach-sources From 25c58d8297af593e7fefad2338ba90cfd8c384ee Mon Sep 17 00:00:00 2001 From: Salman Date: Mon, 22 May 2023 23:54:36 +0200 Subject: [PATCH 0681/1214] junit version changed --- .../archetype-resources/build.gradle | 3 ++- .../resources/archetype-resources/pom.xml | 20 +++++++++++++++---- .../test/java/StreamLambdaHandlerTest.java | 8 ++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 3b18be4c..1f27cfcb 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation("junit:junit:4.13.2") + testImplementation(platform('org.junit:junit-bom:5.9.3')) + testImplementation('org.junit.jupiter:junit-jupiter') } task buildZip(type: Zip) { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 4196c83e..25ba806b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,4 +1,4 @@ -#set($dollar = '$') + 4.0.0 @@ -17,6 +17,7 @@ 3.1.2 2.15.1 + 5.9.3 @@ -80,13 +81,24 @@ - junit - junit - 4.13.2 + org.junit.jupiter + junit-jupiter test + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + shaded-jar diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 4a6b00b0..53db9b16 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -7,8 +7,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.core.HttpHeaders; @@ -19,7 +19,7 @@ import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { @@ -27,7 +27,7 @@ public class StreamLambdaHandlerTest { private static StreamLambdaHandler handler; private static Context lambdaContext; - @BeforeClass + @BeforeAll public static void setUp() { handler = new StreamLambdaHandler(); lambdaContext = new MockLambdaContext(); From 5a77b5def4329d2175eac14c382335c2f70d6a6d Mon Sep 17 00:00:00 2001 From: Salman Date: Wed, 24 May 2023 00:26:25 +0200 Subject: [PATCH 0682/1214] junit version changed for other archetypes and test classes --- .../archetype-resources/build.gradle | 8 ++++++-- .../resources/archetype-resources/pom.xml | 2 +- .../archetype-resources/build.gradle | 7 ++++++- .../resources/archetype-resources/pom.xml | 18 +++++++++++++++--- .../test/java/StreamLambdaHandlerTest.java | 9 ++++----- .../archetype-resources/build.gradle | 7 ++++++- .../resources/archetype-resources/pom.xml | 19 +++++++++++++++---- .../test/java/StreamLambdaHandlerTest.java | 8 ++++---- .../archetype-resources/build.gradle | 7 ++++++- .../resources/archetype-resources/pom.xml | 18 +++++++++++++++--- .../test/java/StreamLambdaHandlerTest.java | 9 ++++----- .../archetype-resources/build.gradle | 7 ++++++- .../resources/archetype-resources/pom.xml | 19 +++++++++++++++---- .../test/java/StreamLambdaHandlerTest.java | 9 ++++----- 14 files changed, 107 insertions(+), 40 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 1f27cfcb..2b4c85b7 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,8 +23,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform('org.junit:junit-bom:5.9.3')) - testImplementation('org.junit.jupiter:junit-jupiter') + testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation("org.junit.jupiter:junit-jupiter") } task buildZip(type: Zip) { @@ -35,4 +35,8 @@ task buildZip(type: Zip) { } } +test { + useJUnitPlatform() +} + build.dependsOn buildZip diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 25ba806b..ea766106 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -1,4 +1,4 @@ - +#set($dollar = '$') 4.0.0 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index b2d0dbe0..6c27a2dd 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation("junit:junit:4.13.2") + testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation("org.junit.jupiter:junit-jupiter") } task buildZip(type: Zip) { @@ -32,4 +33,8 @@ task buildZip(type: Zip) { } } +test { + useJUnitPlatform() +} + build.dependsOn buildZip diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index a4281cde..afa8a6a5 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,6 +18,7 @@ 1.8 2.15.1 2.9.4 + 5.9.3 @@ -54,13 +55,24 @@ - junit - junit - 4.13.2 + org.junit.jupiter + junit-jupiter test + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + shaded-jar diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 4a6b00b0..26d5360b 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -7,8 +7,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.core.HttpHeaders; @@ -19,15 +19,14 @@ import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.*; - +import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { private static StreamLambdaHandler handler; private static Context lambdaContext; - @BeforeClass + @BeforeAll public static void setUp() { handler = new StreamLambdaHandler(); lambdaContext = new MockLambdaContext(); diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 45f39c26..5d3bd4f4 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation("junit:junit:4.13.2") + testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation("org.junit.jupiter:junit-jupiter") } task buildZip(type: Zip) { @@ -30,4 +31,8 @@ task buildZip(type: Zip) { } } +test { + useJUnitPlatform() +} + build.dependsOn buildZip diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index d7e6e563..614d6b6d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.0.9 - 4.13.2 + 5.9.3 2.20.0 @@ -92,14 +92,25 @@ - junit - junit - \${junit.version} + org.junit.jupiter + junit-jupiter test + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + shaded-jar diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 4a6b00b0..53db9b16 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -7,8 +7,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.core.HttpHeaders; @@ -19,7 +19,7 @@ import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { @@ -27,7 +27,7 @@ public class StreamLambdaHandlerTest { private static StreamLambdaHandler handler; private static Context lambdaContext; - @BeforeClass + @BeforeAll public static void setUp() { handler = new StreamLambdaHandler(); lambdaContext = new MockLambdaContext(); diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 94897b2d..0daf1298 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation("junit:junit:4.13.2") + testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation("org.junit.jupiter:junit-jupiter") } task buildZip(type: Zip) { @@ -26,4 +27,8 @@ task buildZip(type: Zip) { } } +test { + useJUnitPlatform() +} + build.dependsOn buildZip diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 745498e5..7ded34e4 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,6 +21,7 @@ 17 + 5.9.3 @@ -56,13 +57,24 @@ - junit - junit - 4.13.2 + org.junit.jupiter + junit-jupiter test + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + shaded-jar diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 4a6b00b0..26d5360b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -7,8 +7,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.core.HttpHeaders; @@ -19,15 +19,14 @@ import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.*; - +import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { private static StreamLambdaHandler handler; private static Context lambdaContext; - @BeforeClass + @BeforeAll public static void setUp() { handler = new StreamLambdaHandler(); lambdaContext = new MockLambdaContext(); diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 71f27009..de4af497 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -43,7 +43,8 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation('junit:junit:4.13.2') + testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } @@ -57,4 +58,8 @@ task buildZip(type: Zip) { } } +test { + useJUnitPlatform() +} + build.dependsOn buildZip diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index bb558e1c..021fbd3c 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 6.1.2 2.15.1 - 4.13.2 + 5.9.3 2.20.0 @@ -134,13 +134,24 @@ - junit - junit - \${junit.version} + org.junit.jupiter + junit-jupiter test + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index fd63840b..87586777 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -9,8 +9,8 @@ import com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.core.HttpHeaders; @@ -21,15 +21,14 @@ import java.io.IOException; import java.io.InputStream; -import static org.junit.Assert.*; - +import static org.junit.jupiter.api.Assertions.*; public class StreamLambdaHandlerTest { private static StrutsLambdaHandler handler; private static Context lambdaContext; - @BeforeClass + @BeforeAll public static void setUp() { handler = new StrutsLambdaHandler(); lambdaContext = new MockLambdaContext(); From da9fc8194e1c8fd1f7393c340c3ff5452f231dd4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 May 2023 16:27:03 +0200 Subject: [PATCH 0683/1214] chore(deps): Update maven-assembly-plugin to 3.6.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index ea766106..e625d8fc 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -172,7 +172,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 zip-assembly diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 614d6b6d..fbe60900 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -195,7 +195,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.6.0 zip-assembly diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 7ded34e4..2cf94de4 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -155,7 +155,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 zip-assembly diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 021fbd3c..d8c4e696 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.6.0 src/main/assembly/dist.xml diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 585fb9d2..31c068c3 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -150,7 +150,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 zip-assembly diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index dc49e00e..78564225 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -138,7 +138,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.6.0 zip-assembly diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index c08616f6..ee061e2a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -179,7 +179,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 zip-assembly diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index b58483d7..fd5a76d8 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 zip-assembly diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 1ec2bb4a..72313162 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -148,7 +148,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.3.0 + 3.6.0 src/main/assembly/dist.xml From 013babd8465b7fe5b2c35e12094d5465a9997242 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 30 May 2023 09:42:21 +0200 Subject: [PATCH 0684/1214] chore(deps): Update maven-dependency-plugin to 3.6.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index e625d8fc..31f5a2f1 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -154,7 +154,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index afa8a6a5..942de07b 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -143,7 +143,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.6.0 copy-dependencies diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index fbe60900..4150f629 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -177,7 +177,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 2cf94de4..d5b1d795 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -137,7 +137,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 31c068c3..3c953f44 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -132,7 +132,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 78564225..71ad04bf 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -120,7 +120,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.2.0 + 3.6.0 copy-dependencies diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ee061e2a..9958e007 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -161,7 +161,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index fd5a76d8..ba3edc69 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 copy-dependencies From de7714c4e75127a81496f68f06e5a843f5b80453 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 04:56:41 +0000 Subject: [PATCH 0685/1214] chore(deps): bump maven-release-plugin from 3.0.0 to 3.0.1 Bumps [maven-release-plugin](https://github.com/apache/maven-release) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.0...maven-release-3.0.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 753c3b6a..4fa0f10a 100644 --- a/pom.xml +++ b/pom.xml @@ -236,7 +236,7 @@ org.apache.maven.plugins maven-release-plugin - 3.0.0 + 3.0.1 serverless-java-container-release clean verify install From e29d8bae830fe15365e08ce08deb2b0a9fddbe9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 04:57:26 +0000 Subject: [PATCH 0686/1214] chore(deps): bump maven-surefire-plugin from 3.1.0 to 3.1.2 Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.0...surefire-3.1.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 753c3b6a..4a49b226 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.0 + 3.1.2 org.apache.maven.plugins From 9e367e515db08ab40aa36a76a78cc86b1cd4d084 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Jun 2023 08:10:19 +0200 Subject: [PATCH 0687/1214] chore(deps): use latest Commons Fileupload SNAPSHOT --- aws-serverless-java-container-core/pom.xml | 4 ++-- .../proxy/internal/servlet/AwsHttpServletRequest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 6fedd2e1..4b217850 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -68,8 +68,8 @@ org.apache.commons - commons-fileupload2 - 2.0-SNAPSHOT + commons-fileupload2-jakarta + 2.0.0-SNAPSHOT diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 99b2782c..06786f7f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -25,7 +25,7 @@ import org.apache.commons.fileupload2.FileItem; import org.apache.commons.fileupload2.FileUploadException; import org.apache.commons.fileupload2.disk.DiskFileItemFactory; -import org.apache.commons.fileupload2.jaksrvlt.JakSrvltFileUpload; +import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; @@ -511,14 +511,14 @@ protected Map getMultipartFormParametersMap() { if (multipartFormParameters != null) { return multipartFormParameters; } - if (!JakSrvltFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type + if (!JakartaServletFileUpload.isMultipartContent(this)) { // isMultipartContent also checks the content type multipartFormParameters = new HashMap<>(); return multipartFormParameters; } Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - JakSrvltFileUpload upload = new JakSrvltFileUpload(new DiskFileItemFactory()); + JakartaServletFileUpload upload = new JakartaServletFileUpload(DiskFileItemFactory.builder().get()); try { List items = upload.parseRequest(this); From a49bd6539dcdc5dfd53c1a11e7a1b30bda5542cf Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Jun 2023 12:56:01 +0200 Subject: [PATCH 0688/1214] fix: as per Servlet spec getSession() creates a session if none exists (see https://stackoverflow.com/a/75471488/3156607) --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 06786f7f..e69bb0cd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -144,11 +144,13 @@ public HttpSession getSession(boolean b) { } + /** + * as per Servlet spec this method creates a session if none exists + * @return exisiting or new http session + */ @Override public HttpSession getSession() { - log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session"); - // as per Servlet spec this method should create a session if none exists, so we should change it to getSession(true) in the future - return this.session; + return getSession(true); } From 54659f05a86186482c7e41cb338ca4f1b73e8c1a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 13 Jun 2023 14:08:05 +0200 Subject: [PATCH 0689/1214] chore(deps): Update Jackson dependency to 2.15.2 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/build.gradle | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 2b4c85b7..28c81422 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 31f5a2f1..e4b24801 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.2 - 2.15.1 + 2.15.2 5.9.3 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index 6c27a2dd..d198e93b 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 942de07b..56038d39 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 2.15.1 + 2.15.2 2.9.4 5.9.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 5d3bd4f4..ec1354e7 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index de4af497..126ccc53 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.1') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.15.2') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2') implementation ('org.apache.logging.log4j:log4j-core:2.20.0') implementation ('org.apache.logging.log4j:log4j-api:2.20.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.20.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index d8c4e696..0a9b32bf 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 6.1.2 - 2.15.1 + 2.15.2 5.9.3 2.20.0 diff --git a/pom.xml b/pom.xml index 89ad3396..3a6edf22 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 8.2.1 - 2.15.1 + 2.15.2 2.0.7 5.9.3 5.3.1 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index bc4742cd..3bd7dff5 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 3c953f44..c7c4a687 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.2 - 2.15.1 + 2.15.2 diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle index 840e7116..2d0dfaea 100644 --- a/samples/spark/pet-store/build.gradle +++ b/samples/spark/pet-store/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation ( 'com.sparkjava:spark-core:2.9.4', 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) } diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index 71ad04bf..02564020 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 2.15.1 + 2.15.2 2.9.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index f92b56bc..fb6c82f6 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index a146276a..182cedd3 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', 'javax.el:javax.el-api:3.0.0', - 'com.fasterxml.jackson.core:jackson-databind:2.15.1', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1', + 'com.fasterxml.jackson.core:jackson-databind:2.15.2', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', 'com.amazonaws:aws-lambda-java-log4j2:1.5.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 72313162..e2d963b7 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 6.1.2 - 2.15.1 + 2.15.2 4.13.2 2.20.0 From 7098a4840124a0a1a5af6fa24d777754d01ab3bf Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 15 Jun 2023 07:19:28 +0200 Subject: [PATCH 0690/1214] chore(deps): Update Struts dependency to 6.1.2.1 (CVE-2023-34149) --- aws-serverless-java-container-struts/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 4f1c10b7..37df0f2a 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 6.1.2 + 6.1.2.1 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 126ccc53..5c5dc0db 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:6.1.2') { + implementation ('org.apache.struts:struts2-convention-plugin:6.1.2.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:6.1.2') { + implementation ('org.apache.struts:struts2-rest-plugin:6.1.2.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.2') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.2.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:6.1.2') { + implementation ('org.apache.struts:struts2-core:6.1.2.1') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation(platform("org.junit:junit-bom:5.9.3")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2') { + testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 0a9b32bf..8c3d30e7 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 6.1.2 + 6.1.2.1 2.15.2 5.9.3 2.20.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 182cedd3..b428d984 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', - 'org.apache.struts:struts2-convention-plugin:6.1.2', - 'org.apache.struts:struts2-rest-plugin:6.1.2', - 'org.apache.struts:struts2-bean-validation-plugin:6.1.2', - 'org.apache.struts:struts2-junit-plugin:6.1.2', + 'org.apache.struts:struts2-convention-plugin:6.1.2.1', + 'org.apache.struts:struts2-rest-plugin:6.1.2.1', + 'org.apache.struts:struts2-bean-validation-plugin:6.1.2.1', + 'org.apache.struts:struts2-junit-plugin:6.1.2.1', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index e2d963b7..80dff8fd 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 6.1.2 + 6.1.2.1 2.15.2 4.13.2 2.20.0 From c767944c47c5b4adb334ad925e3c4efd5a1a0e97 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 19 Jun 2023 10:20:55 +0200 Subject: [PATCH 0691/1214] chore(deps): use latest Commons Fileupload SNAPSHOT --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index e69bb0cd..df6627cb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -22,9 +22,9 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.apache.commons.fileupload2.FileItem; -import org.apache.commons.fileupload2.FileUploadException; -import org.apache.commons.fileupload2.disk.DiskFileItemFactory; +import org.apache.commons.fileupload2.core.FileItem; +import org.apache.commons.fileupload2.core.FileUploadException; +import org.apache.commons.fileupload2.core.disk.DiskFileItemFactory; import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; From 3103dc6212c0e3563a56c6482df4f403c1c1889f Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 14 Jun 2023 14:10:28 +0200 Subject: [PATCH 0692/1214] GH-577 Ensure listeners are notified after dispatch Resolves #577 --- .../serverless/proxy/internal/servlet/AwsAsyncContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 4a46a70f..7e3642ef 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -74,8 +74,8 @@ public void dispatch() { throw new IllegalStateException("Dispatching already started"); } dispatched.set(true); - notifyListeners(NotificationType.START_ASYNC, null); handler.doFilter(req, res, ((AwsServletContext)req.getServletContext()).getServletForPath(req.getRequestURI())); + notifyListeners(NotificationType.START_ASYNC, null); } catch (ServletException | IOException e) { notifyListeners(NotificationType.ERROR, e); } From 55be6718a78b56ca08bafc59c5796a57a5267882 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 22 Jun 2023 15:09:14 +0200 Subject: [PATCH 0693/1214] Add test --- .../servlet/AwsHttpServletResponse.java | 4 ++++ .../proxy/spring/ServletAppTest.java | 11 ++++++++++ .../spring/servletapp/MessageController.java | 20 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index c46af7a9..f82d062a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -322,6 +322,10 @@ public void write(int b) throws IOException { } } + @Override + public void flush() throws IOException { + flushBuffer(); + } @Override public void close() diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java index aacf5444..b87c80ce 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -38,6 +38,17 @@ public void initServletAppTest(String reqType) { handler = new LambdaHandler(type); } + @MethodSource("data") + @ParameterizedTest + void asyncRequest(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") + .json() + .body("{\"name\":\"bob\"}"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals("{\"name\":\"BOB\"}", resp.getBody()); + } + @MethodSource("data") @ParameterizedTest void helloRequest_respondsWithSingleMessage(String reqType) { diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index 927822a4..a40d2c20 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -5,9 +5,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; import org.springframework.web.server.ResponseStatusException; import jakarta.validation.Valid; +import reactor.core.publisher.Mono; + +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -18,6 +22,22 @@ public class MessageController { public static final String UTF8_RESPONSE = "öüäß фрыцшщ"; public static final String EX_MESSAGE = "404 exception message"; + + @RequestMapping(path="/hi", method=RequestMethod.GET, produces = {"text/plain"}) + public Mono hi() { + return Mono.just(HELLO_MESSAGE); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(path = "/async", method = RequestMethod.POST) + @ResponseBody + public DeferredResult> asyncResult(@RequestBody Map value) { + DeferredResult result = new DeferredResult<>(); + result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); + return result; + } + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) public String hello() { return HELLO_MESSAGE; From 58df143c3032e076f2266b16e14e4ff14ff79830 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jun 2023 16:34:45 +0200 Subject: [PATCH 0694/1214] chore(deps): Update Spring dependencies (framework to 6.0.10, security to 6.1.1, boot to 3.1.1) --- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c734576a..9f01bd60 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.0.9 - 6.1.0 + 6.0.10 + 6.1.1 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 8e7d42a0..a6a0e188 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.0.0-SNAPSHOT - 6.0.9 - 3.1.0 - 6.1.0 + 6.0.10 + 3.1.1 + 6.1.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index ec1354e7..7c14db0d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.9', - 'org.springframework:spring-context:6.0.9', + 'org.springframework:spring-webmvc:6.0.10', + 'org.springframework:spring-context:6.0.10', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 4150f629..8c1ff646 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.0.9 + 6.0.10 5.9.3 2.20.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 0daf1298..6de5e677 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.1.0', + 'org.springframework.boot:spring-boot-starter-web:3.1.1', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index d5b1d795..17772cdd 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.0 + 3.1.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index fb6c82f6..82048da2 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.9', - 'org.springframework:spring-context:6.0.9', + 'org.springframework:spring-webmvc:6.0.10', + 'org.springframework:spring-context:6.0.10', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 9958e007..ff6e2c93 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.0.9 + 6.0.10 4.13.2 2.20.0 17 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 216fc83e..6d0270f4 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -7,7 +7,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.0') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.1') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index ba3edc69..8a0053fd 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.0 + 3.1.1 From 1a85422619ab1fe8a942a3035c3c1037c9b0b334 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 22 Jun 2023 16:40:14 +0200 Subject: [PATCH 0695/1214] chore(deps): remove old Junit dependency from sample (unused) --- samples/spring/pet-store/pom.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index ff6e2c93..281a0021 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,6 @@ 6.0.10 - 4.13.2 2.20.0 17 17 @@ -86,13 +85,6 @@ aws-lambda-java-log4j2 1.5.1 - - - junit - junit - ${junit.version} - test - From b422a376caa1d36d37f9616ca8dfab01e63aa1dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:42:21 +0000 Subject: [PATCH 0696/1214] chore(deps): bump dependency-check-maven from 8.2.1 to 8.3.1 Bumps [dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 8.2.1 to 8.3.1. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v8.2.1...v8.3.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3a6edf22..f43fff9e 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 8.2.1 + 8.3.1 2.15.2 2.0.7 5.9.3 From 56dd87b52d6413a5c9981ebaa2b224ad03691ed7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:42:32 +0000 Subject: [PATCH 0697/1214] chore(deps-dev): bump mockito-core from 5.3.1 to 5.4.0 Bumps [mockito-core](https://github.com/mockito/mockito) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.3.1...v5.4.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3a6edf22..26566413 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.15.2 2.0.7 5.9.3 - 5.3.1 + 5.4.0 1.3 UTF-8 From 43c66bf4e822149a4c6bd6253316b0949a301046 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Jun 2023 06:37:54 +0200 Subject: [PATCH 0698/1214] chore(deps): update maven-shade-plugin to 3.5.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index e4b24801..a59bebfb 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 false diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 8c1ff646..b9d3d72d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 package diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 17772cdd..2be47cff 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 false diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c7c4a687..78616392 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -85,7 +85,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 false diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 281a0021..684623a5 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 package diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 8a0053fd..d246cb40 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 false From 52feba7c2e1daad4d2c227ada73077d756d42e7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 04:56:36 +0000 Subject: [PATCH 0699/1214] chore(deps): bump commons-codec from 1.15 to 1.16.0 Bumps [commons-codec](https://github.com/apache/commons-codec) from 1.15 to 1.16.0. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.15...rel/commons-codec-1.16.0) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index d4e9f42a..246c4134 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -64,7 +64,7 @@ commons-codec commons-codec - 1.15 + 1.16.0 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9f01bd60..1423ddf2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -53,7 +53,7 @@ commons-codec commons-codec - 1.15 + 1.16.0 test From a5dcb552501757ad1da8a331f76b02cf15832600 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 04:56:40 +0000 Subject: [PATCH 0700/1214] chore(deps): bump hibernate-validator from 8.0.0.Final to 8.0.1.Final Bumps [hibernate-validator](https://github.com/hibernate/hibernate-validator) from 8.0.0.Final to 8.0.1.Final. - [Changelog](https://github.com/hibernate/hibernate-validator/blob/main/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/8.0.0.Final...8.0.1.Final) --- updated-dependencies: - dependency-name: org.hibernate.validator:hibernate-validator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9f01bd60..25b90b88 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -75,7 +75,7 @@ org.hibernate.validator hibernate-validator - 8.0.0.Final + 8.0.1.Final test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index a6a0e188..7b0afefa 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -155,7 +155,7 @@ org.hibernate.validator hibernate-validator - 8.0.0.Final + 8.0.1.Final test From 31643df429cb4d5b6e0e48a37e3d8b90e3914bec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 04:56:45 +0000 Subject: [PATCH 0701/1214] chore(deps): bump maven-clean-plugin from 3.2.0 to 3.3.1 Bumps [maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.2.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-clean-plugin/releases) - [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.2.0...maven-clean-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-clean-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 69950a0f..7a97652c 100644 --- a/pom.xml +++ b/pom.xml @@ -211,7 +211,7 @@ org.apache.maven.plugins maven-clean-plugin - 3.2.0 + 3.3.1 org.apache.maven.plugins From 207d4a7c17c8d35faa320895963d48872add6cea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 04:56:58 +0000 Subject: [PATCH 0702/1214] chore(deps): bump spring-security.version from 6.1.0 to 6.1.1 Bumps `spring-security.version` from 6.1.0 to 6.1.1. Updates `spring-security-web` from 6.1.0 to 6.1.1 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.1.0...6.1.1) Updates `spring-security-config` from 6.1.1 to 6.1.1 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.1.1...6.1.1) --- updated-dependencies: - dependency-name: org.springframework.security:spring-security-web dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.springframework.security:spring-security-config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 4b217850..ca4f689e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -75,7 +75,7 @@ org.springframework.security spring-security-web - 6.1.0 + 6.1.1 test From fb9b2cb7188c57288bf00d50023fe71bcd88f295 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 29 Jun 2023 09:16:35 +0200 Subject: [PATCH 0703/1214] chore: add OWASP suppression for CVE-2023-35116 (false positive as per https://github.com/FasterXML/jackson-databind/issues/3972) --- aws-serverless-java-container-core/pom.xml | 3 +++ aws-serverless-java-container-jersey/pom.xml | 3 +++ aws-serverless-java-container-spark/pom.xml | 3 +++ aws-serverless-java-container-spring/pom.xml | 3 +++ .../pom.xml | 3 +++ aws-serverless-java-container-struts/pom.xml | 3 +++ owasp-suppression.xml | 27 +++++++++++++++++++ 7 files changed, 45 insertions(+) create mode 100644 owasp-suppression.xml diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ca4f689e..3eed2022 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -169,6 +169,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 246c4134..db3f9dd0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -192,6 +192,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml index 8dd1abe2..8987d66a 100644 --- a/aws-serverless-java-container-spark/pom.xml +++ b/aws-serverless-java-container-spark/pom.xml @@ -114,6 +114,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7b051a6f..9a2b077e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -235,6 +235,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 7b0afefa..507f6b8e 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -265,6 +265,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 37df0f2a..cba005e9 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -182,6 +182,9 @@ ${dependencyCheck.version} true + + ${project.basedir}/../owasp-suppression.xml + 7 false diff --git a/owasp-suppression.xml b/owasp-suppression.xml new file mode 100644 index 00000000..0f16cbd3 --- /dev/null +++ b/owasp-suppression.xml @@ -0,0 +1,27 @@ + + + + + + + ^pkg:maven/com.fasterxml.jackson.core/jackson-databind@.*$ + CVE-2023-35116 + + \ No newline at end of file From bc106c79a7948309761005e4ad5c8325366be761 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 04:03:42 +0000 Subject: [PATCH 0704/1214] chore(deps): bump spotbugs-maven-plugin from 4.7.3.4 to 4.7.3.5 Bumps [spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.3.4 to 4.7.3.5. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.3.4...spotbugs-maven-plugin-4.7.3.5) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a97652c..6eb0965c 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.7.3.4 + 4.7.3.5 + + org.springframework.cloud + spring-cloud-function-serverless-web + 4.1.0-SNAPSHOT + com.amazonaws.serverless aws-serverless-java-container-core diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java new file mode 100644 index 00000000..9647aad2 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -0,0 +1,119 @@ +package com.amazonaws.serverless.proxy.spring; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.springframework.cloud.function.serverless.web.ProxyHttpServletRequest; +import org.springframework.cloud.function.serverless.web.ProxyMvc; + +import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import com.fasterxml.jackson.databind.ObjectMapper; + +import jakarta.servlet.http.HttpServletRequest; + +/* + * Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/** + * An implementation of {@link RequestStreamHandler} which delegates to + * Spring Cloud Function serverless web module managed by Spring team. + * + * It requires no sub-classing from the user other then being identified as "Handler". + * The configuration class(es) should be provided via MAIN_CLASS environment variable. + * + */ +public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { + + private final Class[] startupClasses; + + private final ProxyMvc mvc; + + private final ObjectMapper mapper; + + private final AwsProxyHttpServletResponseWriter responseWriter; + + public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { + this.startupClasses = startupClasses; + this.mvc = ProxyMvc.INSTANCE(this.startupClasses); + this.mapper = new ObjectMapper(); + this.responseWriter = new AwsProxyHttpServletResponseWriter(); + } + + @SuppressWarnings({"rawtypes" }) + @Override + public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { + Map request = mapper.readValue(input, Map.class); + SecurityContextWriter securityWriter = "2.0".equals(request.get("version")) + ? new AwsHttpApiV2SecurityContextWriter() : new AwsProxySecurityContextWriter(); + HttpServletRequest httpServletRequest = "2.0".equals(request.get("version")) + ? this.generateRequest2(request, lambdaContext, securityWriter) : this.generateRequest(request, lambdaContext, securityWriter); + + CountDownLatch latch = new CountDownLatch(1); + AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch); + try { + mvc.service(httpServletRequest, httpServletResponse); + latch.await(10, TimeUnit.SECONDS); + mapper.writeValue(output, responseWriter.writeResponse(httpServletResponse, lambdaContext)); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private HttpServletRequest generateRequest(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { + AwsProxyRequest v1Request = this.mapper.convertValue(request, AwsProxyRequest.class); + + ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), + v1Request.getHttpMethod(), v1Request.getPath()); + httpRequest.setContentType("application/json"); + httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); + httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); + httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); + httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); + httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); + httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); + httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, securityWriter.writeSecurityContext(v1Request, lambdaContext)); + return httpRequest; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public HttpServletRequest generateRequest2(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { + HttpApiV2ProxyRequest v2Request = this.mapper.convertValue(request, HttpApiV2ProxyRequest.class); + ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), + v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); + httpRequest.setContentType("application/json"); + httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); + httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); + httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); + httpRequest.setAttribute(RequestReader.HTTP_API_EVENT_PROPERTY, v2Request); + httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); + httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, securityWriter.writeSecurityContext(v2Request, lambdaContext)); + return httpRequest; + } +} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java new file mode 100644 index 00000000..50bedc32 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -0,0 +1,300 @@ +package com.amazonaws.serverless.proxy.spring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.util.CollectionUtils; + +import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; +import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication; +import com.amazonaws.serverless.proxy.spring.servletapp.UserData; +import com.fasterxml.jackson.databind.ObjectMapper; + +import jakarta.ws.rs.core.HttpHeaders; + +public class SpringDelegatingLambdaContainerHandlerTests { + + private static String API_GATEWAY_EVENT = "{\n" + + " \"version\": \"1.0\",\n" + + " \"resource\": \"$default\",\n" + + " \"path\": \"/async\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"headers\": {\n" + + " \"Content-Length\": \"45\",\n" + + " \"Content-Type\": \"application/json\",\n" + + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"User-Agent\": \"curl/7.79.1\",\n" + + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" + + " \"X-Forwarded-For\": \"109.210.252.44\",\n" + + " \"X-Forwarded-Port\": \"443\",\n" + + " \"X-Forwarded-Proto\": \"https\",\n" + + " \"accept\": \"*/*\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Content-Length\": [\n" + + " \"45\"\n" + + " ],\n" + + " \"Content-Type\": [\n" + + " \"application/json\"\n" + + " ],\n" + + " \"Host\": [\n" + + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"curl/7.79.1\"\n" + + " ],\n" + + " \"X-Amzn-Trace-Id\": [\n" + + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" + + " ],\n" + + " \"X-Forwarded-For\": [\n" + + " \"109.210.252.44\"\n" + + " ],\n" + + " \"X-Forwarded-Port\": [\n" + + " \"443\"\n" + + " ],\n" + + " \"X-Forwarded-Proto\": [\n" + + " \"https\"\n" + + " ],\n" + + " \"accept\": [\n" + + " \"*/*\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"abc\": \"xyz\",\n" + + " \"foo\": \"baz\"\n" + + " },\n" + + " \"multiValueQueryStringParameters\": {\n" + + " \"abc\": [\n" + + " \"xyz\"\n" + + " ],\n" + + " \"foo\": [\n" + + " \"bar\",\n" + + " \"baz\"\n" + + " ]\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789098\",\n" + + " \"apiId\": \"i76bfhczs0\",\n" + + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"domainPrefix\": \"i76bfhczs0\",\n" + + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"identity\": {\n" + + " \"accessKey\": null,\n" + + " \"accountId\": null,\n" + + " \"caller\": null,\n" + + " \"cognitoAmr\": null,\n" + + " \"cognitoAuthenticationProvider\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"principalOrgId\": null,\n" + + " \"sourceIp\": \"109.210.252.44\",\n" + + " \"user\": null,\n" + + " \"userAgent\": \"curl/7.79.1\",\n" + + " \"userArn\": null\n" + + " },\n" + + " \"path\": \"/pets\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" + + " \"requestTimeEpoch\": 1678276240455,\n" + + " \"resourceId\": \"$default\",\n" + + " \"resourcePath\": \"$default\",\n" + + " \"stage\": \"$default\"\n" + + " },\n" + + " \"pathParameters\": null,\n" + + " \"stageVariables\": null,\n" + + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" + + " \"isBase64Encoded\": false\n" + + "}"; + + private static String API_GATEWAY_EVENT_V2 = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [\n" + + " \"cookie1\",\n" + + " \"cookie2\"\n" + + " ],\n" + + " \"headers\": {\n" + + " \"header1\": \"value1\",\n" + + " \"header2\": \"value1,value2\"\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"parameter1\": \"value1,value2\",\n" + + " \"parameter2\": \"value\"\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authentication\": {\n" + + " \"clientCert\": {\n" + + " \"clientCertPem\": \"CERT_CONTENT\",\n" + + " \"subjectDN\": \"www.example.com\",\n" + + " \"issuerDN\": \"Example issuer\",\n" + + " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + + " \"validity\": {\n" + + " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + + " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"authorizer\": {\n" + + " \"jwt\": {\n" + + " \"claims\": {\n" + + " \"claim1\": \"value1\",\n" + + " \"claim2\": \"value2\"\n" + + " },\n" + + " \"scopes\": [\n" + + " \"scope1\",\n" + + " \"scope2\"\n" + + " ]\n" + + " }\n" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"pathParameters\": {\n" + + " \"parameter1\": \"value1\"\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\n" + + " \"stageVariable1\": \"value1\",\n" + + " \"stageVariable2\": \"value2\"\n" + + " }\n" + + "}"; + + private SpringDelegatingLambdaContainerHandler handler; + + private ObjectMapper mapper = new ObjectMapper(); + + public void initServletAppTest() { + this.handler = new SpringDelegatingLambdaContainerHandler(ServletApplication.class); + } + + public static Collection data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); + } + + @MethodSource("data") + @ParameterizedTest + public void testAsyncPost(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}", null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + System.out.println(output.toString(StandardCharsets.UTF_8)); + } + + @MethodSource("data") + @ParameterizedTest + public void testValidate400(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + System.out.println(output.toString(StandardCharsets.UTF_8)); + } + + @MethodSource("data") + @ParameterizedTest + public void testValidate200(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + ud.setFirstName("bob"); + ud.setLastName("smith"); + ud.setEmail("foo@bar.com"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + System.out.println(output.toString(StandardCharsets.UTF_8)); + } + + @MethodSource("data") + @ParameterizedTest + public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", + mapper.writeValueAsString(new MessageData("test message")), null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + System.out.println(output.toString(StandardCharsets.UTF_8)); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @MethodSource("data") + @ParameterizedTest + void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { + initServletAppTest(); + + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); + headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", + mapper.writeValueAsString(new MessageData("test message")), headers)); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals("test message", result.get("body")); + } + + @SuppressWarnings({ "rawtypes" }) + private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body, Map headers) throws Exception { + Map requestMap = mapper.readValue(jsonEvent, Map.class); + if (requestMap.get("version").equals("2.0")) { + return generateHttpRequest2(requestMap, method, path, body, headers); + } + return generateHttpRequest(requestMap, method, path, body, headers); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private byte[] generateHttpRequest(Map requestMap, String method, String path, String body, Map headers) throws Exception { + requestMap.put("path", path); + requestMap.put("httpMethod", method); + requestMap.put("body", body); + if (!CollectionUtils.isEmpty(headers)) { + requestMap.put("headers", headers); + } + return mapper.writeValueAsBytes(requestMap); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body, Map headers) throws Exception { + Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); + Map http = (Map) ((Map) map.get("requestContext")).get("http"); + http.put("path", path); + http.put("method", method); + map.put("body", body); + if (!CollectionUtils.isEmpty(headers)) { + map.put("headers", headers); + } + return mapper.writeValueAsBytes(map); + } +} From 42e0309fb2c65f195e98e07d8714cf0ccde275df Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 28 Jun 2023 18:29:53 +0200 Subject: [PATCH 0706/1214] Add spring snapshot repo --- .../pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 94c671cd..37cc8515 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -286,4 +286,22 @@ + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + From fb6f20504f7b93d9a5b1e3f0141ac3ba3fd4f669 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 29 Jun 2023 08:37:36 +0200 Subject: [PATCH 0707/1214] Fix tests assertions --- ...DelegatingLambdaContainerHandlerTests.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index 50bedc32..8b50eb9f 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -22,6 +22,7 @@ import jakarta.ws.rs.core.HttpHeaders; +@SuppressWarnings("rawtypes") public class SpringDelegatingLambdaContainerHandlerTests { private static String API_GATEWAY_EVENT = "{\n" @@ -208,7 +209,9 @@ public void testAsyncPost(String jsonEvent) throws Exception { InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}", null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); - System.out.println(output.toString(StandardCharsets.UTF_8)); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("{\"name\":\"BOB\"}", result.get("body")); } @MethodSource("data") @@ -219,7 +222,9 @@ public void testValidate400(String jsonEvent) throws Exception { InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); - System.out.println(output.toString(StandardCharsets.UTF_8)); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(400, result.get("statusCode")); + assertEquals("3", result.get("body")); } @MethodSource("data") @@ -233,7 +238,9 @@ public void testValidate200(String jsonEvent) throws Exception { InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); - System.out.println(output.toString(StandardCharsets.UTF_8)); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("body")); } @MethodSource("data") @@ -244,10 +251,12 @@ public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) t mapper.writeValueAsString(new MessageData("test message")), null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); - System.out.println(output.toString(StandardCharsets.UTF_8)); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("test message")); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({"unchecked" }) @MethodSource("data") @ParameterizedTest void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { @@ -265,7 +274,6 @@ void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEven assertEquals("test message", result.get("body")); } - @SuppressWarnings({ "rawtypes" }) private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body, Map headers) throws Exception { Map requestMap = mapper.readValue(jsonEvent, Map.class); if (requestMap.get("version").equals("2.0")) { @@ -274,7 +282,7 @@ private byte[] generateHttpRequest(String jsonEvent, String method, String path, return generateHttpRequest(requestMap, method, path, body, headers); } - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({ "unchecked"}) private byte[] generateHttpRequest(Map requestMap, String method, String path, String body, Map headers) throws Exception { requestMap.put("path", path); requestMap.put("httpMethod", method); @@ -285,7 +293,7 @@ private byte[] generateHttpRequest(Map requestMap, String method, String path, S return mapper.writeValueAsBytes(requestMap); } - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({ "unchecked"}) private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body, Map headers) throws Exception { Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); Map http = (Map) ((Map) map.get("requestContext")).get("http"); From 6fb6ff266a8fe5b70c2b2d583e5d6df710df1149 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Jun 2023 11:41:01 +0200 Subject: [PATCH 0708/1214] Fix tests --- .../spring/SpringDelegatingLambdaContainerHandlerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index 8b50eb9f..e242ea6e 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -253,7 +253,7 @@ public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) t handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); assertEquals(200, result.get("statusCode")); - assertEquals("VALID", result.get("test message")); + assertEquals("test message", result.get("body")); } @SuppressWarnings({"unchecked" }) From 42d92bb8440d955f5bf06b225256ae7b717f3bdb Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Jun 2023 13:17:28 +0200 Subject: [PATCH 0709/1214] Add spring snapshot/milestone repo to gradle file of pet-store sample --- samples/springboot3/pet-store/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 6d0270f4..00a9d3a1 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -3,6 +3,8 @@ apply plugin: 'java' repositories { mavenLocal() mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} } dependencies { From 870d75ec56da7a1faf158a049d908b32403f647e Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Jun 2023 13:28:55 +0200 Subject: [PATCH 0710/1214] Add spring snapshot/milestone repo to gradle file of springboot3 archetype --- .../src/main/resources/archetype-resources/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 6de5e677..13c8e76b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -3,6 +3,8 @@ apply plugin: 'java' repositories { mavenLocal() mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} } dependencies { From 801890d09ce7de593b271e393bb86dffed088c57 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Jun 2023 17:33:26 +0200 Subject: [PATCH 0711/1214] Add sample and documentation --- .gitignore | 3 + ...pringDelegatingLambdaContainerHandler.java | 35 +++- samples/springboot3/alt-pet-store/README.md | 39 +++++ .../springboot3/alt-pet-store/builds.gradle | 29 ++++ samples/springboot3/alt-pet-store/pom.xml | 154 ++++++++++++++++++ .../alt-pet-store/src/assembly/bin.xml | 27 +++ .../sample/springboot3/Application.java | 51 ++++++ .../controller/PetsController.java | 77 +++++++++ .../filter/CognitoIdentityFilter.java | 69 ++++++++ .../sample/springboot3/model/Error.java | 29 ++++ .../sample/springboot3/model/Pet.java | 55 +++++++ .../sample/springboot3/model/PetData.java | 117 +++++++++++++ .../src/main/resources/logback.xml | 5 + .../springboot3/alt-pet-store/template.yml | 41 +++++ 14 files changed, 726 insertions(+), 5 deletions(-) create mode 100644 samples/springboot3/alt-pet-store/README.md create mode 100644 samples/springboot3/alt-pet-store/builds.gradle create mode 100644 samples/springboot3/alt-pet-store/pom.xml create mode 100644 samples/springboot3/alt-pet-store/src/assembly/bin.xml create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java create mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java create mode 100644 samples/springboot3/alt-pet-store/src/main/resources/logback.xml create mode 100644 samples/springboot3/alt-pet-store/template.yml diff --git a/.gitignore b/.gitignore index 8f6b9d35..2aa1654c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ *.jar *.war *.ear +*.project +*.classpath +*.settings # Idea project files .idea/ diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 9647aad2..46ccfb13 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -3,13 +3,27 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.function.serverless.web.FunctionClassUtils; import org.springframework.cloud.function.serverless.web.ProxyHttpServletRequest; import org.springframework.cloud.function.serverless.web.ProxyMvc; +import org.springframework.core.KotlinDetector; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.StringUtils; import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; @@ -48,6 +62,8 @@ */ public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { + private static Log logger = LogFactory.getLog(SpringDelegatingLambdaContainerHandler.class); + private final Class[] startupClasses; private final ProxyMvc mvc; @@ -56,6 +72,10 @@ public class SpringDelegatingLambdaContainerHandler implements RequestStreamHand private final AwsProxyHttpServletResponseWriter responseWriter; + public SpringDelegatingLambdaContainerHandler() { + this(new Class[] {FunctionClassUtils.getStartClass()}); + } + public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { this.startupClasses = startupClasses; this.mvc = ProxyMvc.INSTANCE(this.startupClasses); @@ -84,15 +104,17 @@ public void handleRequest(InputStream input, OutputStream output, Context lambda } } - @SuppressWarnings({ "unchecked", "rawtypes" }) private HttpServletRequest generateRequest(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { AwsProxyRequest v1Request = this.mapper.convertValue(request, AwsProxyRequest.class); ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), v1Request.getHttpMethod(), v1Request.getPath()); - httpRequest.setContentType("application/json"); - httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); + + if (StringUtils.hasText(v1Request.getBody())) { + httpRequest.setContentType("application/json"); + httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); + } httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); @@ -107,8 +129,11 @@ public HttpServletRequest generateRequest2(Map request, Context lambdaContext, S HttpApiV2ProxyRequest v2Request = this.mapper.convertValue(request, HttpApiV2ProxyRequest.class); ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); - httpRequest.setContentType("application/json"); - httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); + + if (StringUtils.hasText(v2Request.getBody())) { + httpRequest.setContentType("application/json"); + httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); + } httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); httpRequest.setAttribute(RequestReader.HTTP_API_EVENT_PROPERTY, v2Request); diff --git a/samples/springboot3/alt-pet-store/README.md b/samples/springboot3/alt-pet-store/README.md new file mode 100644 index 00000000..d8cf8383 --- /dev/null +++ b/samples/springboot3/alt-pet-store/README.md @@ -0,0 +1,39 @@ +# Serverless Spring Boot 3 example +A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). Unlike older examples, this example is relying on the new +`SpringDelegatingLambdaContainerHandler`, which you simply need to identify as a _handler_ of the Lambda function. The main configuration class identified as `MAIN_CLASS` +environment variable or `Start-Class` or `Main-Class` entry in Manifest file. See provided `template.yml` file for reference. + + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. + +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package +``` +$ sam build +``` + +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. + +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL + +``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- + +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/builds.gradle b/samples/springboot3/alt-pet-store/builds.gradle new file mode 100644 index 00000000..00a9d3a1 --- /dev/null +++ b/samples/springboot3/alt-pet-store/builds.gradle @@ -0,0 +1,29 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} +} + +dependencies { + implementation ( + implementation('org.springframework.boot:spring-boot-starter-web:3.1.1') { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' + }, + 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml new file mode 100644 index 00000000..a8f6220b --- /dev/null +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -0,0 +1,154 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + petstore-springboot3-example + 2.0-SNAPSHOT + Spring Boot example for the aws-serverless-java-container library + Simple pet store written with the Spring framework and Spring Boot + https://aws.amazon.com/lambda/ + + + org.springframework.boot + spring-boot-starter-parent + 3.1.1 + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + com.amazonaws.serverless + aws-serverless-java-container-springboot3 + 2.0.0-SNAPSHOT + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.0 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.1 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.0 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.6.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + + + diff --git a/samples/springboot3/alt-pet-store/src/assembly/bin.xml b/samples/springboot3/alt-pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java new file mode 100644 index 00000000..ee9989df --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java @@ -0,0 +1,51 @@ +package com.amazonaws.serverless.sample.springboot3; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import com.amazonaws.serverless.sample.springboot3.controller.PetsController; +import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; + +import jakarta.servlet.Filter; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + @Bean("CognitoIdentityFilter") + public Filter cognitoFilter() { + return new CognitoIdentityFilter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java new file mode 100644 index 00000000..680e629d --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.controller; + + + +import com.amazonaws.serverless.sample.springboot3.model.Pet; +import com.amazonaws.serverless.sample.springboot3.model.PetData; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet listPets() { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..d6ccae76 --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot3.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java new file mode 100644 index 00000000..320f2158 --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java new file mode 100644 index 00000000..4f0c4ba8 --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java new file mode 100644 index 00000000..68ea3c18 --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot3/alt-pet-store/src/main/resources/logback.xml b/samples/springboot3/alt-pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..14a3a84f --- /dev/null +++ b/samples/springboot3/alt-pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/template.yml b/samples/springboot3/alt-pet-store/template.yml new file mode 100644 index 00000000..8a51c8d1 --- /dev/null +++ b/samples/springboot3/alt-pet-store/template.yml @@ -0,0 +1,41 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with spring-cloud-function web-proxy support + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: +# AutoPublishAlias: bcn + FunctionName: pet-store-boot-3 + Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest + Runtime: java17 + SnapStart: + ApplyOn: PublishedVersions + CodeUri: . + MemorySize: 1024 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Environment: + Variables: + MAIN_CLASS: com.amazonaws.serverless.sample.springboot3.Application + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Outputs: + SpringPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: SpringPetStoreApi + + From 224e5fb0f0a91b99b1a7c29ece158ebfada66df7 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Jun 2023 19:13:18 +0200 Subject: [PATCH 0712/1214] Cleanup --- .../SpringDelegatingLambdaContainerHandler.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 46ccfb13..20e15474 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -3,26 +3,16 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.URL; import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.jar.JarFile; -import java.util.jar.Manifest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.serverless.web.FunctionClassUtils; import org.springframework.cloud.function.serverless.web.ProxyHttpServletRequest; import org.springframework.cloud.function.serverless.web.ProxyMvc; -import org.springframework.core.KotlinDetector; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.util.Assert; -import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; @@ -62,8 +52,6 @@ */ public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { - private static Log logger = LogFactory.getLog(SpringDelegatingLambdaContainerHandler.class); - private final Class[] startupClasses; private final ProxyMvc mvc; From 3a96f35a70b184f17c73a686174e50f996cb6df8 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 4 Jul 2023 10:10:20 +0200 Subject: [PATCH 0713/1214] Substitute tabs for spaces --- .../proxy/model/AwsProxyRequest.java | 12 +- .../pom.xml | 34 +- ...pringDelegatingLambdaContainerHandler.java | 134 +++-- ...DelegatingLambdaContainerHandlerTests.java | 514 +++++++++--------- .../sample/springboot3/Application.java | 2 +- 5 files changed, 347 insertions(+), 349 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index af4e6ea7..53ad758f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -30,7 +30,7 @@ public class AwsProxyRequest { private String body; private String version; - private String resource; + private String resource; private AwsProxyRequestContext requestContext; private MultiValuedTreeMap multiValueQueryStringParameters; private Map queryStringParameters; @@ -97,12 +97,12 @@ public String getResource() { } public String getVersion() { - return version; - } + return version; + } - public void setVersion(String version) { - this.version = version; - } + public void setVersion(String version) { + this.version = version; + } public void setResource(String resource) { this.resource = resource; diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 37cc8515..532ce831 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -287,21 +287,21 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 20e15474..ce314236 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -8,8 +8,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.serverless.web.FunctionClassUtils; import org.springframework.cloud.function.serverless.web.ProxyHttpServletRequest; import org.springframework.cloud.function.serverless.web.ProxyMvc; @@ -52,75 +50,75 @@ */ public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { - private final Class[] startupClasses; - - private final ProxyMvc mvc; - - private final ObjectMapper mapper; - - private final AwsProxyHttpServletResponseWriter responseWriter; - - public SpringDelegatingLambdaContainerHandler() { - this(new Class[] {FunctionClassUtils.getStartClass()}); - } - - public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { - this.startupClasses = startupClasses; - this.mvc = ProxyMvc.INSTANCE(this.startupClasses); - this.mapper = new ObjectMapper(); - this.responseWriter = new AwsProxyHttpServletResponseWriter(); - } - - @SuppressWarnings({"rawtypes" }) - @Override - public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { - Map request = mapper.readValue(input, Map.class); - SecurityContextWriter securityWriter = "2.0".equals(request.get("version")) - ? new AwsHttpApiV2SecurityContextWriter() : new AwsProxySecurityContextWriter(); - HttpServletRequest httpServletRequest = "2.0".equals(request.get("version")) - ? this.generateRequest2(request, lambdaContext, securityWriter) : this.generateRequest(request, lambdaContext, securityWriter); - - CountDownLatch latch = new CountDownLatch(1); - AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch); - try { - mvc.service(httpServletRequest, httpServletResponse); - latch.await(10, TimeUnit.SECONDS); - mapper.writeValue(output, responseWriter.writeResponse(httpServletResponse, lambdaContext)); - } - catch (Exception e) { - throw new IllegalStateException(e); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private HttpServletRequest generateRequest(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { - AwsProxyRequest v1Request = this.mapper.convertValue(request, AwsProxyRequest.class); - - ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), - v1Request.getHttpMethod(), v1Request.getPath()); - - if (StringUtils.hasText(v1Request.getBody())) { - httpRequest.setContentType("application/json"); - httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); - } - httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); - httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); - httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); - httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); - httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); - httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, securityWriter.writeSecurityContext(v1Request, lambdaContext)); - return httpRequest; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public HttpServletRequest generateRequest2(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { - HttpApiV2ProxyRequest v2Request = this.mapper.convertValue(request, HttpApiV2ProxyRequest.class); + private final Class[] startupClasses; + + private final ProxyMvc mvc; + + private final ObjectMapper mapper; + + private final AwsProxyHttpServletResponseWriter responseWriter; + + public SpringDelegatingLambdaContainerHandler() { + this(new Class[] {FunctionClassUtils.getStartClass()}); + } + + public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { + this.startupClasses = startupClasses; + this.mvc = ProxyMvc.INSTANCE(this.startupClasses); + this.mapper = new ObjectMapper(); + this.responseWriter = new AwsProxyHttpServletResponseWriter(); + } + + @SuppressWarnings({"rawtypes" }) + @Override + public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { + Map request = mapper.readValue(input, Map.class); + SecurityContextWriter securityWriter = "2.0".equals(request.get("version")) + ? new AwsHttpApiV2SecurityContextWriter() : new AwsProxySecurityContextWriter(); + HttpServletRequest httpServletRequest = "2.0".equals(request.get("version")) + ? this.generateRequest2(request, lambdaContext, securityWriter) : this.generateRequest(request, lambdaContext, securityWriter); + + CountDownLatch latch = new CountDownLatch(1); + AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch); + try { + mvc.service(httpServletRequest, httpServletResponse); + latch.await(10, TimeUnit.SECONDS); + mapper.writeValue(output, responseWriter.writeResponse(httpServletResponse, lambdaContext)); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private HttpServletRequest generateRequest(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { + AwsProxyRequest v1Request = this.mapper.convertValue(request, AwsProxyRequest.class); + + ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), + v1Request.getHttpMethod(), v1Request.getPath()); + + if (StringUtils.hasText(v1Request.getBody())) { + httpRequest.setContentType("application/json"); + httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); + } + httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); + httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); + httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); + httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); + httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); + httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, securityWriter.writeSecurityContext(v1Request, lambdaContext)); + return httpRequest; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public HttpServletRequest generateRequest2(Map request, Context lambdaContext, SecurityContextWriter securityWriter) { + HttpApiV2ProxyRequest v2Request = this.mapper.convertValue(request, HttpApiV2ProxyRequest.class); ProxyHttpServletRequest httpRequest = new ProxyHttpServletRequest(this.mvc.getApplicationContext().getServletContext(), - v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); + v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); if (StringUtils.hasText(v2Request.getBody())) { - httpRequest.setContentType("application/json"); - httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); + httpRequest.setContentType("application/json"); + httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); } httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index e242ea6e..dabc30e2 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -25,284 +25,284 @@ @SuppressWarnings("rawtypes") public class SpringDelegatingLambdaContainerHandlerTests { - private static String API_GATEWAY_EVENT = "{\n" - + " \"version\": \"1.0\",\n" - + " \"resource\": \"$default\",\n" - + " \"path\": \"/async\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"headers\": {\n" - + " \"Content-Length\": \"45\",\n" - + " \"Content-Type\": \"application/json\",\n" - + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"User-Agent\": \"curl/7.79.1\",\n" - + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" - + " \"X-Forwarded-For\": \"109.210.252.44\",\n" - + " \"X-Forwarded-Port\": \"443\",\n" - + " \"X-Forwarded-Proto\": \"https\",\n" - + " \"accept\": \"*/*\"\n" - + " },\n" - + " \"multiValueHeaders\": {\n" - + " \"Content-Length\": [\n" - + " \"45\"\n" - + " ],\n" - + " \"Content-Type\": [\n" - + " \"application/json\"\n" - + " ],\n" - + " \"Host\": [\n" - + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" - + " ],\n" - + " \"User-Agent\": [\n" - + " \"curl/7.79.1\"\n" - + " ],\n" - + " \"X-Amzn-Trace-Id\": [\n" - + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" - + " ],\n" - + " \"X-Forwarded-For\": [\n" - + " \"109.210.252.44\"\n" - + " ],\n" - + " \"X-Forwarded-Port\": [\n" - + " \"443\"\n" - + " ],\n" - + " \"X-Forwarded-Proto\": [\n" - + " \"https\"\n" - + " ],\n" - + " \"accept\": [\n" - + " \"*/*\"\n" - + " ]\n" - + " },\n" - + " \"queryStringParameters\": {\n" - + " \"abc\": \"xyz\",\n" - + " \"foo\": \"baz\"\n" - + " },\n" - + " \"multiValueQueryStringParameters\": {\n" - + " \"abc\": [\n" - + " \"xyz\"\n" - + " ],\n" - + " \"foo\": [\n" - + " \"bar\",\n" - + " \"baz\"\n" - + " ]\n" - + " },\n" - + " \"requestContext\": {\n" - + " \"accountId\": \"123456789098\",\n" - + " \"apiId\": \"i76bfhczs0\",\n" - + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"domainPrefix\": \"i76bfhczs0\",\n" - + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"identity\": {\n" - + " \"accessKey\": null,\n" - + " \"accountId\": null,\n" - + " \"caller\": null,\n" - + " \"cognitoAmr\": null,\n" - + " \"cognitoAuthenticationProvider\": null,\n" - + " \"cognitoAuthenticationType\": null,\n" - + " \"cognitoIdentityId\": null,\n" - + " \"cognitoIdentityPoolId\": null,\n" - + " \"principalOrgId\": null,\n" - + " \"sourceIp\": \"109.210.252.44\",\n" - + " \"user\": null,\n" - + " \"userAgent\": \"curl/7.79.1\",\n" - + " \"userArn\": null\n" - + " },\n" - + " \"path\": \"/pets\",\n" - + " \"protocol\": \"HTTP/1.1\",\n" - + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" - + " \"requestTimeEpoch\": 1678276240455,\n" - + " \"resourceId\": \"$default\",\n" - + " \"resourcePath\": \"$default\",\n" - + " \"stage\": \"$default\"\n" - + " },\n" - + " \"pathParameters\": null,\n" - + " \"stageVariables\": null,\n" - + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" - + " \"isBase64Encoded\": false\n" - + "}"; + private static String API_GATEWAY_EVENT = "{\n" + + " \"version\": \"1.0\",\n" + + " \"resource\": \"$default\",\n" + + " \"path\": \"/async\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"headers\": {\n" + + " \"Content-Length\": \"45\",\n" + + " \"Content-Type\": \"application/json\",\n" + + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"User-Agent\": \"curl/7.79.1\",\n" + + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" + + " \"X-Forwarded-For\": \"109.210.252.44\",\n" + + " \"X-Forwarded-Port\": \"443\",\n" + + " \"X-Forwarded-Proto\": \"https\",\n" + + " \"accept\": \"*/*\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Content-Length\": [\n" + + " \"45\"\n" + + " ],\n" + + " \"Content-Type\": [\n" + + " \"application/json\"\n" + + " ],\n" + + " \"Host\": [\n" + + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"curl/7.79.1\"\n" + + " ],\n" + + " \"X-Amzn-Trace-Id\": [\n" + + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" + + " ],\n" + + " \"X-Forwarded-For\": [\n" + + " \"109.210.252.44\"\n" + + " ],\n" + + " \"X-Forwarded-Port\": [\n" + + " \"443\"\n" + + " ],\n" + + " \"X-Forwarded-Proto\": [\n" + + " \"https\"\n" + + " ],\n" + + " \"accept\": [\n" + + " \"*/*\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"abc\": \"xyz\",\n" + + " \"foo\": \"baz\"\n" + + " },\n" + + " \"multiValueQueryStringParameters\": {\n" + + " \"abc\": [\n" + + " \"xyz\"\n" + + " ],\n" + + " \"foo\": [\n" + + " \"bar\",\n" + + " \"baz\"\n" + + " ]\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789098\",\n" + + " \"apiId\": \"i76bfhczs0\",\n" + + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"domainPrefix\": \"i76bfhczs0\",\n" + + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"identity\": {\n" + + " \"accessKey\": null,\n" + + " \"accountId\": null,\n" + + " \"caller\": null,\n" + + " \"cognitoAmr\": null,\n" + + " \"cognitoAuthenticationProvider\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"principalOrgId\": null,\n" + + " \"sourceIp\": \"109.210.252.44\",\n" + + " \"user\": null,\n" + + " \"userAgent\": \"curl/7.79.1\",\n" + + " \"userArn\": null\n" + + " },\n" + + " \"path\": \"/pets\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" + + " \"requestTimeEpoch\": 1678276240455,\n" + + " \"resourceId\": \"$default\",\n" + + " \"resourcePath\": \"$default\",\n" + + " \"stage\": \"$default\"\n" + + " },\n" + + " \"pathParameters\": null,\n" + + " \"stageVariables\": null,\n" + + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" + + " \"isBase64Encoded\": false\n" + + "}"; - private static String API_GATEWAY_EVENT_V2 = "{\n" + - " \"version\": \"2.0\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"rawPath\": \"/my/path\",\n" + - " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + - " \"cookies\": [\n" + - " \"cookie1\",\n" + - " \"cookie2\"\n" + - " ],\n" + - " \"headers\": {\n" + - " \"header1\": \"value1\",\n" + - " \"header2\": \"value1,value2\"\n" + - " },\n" + - " \"queryStringParameters\": {\n" + - " \"parameter1\": \"value1,value2\",\n" + - " \"parameter2\": \"value\"\n" + - " },\n" + - " \"requestContext\": {\n" + - " \"accountId\": \"123456789012\",\n" + - " \"apiId\": \"api-id\",\n" + - " \"authentication\": {\n" + - " \"clientCert\": {\n" + - " \"clientCertPem\": \"CERT_CONTENT\",\n" + - " \"subjectDN\": \"www.example.com\",\n" + - " \"issuerDN\": \"Example issuer\",\n" + - " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + - " \"validity\": {\n" + - " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + - " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"authorizer\": {\n" + - " \"jwt\": {\n" + - " \"claims\": {\n" + - " \"claim1\": \"value1\",\n" + - " \"claim2\": \"value2\"\n" + - " },\n" + - " \"scopes\": [\n" + - " \"scope1\",\n" + - " \"scope2\"\n" + - " ]\n" + - " }\n" + - " },\n" + - " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + - " \"domainPrefix\": \"id\",\n" + - " \"http\": {\n" + - " \"method\": \"POST\",\n" + - " \"path\": \"/my/path\",\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"sourceIp\": \"IP\",\n" + - " \"userAgent\": \"agent\"\n" + - " },\n" + - " \"requestId\": \"id\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"stage\": \"$default\",\n" + - " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + - " \"timeEpoch\": 1583348638390\n" + - " },\n" + - " \"body\": \"Hello from Lambda\",\n" + - " \"pathParameters\": {\n" + - " \"parameter1\": \"value1\"\n" + - " },\n" + - " \"isBase64Encoded\": false,\n" + - " \"stageVariables\": {\n" + - " \"stageVariable1\": \"value1\",\n" + - " \"stageVariable2\": \"value2\"\n" + - " }\n" + - "}"; + private static String API_GATEWAY_EVENT_V2 = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [\n" + + " \"cookie1\",\n" + + " \"cookie2\"\n" + + " ],\n" + + " \"headers\": {\n" + + " \"header1\": \"value1\",\n" + + " \"header2\": \"value1,value2\"\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"parameter1\": \"value1,value2\",\n" + + " \"parameter2\": \"value\"\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authentication\": {\n" + + " \"clientCert\": {\n" + + " \"clientCertPem\": \"CERT_CONTENT\",\n" + + " \"subjectDN\": \"www.example.com\",\n" + + " \"issuerDN\": \"Example issuer\",\n" + + " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + + " \"validity\": {\n" + + " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + + " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"authorizer\": {\n" + + " \"jwt\": {\n" + + " \"claims\": {\n" + + " \"claim1\": \"value1\",\n" + + " \"claim2\": \"value2\"\n" + + " },\n" + + " \"scopes\": [\n" + + " \"scope1\",\n" + + " \"scope2\"\n" + + " ]\n" + + " }\n" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"pathParameters\": {\n" + + " \"parameter1\": \"value1\"\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\n" + + " \"stageVariable1\": \"value1\",\n" + + " \"stageVariable2\": \"value2\"\n" + + " }\n" + + "}"; - private SpringDelegatingLambdaContainerHandler handler; + private SpringDelegatingLambdaContainerHandler handler; - private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = new ObjectMapper(); - public void initServletAppTest() { - this.handler = new SpringDelegatingLambdaContainerHandler(ServletApplication.class); - } + public void initServletAppTest() { + this.handler = new SpringDelegatingLambdaContainerHandler(ServletApplication.class); + } - public static Collection data() { + public static Collection data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); } - @MethodSource("data") - @ParameterizedTest - public void testAsyncPost(String jsonEvent) throws Exception { - initServletAppTest(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}", null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("{\"name\":\"BOB\"}", result.get("body")); - } + @MethodSource("data") + @ParameterizedTest + public void testAsyncPost(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}", null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("{\"name\":\"BOB\"}", result.get("body")); + } - @MethodSource("data") - @ParameterizedTest - public void testValidate400(String jsonEvent) throws Exception { - initServletAppTest(); - UserData ud = new UserData(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(400, result.get("statusCode")); - assertEquals("3", result.get("body")); - } + @MethodSource("data") + @ParameterizedTest + public void testValidate400(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(400, result.get("statusCode")); + assertEquals("3", result.get("body")); + } - @MethodSource("data") - @ParameterizedTest - public void testValidate200(String jsonEvent) throws Exception { - initServletAppTest(); - UserData ud = new UserData(); - ud.setFirstName("bob"); - ud.setLastName("smith"); - ud.setEmail("foo@bar.com"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("VALID", result.get("body")); - } + @MethodSource("data") + @ParameterizedTest + public void testValidate200(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + ud.setFirstName("bob"); + ud.setLastName("smith"); + ud.setEmail("foo@bar.com"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("body")); + } - @MethodSource("data") - @ParameterizedTest - public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { - initServletAppTest(); + @MethodSource("data") + @ParameterizedTest + public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { + initServletAppTest(); InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")), null)); + mapper.writeValueAsString(new MessageData("test message")), null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("test message", result.get("body")); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("test message", result.get("body")); } - @SuppressWarnings({"unchecked" }) - @MethodSource("data") - @ParameterizedTest - void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { + @SuppressWarnings({"unchecked" }) + @MethodSource("data") + @ParameterizedTest + void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { initServletAppTest(); Map headers = new HashMap<>(); - headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); - headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")), headers)); + headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); + headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", + mapper.writeValueAsString(new MessageData("test message")), headers)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals("test message", result.get("body")); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals("test message", result.get("body")); } - private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body, Map headers) throws Exception { - Map requestMap = mapper.readValue(jsonEvent, Map.class); - if (requestMap.get("version").equals("2.0")) { - return generateHttpRequest2(requestMap, method, path, body, headers); - } - return generateHttpRequest(requestMap, method, path, body, headers); - } + private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body, Map headers) throws Exception { + Map requestMap = mapper.readValue(jsonEvent, Map.class); + if (requestMap.get("version").equals("2.0")) { + return generateHttpRequest2(requestMap, method, path, body, headers); + } + return generateHttpRequest(requestMap, method, path, body, headers); + } - @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest(Map requestMap, String method, String path, String body, Map headers) throws Exception { - requestMap.put("path", path); - requestMap.put("httpMethod", method); - requestMap.put("body", body); - if (!CollectionUtils.isEmpty(headers)) { - requestMap.put("headers", headers); - } - return mapper.writeValueAsBytes(requestMap); - } + @SuppressWarnings({ "unchecked"}) + private byte[] generateHttpRequest(Map requestMap, String method, String path, String body, Map headers) throws Exception { + requestMap.put("path", path); + requestMap.put("httpMethod", method); + requestMap.put("body", body); + if (!CollectionUtils.isEmpty(headers)) { + requestMap.put("headers", headers); + } + return mapper.writeValueAsBytes(requestMap); + } - @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body, Map headers) throws Exception { - Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); - Map http = (Map) ((Map) map.get("requestContext")).get("http"); - http.put("path", path); - http.put("method", method); - map.put("body", body); - if (!CollectionUtils.isEmpty(headers)) { - map.put("headers", headers); - } - return mapper.writeValueAsBytes(map); - } + @SuppressWarnings({ "unchecked"}) + private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body, Map headers) throws Exception { + Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); + Map http = (Map) ((Map) map.get("requestContext")).get("http"); + http.put("path", path); + http.put("method", method); + map.put("body", body); + if (!CollectionUtils.isEmpty(headers)) { + map.put("headers", headers); + } + return mapper.writeValueAsBytes(map); + } } diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java index ee9989df..428d6726 100644 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java @@ -42,7 +42,7 @@ public HandlerAdapter handlerAdapter() { @Bean("CognitoIdentityFilter") public Filter cognitoFilter() { - return new CognitoIdentityFilter(); + return new CognitoIdentityFilter(); } public static void main(String[] args) { From da5cb2b0f37da5397a945080dd9c157486284254 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 6 Jul 2023 10:30:10 +0200 Subject: [PATCH 0714/1214] Upgrade s-c-function to 4.0.4 (release) --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 532ce831..4c41ab83 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.0-SNAPSHOT + 4.0.4 com.amazonaws.serverless From ff72372fa201655773e2caa2f20a766f320a1e5c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 11 Jul 2023 11:11:12 +0200 Subject: [PATCH 0715/1214] cleanup (#577) --- .../proxy/spring/servletapp/MessageController.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java index a40d2c20..1923396c 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -9,7 +9,6 @@ import org.springframework.web.server.ResponseStatusException; import jakarta.validation.Valid; -import reactor.core.publisher.Mono; import java.util.Collections; import java.util.HashMap; @@ -22,12 +21,6 @@ public class MessageController { public static final String UTF8_RESPONSE = "öüäß фрыцшщ"; public static final String EX_MESSAGE = "404 exception message"; - - @RequestMapping(path="/hi", method=RequestMethod.GET, produces = {"text/plain"}) - public Mono hi() { - return Mono.just(HELLO_MESSAGE); - } - @SuppressWarnings({ "unchecked", "rawtypes" }) @RequestMapping(path = "/async", method = RequestMethod.POST) @ResponseBody @@ -37,7 +30,6 @@ public DeferredResult> asyncResult(@RequestBody Map Date: Mon, 17 Jul 2023 14:26:05 +0200 Subject: [PATCH 0716/1214] chore(deps): align code with Commons Fileupload 2.0.0-M1 (currently under vote https://lists.apache.org/thread/27gkqk3928bw9qcqyhkgw9tzqxllpw67) --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index df6627cb..1bd12c04 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -24,7 +24,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileUploadException; -import org.apache.commons.fileupload2.core.disk.DiskFileItemFactory; +import org.apache.commons.fileupload2.core.DiskFileItemFactory; import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; From 5b1560c4d378689d7a784345371d1687b4907176 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 20 Jul 2023 12:15:37 +0200 Subject: [PATCH 0717/1214] chore(deps): use Commons Fileupload 2.0.0-M1 instead of SNAPSHOT --- aws-serverless-java-container-core/pom.xml | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 3eed2022..b8cbce25 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -20,21 +20,6 @@ 6.0.0 - - - apache.snapshots - Apache Development Snapshot Repository - https://repository.apache.org/content/repositories/snapshots/ - - false - - - true - - - - - com.amazonaws @@ -69,7 +54,7 @@ org.apache.commons commons-fileupload2-jakarta - 2.0.0-SNAPSHOT + 2.0.0-M1 From 5afae31480e0ead72762758bebe908bcfc12ff02 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 20 Jul 2023 12:31:35 +0200 Subject: [PATCH 0718/1214] chore(deps): update websocket apis to 2.1.1 (closes #605, #606) --- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 4c41ab83..02ea48b0 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -180,14 +180,14 @@ jakarta.websocket jakarta.websocket-api - 2.1.0 + 2.1.1 test jakarta.websocket jakarta.websocket-client-api - 2.1.0 + 2.1.1 test From a858154116f4f4efa9aa0b78243f0e7687c012d6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 20 Jul 2023 14:03:44 +0200 Subject: [PATCH 0719/1214] chore(deps): Update Spring dependencies (framework to 6.0.11, security to 6.1.2, boot to 3.1.2) #609, #610, #611, #612, #613 --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/builds.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index b8cbce25..dfffbe60 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.1.1 + 6.1.2 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9a2b077e..7d1a9a25 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.0.10 - 6.1.1 + 6.0.11 + 6.1.2 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 02ea48b0..b797d89a 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.0.0-SNAPSHOT - 6.0.10 - 3.1.1 - 6.1.1 + 6.0.11 + 3.1.2 + 6.1.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 7c14db0d..c3159071 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.10', - 'org.springframework:spring-context:6.0.10', + 'org.springframework:spring-webmvc:6.0.11', + 'org.springframework:spring-context:6.0.11', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index b9d3d72d..69927546 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.0.10 + 6.0.11 5.9.3 2.20.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 13c8e76b..2d7977bb 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.1.1', + 'org.springframework.boot:spring-boot-starter-web:3.1.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 2be47cff..673cea59 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.1 + 3.1.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 82048da2..42813a0e 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.10', - 'org.springframework:spring-context:6.0.10', + 'org.springframework:spring-webmvc:6.0.11', + 'org.springframework:spring-context:6.0.11', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 684623a5..2ed9ae0d 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.0.10 + 6.0.11 2.20.0 17 17 diff --git a/samples/springboot3/alt-pet-store/builds.gradle b/samples/springboot3/alt-pet-store/builds.gradle index 00a9d3a1..d6d2ec61 100644 --- a/samples/springboot3/alt-pet-store/builds.gradle +++ b/samples/springboot3/alt-pet-store/builds.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index a8f6220b..1e655268 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.1 + 3.1.2 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 00a9d3a1..d6d2ec61 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index d246cb40..8a21e0fa 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.1 + 3.1.2 From 39045b356102e9b975132dd2cf08320463fcb91a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 20 Jul 2023 14:15:30 +0200 Subject: [PATCH 0720/1214] fix Gradle filename (#603) --- samples/springboot3/alt-pet-store/{builds.gradle => build.gradle} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/springboot3/alt-pet-store/{builds.gradle => build.gradle} (100%) diff --git a/samples/springboot3/alt-pet-store/builds.gradle b/samples/springboot3/alt-pet-store/build.gradle similarity index 100% rename from samples/springboot3/alt-pet-store/builds.gradle rename to samples/springboot3/alt-pet-store/build.gradle From 80fd2773b410fd8b9af25b27cebe8cfa7fd3dc3a Mon Sep 17 00:00:00 2001 From: deki Date: Thu, 20 Jul 2023 12:25:53 +0000 Subject: [PATCH 0721/1214] chore: release - prepare release aws-serverless-java-container-2.0.0-M2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index dfffbe60..30b09b0e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index db3f9dd0..cb8ee0a0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7d1a9a25..e2673242 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b797d89a..812ec42e 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-SNAPSHOT + 2.0.0-M2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0-M2 6.0.11 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0-M2 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e328fee7..c43f6f2a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-SNAPSHOT + 2.0.0-M2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 747ff083..d755e5ca 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-SNAPSHOT + 2.0.0-M2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M2 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 8f478b22..504dc334 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0-M2 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-SNAPSHOT + 2.0.0-M2 maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M2 diff --git a/pom.xml b/pom.xml index 6eb0965c..1dc93572 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-SNAPSHOT + 2.0.0-M2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0-M2 From 3c55f6224fea14d9f2099807f86296ea920003cc Mon Sep 17 00:00:00 2001 From: deki Date: Thu, 20 Jul 2023 12:25:55 +0000 Subject: [PATCH 0722/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 30b09b0e..dfffbe60 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cb8ee0a0..db3f9dd0 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index e2673242..7d1a9a25 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 812ec42e..b797d89a 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-M2 + 2.0.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-M2 + 2.0.0-SNAPSHOT 6.0.11 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-M2 + 2.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c43f6f2a..e328fee7 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-M2 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index d755e5ca..747ff083 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-M2 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M2 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 504dc334..8f478b22 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-M2 + 2.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-M2 + 2.0.0-SNAPSHOT maven-archetype https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M2 + HEAD diff --git a/pom.xml b/pom.xml index 1dc93572..6eb0965c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-M2 + 2.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/awslabs/aws-serverless-java-container @@ -37,7 +37,7 @@ https://github.com/awslabs/aws-serverless-java-container scm:git:https://github.com/awslabs/aws-serverless-java-container.git - aws-serverless-java-container-2.0.0-M2 + HEAD From af891860d2185c3749f35da23b60d053d08fab38 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 14 Aug 2023 08:39:39 +0200 Subject: [PATCH 0723/1214] chore(deps): update JUnit version to 5.10.0 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 28c81422..627cbbd2 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index a59bebfb..3c4149d1 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.2 2.15.2 - 5.9.3 + 5.10.0 diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle index d198e93b..fb1d73c1 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 56038d39..cf4f75a7 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 2.15.2 2.9.4 - 5.9.3 + 5.10.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index c3159071..5d232301 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 69927546..35065eb8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.0.11 - 5.9.3 + 5.10.0 2.20.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 2d7977bb..41494fbd 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 673cea59..dbdaf330 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.9.3 + 5.10.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 5c5dc0db..a01f0a00 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -43,7 +43,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.9.3")) + testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2.1') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 8c3d30e7..a228dd92 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 6.1.2.1 2.15.2 - 5.9.3 + 5.10.0 2.20.0 diff --git a/pom.xml b/pom.xml index 6eb0965c..219bc267 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 8.3.1 2.15.2 2.0.7 - 5.9.3 + 5.10.0 5.4.0 1.3 UTF-8 From 4dac7d827f981465e8c142fd2d1901ff7f2afecb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 14 Aug 2023 09:18:45 +0200 Subject: [PATCH 0724/1214] chore(deps): update Jersey version to 3.1.3 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index db3f9dd0..d028bfda 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.2 + 3.1.3 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 627cbbd2..5552cbef 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.3") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.2") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.3") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 3c4149d1..692bb89c 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.2 + 3.1.3 2.15.2 5.10.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 3bd7dff5..674394de 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.15.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.2") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.3") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.2") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.3") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 78616392..0ed1f95f 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.2 + 3.1.3 2.15.2 From 75fe8a91707a393697b6ea3092a53e8b396061c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 04:54:14 +0000 Subject: [PATCH 0725/1214] chore(deps): bump org.owasp:dependency-check-maven from 8.3.1 to 8.4.0 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 8.3.1 to 8.4.0. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v8.3.1...v8.4.0) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 219bc267..2c5c0ed9 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 8.3.1 + 8.4.0 2.15.2 2.0.7 5.10.0 From 636c483335dadfa56c9e6d9b770c0528ad76d5f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 04:54:20 +0000 Subject: [PATCH 0726/1214] chore(deps): bump com.amazonaws:aws-lambda-java-core from 1.2.2 to 1.2.3 Bumps [com.amazonaws:aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs) from 1.2.2 to 1.2.3. - [Commits](https://github.com/aws/aws-lambda-java-libs/commits) --- updated-dependencies: - dependency-name: com.amazonaws:aws-lambda-java-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index dfffbe60..5d0da0c8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -24,7 +24,7 @@ com.amazonaws aws-lambda-java-core - 1.2.2 + 1.2.3 From ae3de8b9367db70f19717d7c8e63e6745a1b90f6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 24 Aug 2023 14:28:08 +0200 Subject: [PATCH 0727/1214] chore(deps): Update Spring dependencies (security to 6.1.3, boot to 3.1.3) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5d0da0c8..5e29578d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.1.2 + 6.1.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7d1a9a25..608270c0 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 6.0.11 - 6.1.2 + 6.1.3 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b797d89a..cc907f95 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -16,8 +16,8 @@ 6.0.11 - 3.1.2 - 6.1.2 + 3.1.3 + 6.1.3 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 41494fbd..567aae98 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.1.2', + 'org.springframework.boot:spring-boot-starter-web:3.1.3', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index dbdaf330..02693c1b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.2 + 3.1.3 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index d6d2ec61..8b38f55f 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 1e655268..ba4b2433 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.2 + 3.1.3 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index d6d2ec61..8b38f55f 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 8a21e0fa..2fdd615e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.2 + 3.1.3 From bf2e36792b0befdf60b97ba17e9d4dddc8f6b9ab Mon Sep 17 00:00:00 2001 From: kibeom lee Date: Sun, 27 Aug 2023 22:50:45 +0900 Subject: [PATCH 0728/1214] Fix typos in FilterChainManager comments Fixed minor typographical errors in the Javadoc comments of FilterChainManager. --- .../serverless/proxy/internal/servlet/FilterChainManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java index 835170bb..4917b4aa 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java @@ -26,7 +26,7 @@ import java.util.function.Predicate; /** - * This object in in charge of matching a servlet request to a set of filter, creating the filter chain for a request, + * This object is in charge of matching a servlet request to a set of filters, creating the filter chain for a request, * and cache filter chains that were already loaded for re-use. This object should be used by the framework-specific * implementations that use the HttpServletRequest and HttpServletResponse objects. * From 6842d795993c01bcd858fc9253f6a887d0d85f65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 04:25:02 +0000 Subject: [PATCH 0729/1214] chore(deps): bump org.apache.maven.plugins:maven-enforcer-plugin Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.3.0...enforcer-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c5c0ed9..ee2d9eac 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.3.0 + 3.4.0 enforce From 20a06320b3ad0f9227c9dcdaba61614d1a17e573 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 04:25:11 +0000 Subject: [PATCH 0730/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.4.0 to 5.5.0 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.4.0...v5.5.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2c5c0ed9..144d4d0f 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.15.2 2.0.7 5.10.0 - 5.4.0 + 5.5.0 1.3 UTF-8 From 007395460951b8932dde0f60c7d059b213d04313 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 04:51:57 +0000 Subject: [PATCH 0731/1214] chore(deps): bump slf4j.version from 2.0.7 to 2.0.9 Bumps `slf4j.version` from 2.0.7 to 2.0.9. Updates `org.slf4j:slf4j-api` from 2.0.7 to 2.0.9 Updates `org.slf4j:slf4j-simple` from 2.0.7 to 2.0.9 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 11d59a0a..7a1d1898 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 0.7 8.4.0 2.15.2 - 2.0.7 + 2.0.9 5.10.0 5.5.0 1.3 From 4019c878e9f6c4722170669def35f1e254335417 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:05:05 +0900 Subject: [PATCH 0732/1214] Fix dispatch order issue in async request handling Ensure post-processing logic is executed before re-dispatching during asynchronous request handling * SpringBootLambdaContainerHandler - Added logic within the handleRequest method to reprocess the request in cases where an asynchronous request requires re-dispatching. * AwsAsyncContext - Added an isDispatchStarted method that returns whether the dispatch has started or not. - Removed the part where doFilter is directly called within the dispatch function. --- .../internal/servlet/AwsAsyncContext.java | 21 ++++++++++++------- .../SpringBootLambdaContainerHandler.java | 13 ++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 7e3642ef..0dd115b9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -37,6 +37,7 @@ public class AwsAsyncContext implements AsyncContext { private long timeout; private AtomicBoolean dispatched; private AtomicBoolean completed; + private AtomicBoolean dispatchStarted; private Logger log = LoggerFactory.getLogger(AwsAsyncContext.class); @@ -49,6 +50,7 @@ public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response, timeout = 3000; dispatched = new AtomicBoolean(false); completed = new AtomicBoolean(false); + dispatchStarted = new AtomicBoolean(false); } @Override @@ -68,16 +70,15 @@ public boolean hasOriginalRequestAndResponse() { @Override public void dispatch() { - try { - log.debug("Dispatching request"); - if (dispatched.get()) { - throw new IllegalStateException("Dispatching already started"); - } + log.debug("Dispatching request"); + if (dispatched.get()) { + throw new IllegalStateException("Dispatching already started"); + } + if (!dispatchStarted.get()) { + dispatchStarted.set(true); + } else { dispatched.set(true); - handler.doFilter(req, res, ((AwsServletContext)req.getServletContext()).getServletForPath(req.getRequestURI())); notifyListeners(NotificationType.START_ASYNC, null); - } catch (ServletException | IOException e) { - notifyListeners(NotificationType.ERROR, e); } } @@ -154,6 +155,10 @@ public boolean isCompleted() { return completed.get(); } + public boolean isDispatchStarted() { + return dispatchStarted.get(); + } + private void notifyListeners(NotificationType type, Throwable t) { listeners.forEach((h) -> { try { diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 1f7719e9..dd48994a 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -22,6 +22,7 @@ import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; +import jakarta.servlet.AsyncContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.WebApplicationType; @@ -172,9 +173,21 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); } doFilter(containerRequest, containerResponse, reqServlet); + if(requiresAsyncReDispatch(containerRequest)) { + doFilter(containerRequest, containerResponse, reqServlet); + } Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } + private boolean requiresAsyncReDispatch(HttpServletRequest request) { + if (request.isAsyncStarted()) { + AsyncContext asyncContext = request.getAsyncContext(); + return asyncContext instanceof AwsAsyncContext + && ((AwsAsyncContext) asyncContext).isDispatchStarted(); + } + return false; + } + @Override public void initialize() From 14ae2607f1370089cb92a40dcd9e37165e3b8ef8 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Thu, 7 Sep 2023 16:09:13 +0900 Subject: [PATCH 0733/1214] Disable Servlet mapping tests of AwsAsyncContext *AwsAsyncContextTest -Disabled servlet mapping tests as it no longer make servlet requests. --- .../serverless/proxy/internal/servlet/AwsAsyncContextTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index 2177fa8b..e4db0e67 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -10,6 +10,7 @@ import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.services.lambda.runtime.Context; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import jakarta.servlet.AsyncContext; @@ -32,6 +33,7 @@ public class AwsAsyncContextTest { private AwsServletContextTest.TestServlet srv2 = new AwsServletContextTest.TestServlet("srv2"); private AwsServletContext ctx = getCtx(); + @Disabled //AwsAsyncContext does not sends to servlet anymore @Test void dispatch_sendsToCorrectServlet() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); @@ -58,6 +60,7 @@ void dispatch_sendsToCorrectServlet() { assertEquals(202, handler.getResponse().getStatus()); } + @Disabled //AwsAsyncContext does not sends to servlet anymore @Test void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest)reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); From cfcff4c2259d4743d81ee2e44a28a52d03dd3f27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 04:33:06 +0000 Subject: [PATCH 0734/1214] chore(deps): bump org.apache.maven.plugins:maven-enforcer-plugin Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.4.0...enforcer-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7a1d1898..e7cabafd 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.4.0 + 3.4.1 enforce From 096c4819c0e9ee18ec0db86fcd6a427d8f2a7d59 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Fri, 15 Sep 2023 03:08:57 +0900 Subject: [PATCH 0735/1214] add tests -Added jpaapp.JpaApplication for H2 and Spring Data JPA testing. -Excluded JPA auto-configuration from other test apps to prevent interference. -Implemented one async and one sync test case in JpaAppTest --- .../pom.xml | 40 +++++++++++++ .../serverless/proxy/spring/JpaAppTest.java | 52 ++++++++++++++++ .../proxy/spring/jpaapp/DatabaseConfig.java | 23 ++++++++ .../proxy/spring/jpaapp/JpaApplication.java | 17 ++++++ .../proxy/spring/jpaapp/LambdaHandler.java | 59 +++++++++++++++++++ .../spring/jpaapp/MessageController.java | 31 ++++++++++ .../securityapp/SecurityApplication.java | 5 +- .../spring/servletapp/ServletApplication.java | 4 +- .../spring/slowapp/SlowTestApplication.java | 4 +- .../webfluxapp/WebFluxTestApplication.java | 4 +- 10 files changed, 235 insertions(+), 4 deletions(-) create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index cc907f95..56c61773 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -191,6 +191,46 @@ test + + org.springframework.boot + spring-boot-starter-data-jpa + 3.1.3 + test + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.apache.tomcat.embed + tomcat-embed-core + + + org.apache.tomcat.embed + tomcat-embed-websocket + + + + + com.h2database + h2 + 2.2.222 + test + + + diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java new file mode 100644 index 00000000..a111e510 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java @@ -0,0 +1,52 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.jpaapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.jpaapp.MessageController; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.Collection; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class JpaAppTest { + + LambdaHandler handler; + MockLambdaContext lambdaContext = new MockLambdaContext(); + + private String type; + + public static Collection data() { + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); + } + + public void initJpaAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + + @MethodSource("data") + @ParameterizedTest + void asyncRequest(String reqType) { + initJpaAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") + .json() + .body("{\"name\":\"kong\"}"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals("{\"name\":\"KONG\"}", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initJpaAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + +} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java new file mode 100644 index 00000000..aeef7c65 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java @@ -0,0 +1,23 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.sql.DataSource; + +@Configuration +public class DatabaseConfig { + + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("org.h2.Driver"); + dataSource.setUrl("jdbc:h2:mem:testdb"); + dataSource.setUsername("sa"); + dataSource.setPassword(""); + + return dataSource; + } +} + diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java new file mode 100644 index 00000000..5aced5e2 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java @@ -0,0 +1,17 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingSystem; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class +}) +@Import(MessageController.class) +public class JpaApplication {} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java new file mode 100644 index 00000000..0cf67c10 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java @@ -0,0 +1,59 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; + + public LambdaHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(JpaApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(JpaApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } +} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java new file mode 100644 index 00000000..a8529226 --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java @@ -0,0 +1,31 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.async.DeferredResult; +import java.util.Collections; +import java.util.Map; + +@RestController +public class MessageController { + + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) + public String hello() { + return HELLO_MESSAGE; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(path = "/async", method = RequestMethod.POST) + @ResponseBody + public DeferredResult> asyncResult(@RequestBody Map value) { + DeferredResult result = new DeferredResult<>(); + result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); + return result; + } + +} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java index cafcd400..d4036dcf 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java @@ -6,7 +6,10 @@ import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.web.reactive.config.EnableWebFlux; -@SpringBootApplication +@SpringBootApplication(exclude = { + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, + org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class +}) @EnableWebFluxSecurity @EnableWebFlux @Import(SecurityConfig.class) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java index 07ddbab4..0cb001ed 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -9,7 +9,9 @@ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, + org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class }) @Import(MessageController.class) public class ServletApplication { diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java index b3fe177a..006e51e4 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java @@ -8,7 +8,9 @@ @SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class + org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, + org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class }) public class SlowTestApplication { diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java index 70e0c993..fc6aecd6 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -13,7 +13,9 @@ org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, + org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class }) public class WebFluxTestApplication { From 93c03c820a6066ae3a8a51a9be842c9f8973087f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 04:22:49 +0000 Subject: [PATCH 0736/1214] chore(deps): bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.5.0...maven-javadoc-plugin-3.6.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e7cabafd..1f681d40 100644 --- a/pom.xml +++ b/pom.xml @@ -201,7 +201,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.5.0 + 3.6.0 org.apache.maven.plugins From 5615394a840f97aff45371693aed90df1af4bfe6 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Tue, 19 Sep 2023 03:46:53 +0900 Subject: [PATCH 0737/1214] Add test case for AwsAsyncContext --- .../internal/servlet/AwsAsyncContextTest.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index e4db0e67..dd452dc1 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -33,7 +33,21 @@ public class AwsAsyncContextTest { private AwsServletContextTest.TestServlet srv2 = new AwsServletContextTest.TestServlet("srv2"); private AwsServletContext ctx = getCtx(); - @Disabled //AwsAsyncContext does not sends to servlet anymore + + @Test + void dispatch_amendsPath() throws InvalidRequestEventException { + AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest)reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); + req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); + req.setServletContext(ctx); + req.setContainerHandler(handler); + + AsyncContext asyncCtx = req.startAsync(); + handler.setDesiredStatus(301); + asyncCtx.dispatch("/srv4/hello"); + assertEquals("/srv1/hello", req.getRequestURI()); + } + + @Disabled("AwsAsyncContext does not sends to servlet anymore") @Test void dispatch_sendsToCorrectServlet() { AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); @@ -60,7 +74,7 @@ void dispatch_sendsToCorrectServlet() { assertEquals(202, handler.getResponse().getStatus()); } - @Disabled //AwsAsyncContext does not sends to servlet anymore + @Disabled("AwsAsyncContext does not sends to servlet anymore") @Test void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest)reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); From ab62529c7dd393ed0cb7795693607e3f491b2fc2 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Tue, 19 Sep 2023 03:57:34 +0900 Subject: [PATCH 0738/1214] fix handleRequest redispatch -get reqServlet before doFilter for redispatch --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index dd48994a..752623cd 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -174,6 +174,7 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet } doFilter(containerRequest, containerResponse, reqServlet); if(requiresAsyncReDispatch(containerRequest)) { + reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); doFilter(containerRequest, containerResponse, reqServlet); } Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); From aa203912b9a3f871aa40e08f45506e01ccadd3da Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Tue, 19 Sep 2023 04:04:14 +0900 Subject: [PATCH 0739/1214] fix handleRequest re-dispatch -Added re-dispatch logic inside SpringLambdaContainerHandler's handleRequest --- .../proxy/spring/SpringLambdaContainerHandler.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 5e56dba6..3c6fcf8b 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -20,6 +20,7 @@ import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; +import jakarta.servlet.AsyncContext; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; @@ -160,9 +161,21 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet // process filters Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); doFilter(containerRequest, containerResponse, reqServlet); + if(requiresAsyncReDispatch(containerRequest)) { + reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + doFilter(containerRequest, containerResponse, reqServlet); + } Timer.stop("SPRING_HANDLE_REQUEST"); } + private boolean requiresAsyncReDispatch(HttpServletRequest request) { + if (request.isAsyncStarted()) { + AsyncContext asyncContext = request.getAsyncContext(); + return asyncContext instanceof AwsAsyncContext + && ((AwsAsyncContext) asyncContext).isDispatchStarted(); + } + return false; + } @Override public void initialize() From 3047ca99c3d1e8a1c0ebf50c47f3106491a36170 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Tue, 19 Sep 2023 04:47:04 +0900 Subject: [PATCH 0740/1214] add test case for spring -Added test cases for async request --- .../serverless/proxy/spring/AsyncAppTest.java | 46 +++++++++++++++++++ .../proxy/spring/springapp/AppConfig.java | 8 ++++ .../proxy/spring/springapp/LambdaHandler.java | 26 +++++++++++ .../spring/springapp/MessageController.java | 25 ++++++++++ 4 files changed, 105 insertions(+) create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/AsyncAppTest.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/AppConfig.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/MessageController.java diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/AsyncAppTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/AsyncAppTest.java new file mode 100644 index 00000000..8265e1bf --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/AsyncAppTest.java @@ -0,0 +1,46 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.springapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.springapp.MessageController; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class AsyncAppTest { + + private static LambdaHandler handler; + + @BeforeAll + public static void setUp() { + try { + handler = new LambdaHandler(); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + fail(); + } + } + + @Test + void springApp_helloRequest_returnsCorrect() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, new MockLambdaContext()); + assertEquals(200, resp.getStatusCode()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + + @Test + void springApp_asyncRequest_returnsCorrect() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/async", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, new MockLambdaContext()); + assertEquals(200, resp.getStatusCode()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/AppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/AppConfig.java new file mode 100644 index 00000000..d3562c22 --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/AppConfig.java @@ -0,0 +1,8 @@ +package com.amazonaws.serverless.proxy.spring.springapp; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({MessageController.class}) +public class AppConfig { } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/LambdaHandler.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/LambdaHandler.java new file mode 100644 index 00000000..f0cad13c --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/LambdaHandler.java @@ -0,0 +1,26 @@ +package com.amazonaws.serverless.proxy.spring.springapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private SpringLambdaContainerHandler handler; + + public LambdaHandler() throws ContainerInitializationException { + handler = new SpringProxyHandlerBuilder() + .defaultProxy() + .asyncInit() + .configurationClasses(AppConfig.class) + .buildAndInitialize(); + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/MessageController.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/MessageController.java new file mode 100644 index 00000000..1f5dc83d --- /dev/null +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/springapp/MessageController.java @@ -0,0 +1,25 @@ +package com.amazonaws.serverless.proxy.spring.springapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@RestController +@EnableWebMvc +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } + + @RequestMapping(path="/async", method= RequestMethod.GET) + public DeferredResult asyncHello() { + DeferredResult result = new DeferredResult<>(); + result.setResult(HELLO_MESSAGE); + return result; + } +} From ff1d5cf085f32e4effeb26f2c2614c37272c5bf3 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Tue, 19 Sep 2023 04:50:16 +0900 Subject: [PATCH 0741/1214] edit test case for AwsAsyncContext --- .../serverless/proxy/internal/servlet/AwsAsyncContextTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index dd452dc1..9bbbc13a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -42,7 +42,6 @@ void dispatch_amendsPath() throws InvalidRequestEventException { req.setContainerHandler(handler); AsyncContext asyncCtx = req.startAsync(); - handler.setDesiredStatus(301); asyncCtx.dispatch("/srv4/hello"); assertEquals("/srv1/hello", req.getRequestURI()); } From c92a0e90831139824e2215457a667a3e5a3653e7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 21 Sep 2023 15:13:57 +0200 Subject: [PATCH 0742/1214] chore(deps): Update Spring dependencies (framework to 6.0.12, security to 6.1.4, boot to 3.1.4) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5e29578d..5d23fcbf 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.1.3 + 6.1.4 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 608270c0..2e590866 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.0.11 - 6.1.3 + 6.0.12 + 6.1.4 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index cc907f95..974345fe 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.0.0-SNAPSHOT - 6.0.11 - 3.1.3 - 6.1.3 + 6.0.12 + 3.1.4 + 6.1.4 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 5d232301..bc76f577 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.11', - 'org.springframework:spring-context:6.0.11', + 'org.springframework:spring-webmvc:6.0.12', + 'org.springframework:spring-context:6.0.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 35065eb8..455c9e31 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.0.11 + 6.0.12 5.10.0 2.20.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 567aae98..f6972663 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.1.3', + 'org.springframework.boot:spring-boot-starter-web:3.1.4', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 02693c1b..54625efa 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.3 + 3.1.4 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 42813a0e..072b8096 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.0.11', - 'org.springframework:spring-context:6.0.11', + 'org.springframework:spring-webmvc:6.0.12', + 'org.springframework:spring-context:6.0.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.20.0', 'org.apache.logging.log4j:log4j-api:2.20.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 2ed9ae0d..9c87d85c 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.0.11 + 6.0.12 2.20.0 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 8b38f55f..65386b0f 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index ba4b2433..c0d39c7e 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.3 + 3.1.4 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 8b38f55f..65386b0f 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.1.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.1.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 2fdd615e..96264cf5 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.1.3 + 3.1.4 From 3739cdbe9f2a8d9e3b7d067b6676ae1550aec0c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 04:42:26 +0000 Subject: [PATCH 0743/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.3.5 to 4.7.3.6. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.3.5...spotbugs-maven-plugin-4.7.3.6) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1f681d40..ca133620 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.7.3.5 + 4.7.3.6 + + + + + diff --git a/samples/springboot3/alt-pet-store/src/main/resources/logback.xml b/samples/springboot3/alt-pet-store/src/main/resources/logback.xml index 14a3a84f..81d89177 100644 --- a/samples/springboot3/alt-pet-store/src/main/resources/logback.xml +++ b/samples/springboot3/alt-pet-store/src/main/resources/logback.xml @@ -1,5 +1,6 @@ - + + \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/template.yml b/samples/springboot3/alt-pet-store/template.yml index c883f085..8a51c8d1 100644 --- a/samples/springboot3/alt-pet-store/template.yml +++ b/samples/springboot3/alt-pet-store/template.yml @@ -14,7 +14,7 @@ Resources: # AutoPublishAlias: bcn FunctionName: pet-store-boot-3 Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest - Runtime: java21 + Runtime: java17 SnapStart: ApplyOn: PublishedVersions CodeUri: . From 4fee8fce73e8223fe3bd82fbf099b0e90af9a275 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 12 Jan 2024 16:15:15 +0100 Subject: [PATCH 0804/1214] chore(deps): update commons-fileupload to 2.0.0-M2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 17f8edc7..2a290f85 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -53,8 +53,8 @@ org.apache.commons - commons-fileupload2-jakarta - 2.0.0-M1 + commons-fileupload2-jakarta-servlet6 + 2.0.0-M2 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index ca5d163e..31d26a18 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -25,7 +25,7 @@ import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileUploadException; import org.apache.commons.fileupload2.core.DiskFileItemFactory; -import org.apache.commons.fileupload2.jakarta.JakartaServletFileUpload; +import org.apache.commons.fileupload2.jakarta.servlet6.JakartaServletFileUpload; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.input.NullInputStream; From 13c0d3fe04b5202c52cfb742a53ecb820dd418be Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 12 Jan 2024 17:16:14 +0100 Subject: [PATCH 0805/1214] refactor: use defaultCharset, polishing --- .../servlet/AwsHttpServletRequest.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 31d26a18..d17270d9 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -22,6 +22,7 @@ import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.apache.commons.fileupload2.core.DiskFileItem; import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileUploadException; import org.apache.commons.fileupload2.core.DiskFileItemFactory; @@ -41,7 +42,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -312,7 +313,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) { */ protected String generateQueryString(MultiValuedTreeMap parameters, boolean encode, String encodeCharset) throws ServletException { - if (parameters == null || parameters.size() == 0) { + if (parameters == null || parameters.isEmpty()) { return null; } if (queryString != null) { @@ -396,7 +397,7 @@ protected String parseCharacterEncoding(String contentTypeHeader) { } protected String appendCharacterEncoding(String currentContentType, String newEncoding) { - if (currentContentType == null || "".equals(currentContentType.trim())) { + if (currentContentType == null || currentContentType.trim().isEmpty()) { return null; } @@ -429,13 +430,13 @@ protected ServletInputStream bodyStringToInputStream(String body, boolean isBase } else { String encoding = getCharacterEncoding(); if (encoding == null) { - encoding = StandardCharsets.ISO_8859_1.name(); + encoding = Charset.defaultCharset().name(); } try { bodyBytes = body.getBytes(encoding); } catch (Exception e) { log.error("Could not read request with character encoding: " + SecurityUtils.crlf(encoding), e); - bodyBytes = body.getBytes(StandardCharsets.ISO_8859_1.name()); + bodyBytes = body.getBytes(Charset.defaultCharset()); } } ByteArrayInputStream requestBodyStream = new ByteArrayInputStream(bodyBytes); @@ -486,7 +487,7 @@ protected Map> getFormUrlEncodedParametersMap() { Timer.start("SERVLET_REQUEST_GET_FORM_PARAMS"); String rawBodyContent = null; try { - rawBodyContent = IOUtils.toString(getInputStream()); + rawBodyContent = IOUtils.toString(getInputStream(), getCharacterEncoding()); } catch (IOException e) { throw new RuntimeException(e); } @@ -543,11 +544,12 @@ protected Map> getMultipartFormParametersMap() { Timer.start("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); multipartFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - JakartaServletFileUpload upload = new JakartaServletFileUpload(DiskFileItemFactory.builder().get()); + JakartaServletFileUpload upload = + new JakartaServletFileUpload<>(DiskFileItemFactory.builder().get()); try { - List items = upload.parseRequest(this); - for (FileItem item : items) { + List items = upload.parseRequest(this); + for (FileItem item : items) { String fileName = FilenameUtils.getName(item.getName()); AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); newPart.setName(item.getFieldName()); @@ -684,11 +686,10 @@ protected List parseHeaderValue(String headerValue, String valueSep return values; } - for (String v : headerValue.split(valueSeparator)) { - String curValue = v; + for (String curValue : headerValue.split(valueSeparator)) { float curPreference = 1.0f; HeaderValue newValue = new HeaderValue(); - newValue.setRawValue(v); + newValue.setRawValue(curValue); for (String q : curValue.split(qualifierSeparator)) { @@ -704,7 +705,7 @@ protected List parseHeaderValue(String headerValue, String valueSep // if the length of the value is 0 we assume that we are looking at a // base64 encoded value with padding so we just set the value. This is because // we assume that empty values in a key/value pair will contain at least a white space - if (kv[1].length() == 0) { + if (kv[1].isEmpty()) { val = q.trim(); } // this was a base64 string with an additional = for padding, set the value only @@ -752,7 +753,7 @@ protected List parseAcceptLanguageHeader(String headerValue) { ); List locales = new ArrayList<>(); - if (values.size() == 0) { + if (values.isEmpty()) { locales.add(Locale.getDefault()); } else { for (HeaderValue locale : values) { From 40f7050d69c5f5302091ab5bbd1e4743d8616026 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 04:37:37 +0000 Subject: [PATCH 0806/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.2.0 to 4.8.3.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.2.0...spotbugs-maven-plugin-4.8.3.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5dd12327..01c3162d 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.2.0 + 4.8.3.0 + com/amazonaws/serverless/proxy/spring/AWSWebRuntimeEventLoop* + com/amazonaws/serverless/proxy/spring/AWSTypesProcessor* + From 026bb8ef1f87c1bcdf6d0fb504635eb630b47b6e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 15 Jan 2024 13:07:17 +0100 Subject: [PATCH 0811/1214] test: address deprecation warnings --- .../serverless/proxy/spring/SpringAwsProxyTest.java | 3 --- .../proxy/spring/echoapp/model/ValidatedUserModel.java | 5 ++--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 1101efc8..9504b616 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -56,9 +56,6 @@ public class SpringAwsProxyTest { // update the registration to map to a path registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/echo/*"); // servlet name mappings are disabled and will throw an exception - - //handler.getApplicationInitializer().getDispatcherServlet().setThrowExceptionIfNoHandlerFound(true); - ((DispatcherServlet)((AwsServletRegistration)c.getServletRegistration("dispatcherServlet")).getServlet()).setThrowExceptionIfNoHandlerFound(true); }); private String type; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java index 1e5b83c3..c587429d 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/model/ValidatedUserModel.java @@ -1,8 +1,7 @@ package com.amazonaws.serverless.proxy.spring.echoapp.model; -import org.hibernate.validator.constraints.Email; -import org.hibernate.validator.constraints.NotEmpty; - +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; public class ValidatedUserModel { From 98434ddf74b7ede115f05c40a6288ab9c3e1dffd Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 21 Jan 2024 15:14:58 +0900 Subject: [PATCH 0812/1214] Update spring-boot-starter-data-jpa version for test --- aws-serverless-java-container-springboot3/pom.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index d71a9372..3e90469c 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -194,7 +194,7 @@ org.springframework.boot spring-boot-starter-data-jpa - 3.1.3 + 3.2.1 test @@ -324,6 +324,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 10 + 10 + + From fc53fa67692724812bc33c490b9773d7a5018183 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 21 Jan 2024 16:29:24 +0900 Subject: [PATCH 0813/1214] Refactor: Move Redispatch Logic from Spring Boot 3 and Spring Packages to Core --- .../servlet/AwsLambdaServletContainerHandler.java | 14 +++++++++++++- .../proxy/spring/SpringLambdaContainerHandler.java | 13 ------------- .../spring/SpringBootLambdaContainerHandler.java | 14 -------------- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java index b35bba92..7437449e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java @@ -152,13 +152,25 @@ protected void doFilter(HttpServletRequest request, HttpServletResponse response FilterChain chain = getFilterChain(request, servlet); chain.doFilter(request, response); - + if(requiresAsyncReDispatch(request)) { + chain = getFilterChain(request, servlet); + chain.doFilter(request, response); + } // if for some reason the response wasn't flushed yet, we force it here unless it's being processed asynchronously (WebFlux) if (!response.isCommitted() && request.getDispatcherType() != DispatcherType.ASYNC) { response.flushBuffer(); } } + private boolean requiresAsyncReDispatch(HttpServletRequest request) { + if (request.isAsyncStarted()) { + AsyncContext asyncContext = request.getAsyncContext(); + return asyncContext instanceof AwsAsyncContext + && ((AwsAsyncContext) asyncContext).isDispatchStarted(); + } + return false; + } + @Override public void initialize() throws ContainerInitializationException { // we expect all servlets to be wrapped in an AwsServletRegistration diff --git a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java index 3c6fcf8b..5e56dba6 100644 --- a/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java +++ b/aws-serverless-java-container-spring/src/main/java/com/amazonaws/serverless/proxy/spring/SpringLambdaContainerHandler.java @@ -20,7 +20,6 @@ import com.amazonaws.serverless.proxy.internal.servlet.*; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import jakarta.servlet.AsyncContext; import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; @@ -161,21 +160,9 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet // process filters Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); doFilter(containerRequest, containerResponse, reqServlet); - if(requiresAsyncReDispatch(containerRequest)) { - reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - doFilter(containerRequest, containerResponse, reqServlet); - } Timer.stop("SPRING_HANDLE_REQUEST"); } - private boolean requiresAsyncReDispatch(HttpServletRequest request) { - if (request.isAsyncStarted()) { - AsyncContext asyncContext = request.getAsyncContext(); - return asyncContext instanceof AwsAsyncContext - && ((AwsAsyncContext) asyncContext).isDispatchStarted(); - } - return false; - } @Override public void initialize() diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 752623cd..1f7719e9 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -22,7 +22,6 @@ import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; import com.amazonaws.services.lambda.runtime.Context; -import jakarta.servlet.AsyncContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.WebApplicationType; @@ -173,22 +172,9 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); } doFilter(containerRequest, containerResponse, reqServlet); - if(requiresAsyncReDispatch(containerRequest)) { - reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - doFilter(containerRequest, containerResponse, reqServlet); - } Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } - private boolean requiresAsyncReDispatch(HttpServletRequest request) { - if (request.isAsyncStarted()) { - AsyncContext asyncContext = request.getAsyncContext(); - return asyncContext instanceof AwsAsyncContext - && ((AwsAsyncContext) asyncContext).isDispatchStarted(); - } - return false; - } - @Override public void initialize() From db267a67f6abd752b4fdd89f34f509a1b7a0b88e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 21 Jan 2024 08:55:22 +0100 Subject: [PATCH 0814/1214] docs: project graduated from awslabs to aws GitHub organization --- CONTRIBUTING.md | 6 ++--- README.md | 26 +++++++++---------- .../internal/LambdaContainerHandler.java | 2 +- .../internal/servlet/AwsServletContext.java | 2 +- aws-serverless-jersey-archetype/pom.xml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../resources/archetype-resources/pom.xml | 2 +- aws-serverless-spark-archetype/pom.xml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../resources/archetype-resources/pom.xml | 2 +- aws-serverless-spring-archetype/pom.xml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../resources/archetype-resources/pom.xml | 2 +- aws-serverless-springboot3-archetype/pom.xml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/application.properties | 2 +- aws-serverless-struts-archetype/pom.xml | 2 +- .../resources/archetype-resources/README.md | 2 +- .../resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/application.properties | 2 +- pom.xml | 8 +++--- samples/jersey/pet-store/pom.xml | 2 +- samples/spark/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 26 files changed, 43 insertions(+), 43 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4d490d0f..5d42e96a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ information to effectively respond to your bug report or contribution. We welcome you to use the GitHub issue tracker to report bugs or suggest features. -When filing an issue, please check [existing open](https://github.com/awslabs/aws-serverless-java-container/issues), or [recently closed](https://github.com/awslabs/aws-serverless-java-container/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already +When filing an issue, please check [existing open](https://github.com/aws/serverless-java-container/issues), or [recently closed](https://github.com/aws/serverless-java-container/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: * A reproducible test case or series of steps @@ -41,7 +41,7 @@ GitHub provides additional document on [forking a repository](https://help.githu ## Finding contributions to work on -Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels ((enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/awslabs/aws-serverless-java-container/labels/help%20wanted) issues is a great place to start. +Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels ((enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/aws/serverless-java-container/labels/help%20wanted) issues is a great place to start. ## Code of Conduct @@ -56,6 +56,6 @@ If you discover a potential security issue in this project we ask that you notif ## Licensing -See the [LICENSE](https://github.com/awslabs/aws-serverless-java-container/blob/master/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. +See the [LICENSE](https://github.com/aws/serverless-java-container/blob/master/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. diff --git a/README.md b/README.md index 33622db3..17457647 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Serverless Java container [![Build Status](https://github.com/awslabs/aws-serverless-java-container/workflows/Continuous%20Integration/badge.svg)](https://github.com/awslabs/aws-serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) +# Serverless Java container [![Build Status](https://github.com/aws/serverless-java-container/workflows/Continuous%20Integration/badge.svg)](https://github.com/aws/serverless-java-container/actions) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/aws/serverless-java-container) The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Apache Struts](http://struts.apache.org/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/). Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings. @@ -7,18 +7,18 @@ Currently the following versions are maintained: | Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | |--------------------------|--------|-------------------------|-----------------|------------------------|----------------|---------------| -| 1.x (stable) | [1.x](https://github.com/awslabs/aws-serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | -| 2.x (under development) | [main](https://github.com/awslabs/aws-serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | - -Follow the quick start guides in [our wiki](https://github.com/awslabs/aws-serverless-java-container/wiki) to integrate Serverless Java Container with your project: -* [Spring quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring) -* [Spring Boot 2 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot2) -* [Spring Boot 3 quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot3) -* [Apache Struts quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Struts) -* [Jersey quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Jersey) -* [Spark quick start](https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spark) - -Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/awslabs/aws-serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/awslabs/aws-serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). +| 1.x (stable) | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | +| 2.x (under development) | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | + +Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: +* [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) +* [Spring Boot 2 quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring-Boot2) +* [Spring Boot 3 quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring-Boot3) +* [Apache Struts quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Struts) +* [Jersey quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Jersey) +* [Spark quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spark) + +Below is the most basic AWS Lambda handler example that launches a Spring application. You can also take a look at the [samples](https://github.com/aws/serverless-java-container/tree/master/samples) in this repository, our main wiki page includes a [step-by-step guide](https://github.com/aws/serverless-java-container/wiki#deploying-the-sample-applications) on how to deploy the various sample applications using Maven and [SAM](https://github.com/awslabs/serverless-application-model). ```java public class StreamLambdaHandler implements RequestStreamHandler { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index d736d637..f1425160 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -163,7 +163,7 @@ public void setInitializationWrapper(InitializationWrapper wrapper) { /** * Configures the library to strip a base path from incoming requests before passing them on to the wrapped - * framework. This was added in response to issue #34 (https://github.com/awslabs/aws-serverless-java-container/issues/34). + * framework. This was added in response to issue #34 (https://github.com/aws/serverless-java-container/issues/34). * When creating a base path mapping for custom domain names in API Gateway we want to be able to strip the base path * from the request - the underlying service may not recognize this path. * @param basePath The base path to be stripped from the request diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java index 5211e68d..94dcaf44 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletContext.java @@ -169,7 +169,7 @@ public String getMimeType(String file) { String mimeType = null; - // may not work on Lambda until mailcap package is present https://github.com/awslabs/aws-serverless-java-container/pull/504 + // may not work on Lambda until mailcap package is present https://github.com/aws/serverless-java-container/pull/504 try { mimeType = Files.probeContentType(Paths.get(file)); } catch (IOException | InvalidPathException e) { diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index e328fee7..15fd76b8 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -13,7 +13,7 @@ maven-archetype - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git HEAD diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md index 1017a83a..311c40ae 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/README.md @@ -16,7 +16,7 @@ #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) # \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 9cad88b8..d5f7c0c7 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -9,7 +9,7 @@ jar Serverless Jersey API - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container 1.8 diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml index 90dcabf4..d0ce113f 100644 --- a/aws-serverless-spark-archetype/pom.xml +++ b/aws-serverless-spark-archetype/pom.xml @@ -13,7 +13,7 @@ maven-archetype - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git HEAD diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md index 1017a83a..311c40ae 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md @@ -16,7 +16,7 @@ #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) # \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml index 3cae4649..1151dd29 100644 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml @@ -11,7 +11,7 @@ jar Serverless Spark API - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container 1.8 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 747ff083..b5891f92 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -13,7 +13,7 @@ maven-archetype - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git HEAD diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md index 1017a83a..311c40ae 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/README.md @@ -16,7 +16,7 @@ #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) # \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index b6867441..093924da 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -11,7 +11,7 @@ jar Serverless Spring API - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container 1.8 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 8f478b22..a6cf366b 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -13,7 +13,7 @@ maven-archetype - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git HEAD diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md index 1017a83a..311c40ae 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md @@ -16,7 +16,7 @@ #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) # \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 1382f9bd..396a77b0 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -11,7 +11,7 @@ jar Serverless Spring Boot 3 API - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container org.springframework.boot diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties index ec1cb979..070e632f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -1,3 +1,3 @@ # Reduce logging level to make sure the application works with SAM local -# https://github.com/awslabs/aws-serverless-java-container/issues/134 +# https://github.com/aws/serverless-java-container/issues/134 logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index 1d0e078a..0e12ca51 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -13,7 +13,7 @@ maven-archetype - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git HEAD diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md index 1017a83a..311c40ae 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md @@ -16,7 +16,7 @@ #set($resourceName = "#replaceChar($resourceName, '.')") #set($resourceName = $resourceName.replaceAll("\n", "").trim()) # \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/awslabs/aws-serverless-java-container). +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 15cbc1dd..d7664d12 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -10,7 +10,7 @@ jar Serverless Struts API - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container 1.8 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties index ec1cb979..070e632f 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -1,3 +1,3 @@ # Reduce logging level to make sure the application works with SAM local -# https://github.com/awslabs/aws-serverless-java-container/issues/134 +# https://github.com/aws/serverless-java-container/issues/134 logging.level.root=WARN \ No newline at end of file diff --git a/pom.xml b/pom.xml index 4b149262..9cd64107 100644 --- a/pom.xml +++ b/pom.xml @@ -7,10 +7,10 @@ 2.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda - https://github.com/awslabs/aws-serverless-java-container + https://github.com/aws/serverless-java-container GitHub Issues - https://github.com/awslabs/aws-serverless-java-container/issues + https://github.com/aws/serverless-java-container/issues @@ -35,8 +35,8 @@ - https://github.com/awslabs/aws-serverless-java-container - scm:git:https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container + scm:git:https://github.com/aws/serverless-java-container.git HEAD diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index b7cae757..7a5ed7fb 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -12,7 +12,7 @@ https://aws.amazon.com/lambda/ - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml index cf2e5660..f1dee637 100644 --- a/samples/spark/pet-store/pom.xml +++ b/samples/spark/pet-store/pom.xml @@ -12,7 +12,7 @@ https://aws.amazon.com/lambda/ - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index d60e4817..e60226d8 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -12,7 +12,7 @@ https://aws.amazon.com/lambda/ - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 85f52730..c547d9cc 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -12,7 +12,7 @@ https://aws.amazon.com/lambda/ - https://github.com/awslabs/aws-serverless-java-container.git + https://github.com/aws/serverless-java-container.git From b471fe4b1701ac9dfff0dab2d7fd03378ff28481 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 21 Jan 2024 09:00:45 +0100 Subject: [PATCH 0815/1214] chore(deps): Update Spring dependencies (framework to 6.1.3, boot to 3.2.2) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 16 files changed, 26 insertions(+), 26 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 57e1bed6..5a5ff547 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 6.1.2 + 6.1.3 6.2.1 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 51ad6f1f..9b4d941c 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,8 +15,8 @@ 2.0.0-SNAPSHOT - 6.1.2 - 3.2.1 + 6.1.3 + 3.2.2 6.2.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index f82bb3d6..1f1d1af7 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.2', - 'org.springframework:spring-context:6.1.2', + 'org.springframework:spring-webmvc:6.1.3', + 'org.springframework:spring-context:6.1.3', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.22.1', 'org.apache.logging.log4j:log4j-api:2.22.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 093924da..5aa0330b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.2 + 6.1.3 5.10.1 2.22.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 1a04756f..2f2ebee1 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.2.1', + 'org.springframework.boot:spring-boot-starter-web:3.2.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 396a77b0..f990dda8 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.2.2 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index dba15956..1f03497b 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:6.1.2.1') { + implementation ('org.apache.struts:struts2-convention-plugin:6.1.3.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:6.1.2.1') { + implementation ('org.apache.struts:struts2-rest-plugin:6.1.3.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.2.1') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.3.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:6.1.2.1') { + implementation ('org.apache.struts:struts2-core:6.1.3.1') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation(platform("org.junit:junit-bom:5.10.1")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:6.1.2.1') { + testImplementation('org.apache.struts:struts2-junit-plugin:6.1.3.1') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index d7664d12..485fa214 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 6.1.2.1 + 6.1.3.1 2.16.1 5.10.1 2.22.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 70e6d22b..586773bd 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.2', - 'org.springframework:spring-context:6.1.2', + 'org.springframework:spring-webmvc:6.1.3', + 'org.springframework:spring-context:6.1.3', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.22.1', 'org.apache.logging.log4j:log4j-api:2.22.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e60226d8..6c0fb81e 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.2 + 6.1.3 2.22.1 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 99871806..b59cc972 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 7bfd00bf..950ad683 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.2.2 diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 99871806..b59cc972 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 291b8bb0..569552a7 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.2.2 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 491419e3..4982518a 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', - 'org.apache.struts:struts2-convention-plugin:6.1.2.1', - 'org.apache.struts:struts2-rest-plugin:6.1.2.1', - 'org.apache.struts:struts2-bean-validation-plugin:6.1.2.1', - 'org.apache.struts:struts2-junit-plugin:6.1.2.1', + 'org.apache.struts:struts2-convention-plugin:6.1.3.1', + 'org.apache.struts:struts2-rest-plugin:6.1.3.1', + 'org.apache.struts:struts2-bean-validation-plugin:6.1.3.1', + 'org.apache.struts:struts2-junit-plugin:6.1.3.1', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:javax.el:3.0.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index c547d9cc..6eacfc31 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 6.1.2.1 + 6.1.3.1 2.16.1 4.13.2 2.22.1 From fd96f7fb90ab9f9d74f484f4ea17217e486859e9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 21 Jan 2024 09:30:36 +0100 Subject: [PATCH 0816/1214] refactor: Delete Spark related implementations as the project is no longer maintained --- .../continuous-integration-workflow.yml | 8 - .../jersey/JerseyLambdaContainerHandler.java | 2 +- aws-serverless-java-container-spark/pom.xml | 134 ---------- .../spark/SparkLambdaContainerHandler.java | 251 ------------------ .../embeddedserver/LambdaEmbeddedServer.java | 119 --------- .../LambdaEmbeddedServerFactory.java | 72 ----- .../spark/HelloWorldSparkStreamTest.java | 160 ----------- .../proxy/spark/HelloWorldSparkTest.java | 176 ------------ .../proxy/spark/InitExceptionHandlerTest.java | 76 ------ .../SparkLambdaContainerHandlerTest.java | 124 --------- .../LambdaEmbeddedServerTest.java | 23 -- .../spark/filter/CustomHeaderFilter.java | 37 --- .../spark/filter/UnauthenticatedFilter.java | 42 --- aws-serverless-spark-archetype/pom.xml | 81 ------ .../META-INF/maven/archetype-metadata.xml | 33 --- .../resources/archetype-resources/README.md | 99 ------- .../archetype-resources/build.gradle | 40 --- .../resources/archetype-resources/pom.xml | 186 ------------- .../archetype-resources/src/assembly/bin.xml | 32 --- .../src/main/java/SparkResources.java | 25 -- .../src/main/java/StreamLambdaHandler.java | 37 --- .../src/main/java/util/JsonTransformer.java | 24 -- .../test/java/StreamLambdaHandlerTest.java | 89 ------- .../archetype-resources/template.yml | 52 ---- .../projects/base/archetype.properties | 3 - .../src/test/resources/projects/base/goal.txt | 1 - samples/spark/pet-store/README.md | 36 --- samples/spark/pet-store/build.gradle | 31 --- samples/spark/pet-store/pom.xml | 164 ------------ samples/spark/pet-store/src/assembly/bin.xml | 32 --- .../sample/spark/JsonTransformer.java | 36 --- .../sample/spark/SparkResources.java | 66 ----- .../sample/spark/StreamLambdaHandler.java | 54 ---- .../spark/filter/CognitoIdentityFilter.java | 68 ----- .../serverless/sample/spark/model/Error.java | 29 -- .../serverless/sample/spark/model/Pet.java | 54 ---- .../sample/spark/model/PetData.java | 111 -------- samples/spark/pet-store/template.yml | 32 --- 38 files changed, 1 insertion(+), 2638 deletions(-) delete mode 100644 aws-serverless-java-container-spark/pom.xml delete mode 100644 aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java delete mode 100644 aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java delete mode 100644 aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java delete mode 100644 aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java delete mode 100644 aws-serverless-spark-archetype/pom.xml delete mode 100644 aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java delete mode 100644 aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml delete mode 100644 aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties delete mode 100644 aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt delete mode 100644 samples/spark/pet-store/README.md delete mode 100644 samples/spark/pet-store/build.gradle delete mode 100644 samples/spark/pet-store/pom.xml delete mode 100644 samples/spark/pet-store/src/assembly/bin.xml delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Error.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Pet.java delete mode 100644 samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java delete mode 100644 samples/spark/pet-store/template.yml diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2374a45b..b0acd32a 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -46,14 +46,6 @@ jobs: # - name: Build Jersey 2.29 # run: ./gha_build.sh jersey false false -Djersey.version=2.29.1 -# build_spark: -# name: Build and test Spark -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 -# - name: Build latest -# run: ./gha_build.sh spark true true - build_spring: name: Build and test Spring runs-on: ubuntu-latest diff --git a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java index e290e284..43bd7eac 100644 --- a/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java +++ b/aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java @@ -207,7 +207,7 @@ protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request public void initialize() { Timer.start("JERSEY_COLD_START_INIT"); - // manually add the spark filter to the chain. This should the last one and match all uris + // manually add the filter to the chain. This should the last one and match all uris FilterRegistration.Dynamic jerseyFilterReg = getServletContext().addFilter("JerseyFilter", jerseyFilter); jerseyFilterReg.addMappingForUrlPatterns( EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml deleted file mode 100644 index 8987d66a..00000000 --- a/aws-serverless-java-container-spark/pom.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - 4.0.0 - - aws-serverless-java-container-spark - AWS Serverless Java container support - Spark implementation - Allows Java applications written for Spark to run in AWS Lambda - https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT - - - com.amazonaws.serverless - aws-serverless-java-container - 2.0.0-SNAPSHOT - .. - - - - 2.9.4 - - - - - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.0.0-SNAPSHOT - - - - com.sparkjava - spark-core - ${spark.version} - - - org.junit.jupiter - junit-jupiter - test - - - - - - - org.jacoco - jacoco-maven-plugin - - ${basedir}/target/coverage-reports/jacoco-unit.exec - ${basedir}/target/coverage-reports/jacoco-unit.exec - - - - default-prepare-agent - - prepare-agent - - - - jacoco-site - package - - report - - - - jacoco-check - test - - check - - - true - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - ${jacoco.minCoverage} - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - com.github.spotbugs - spotbugs-maven-plugin - - - - analyze-compile - compile - - check - - - - - - org.owasp - dependency-check-maven - ${dependencyCheck.version} - - true - - ${project.basedir}/../owasp-suppression.xml - - 7 - false - - - - - check - - - - - - - - diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java deleted file mode 100644 index 9c1b4751..00000000 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandler.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.*; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.servlet.*; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; -import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; - -import com.amazonaws.services.lambda.runtime.Context; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.Service; -import spark.Spark; -import spark.embeddedserver.EmbeddedServers; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; -import jakarta.servlet.Servlet; -import jakarta.servlet.http.HttpServletRequest; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.EnumSet; -import java.util.concurrent.CountDownLatch; - - -/** - * Implementation of the LambdaContainerHandler object that supports the Spark framework: http://sparkjava.com/ - *

- * Because of the way this container is implemented, using reflection to change accessibility of methods in the Spark - * framework and inserting itself as the default embedded container, it is important that you initialize the Handler - * before declaring your spark routes. - *

- * This implementation uses the default AwsProxyHttpServletRequest and Response implementations. - *

- *

- * {@code
- *     // always initialize the handler first
- *     SparkLambdaContainerHandler handler =
- *             SparkLambdaContainerHandler.getAwsProxyHandler();
- *
- *     get("/hello", (req, res) -> {
- *         res.status(200);
- *         res.body("Hello World");
- *     });
- * }
- * 
- * - * @param The request object used by the RequestReader implementation passed to the constructor - * @param The response object produced by the ResponseWriter implementation in the constructor - */ -public class SparkLambdaContainerHandler - extends AwsLambdaServletContainerHandler { - - //------------------------------------------------------------- - // Constants - //------------------------------------------------------------- - - private static final String LAMBDA_EMBEDDED_SERVER_CODE = "AWS_LAMBDA"; - - //------------------------------------------------------------- - // Variables - Private - //------------------------------------------------------------- - - private LambdaEmbeddedServer embeddedServer; - private LambdaEmbeddedServerFactory lambdaServerFactory; - private Logger log = LoggerFactory.getLogger(SparkLambdaContainerHandler.class); - - //------------------------------------------------------------- - // Methods - Public - Static - //------------------------------------------------------------- - - - /** - * Returns a new instance of an SparkLambdaContainerHandler initialized to work with AwsProxyRequest - * and AwsProxyResponse objects. - * - * @return a new instance of SparkLambdaContainerHandler - * - * @throws ContainerInitializationException Throws this exception if we fail to initialize the Spark container. - * This could be caused by the introspection used to insert the library as the default embedded container - */ - public static SparkLambdaContainerHandler getAwsProxyHandler() - throws ContainerInitializationException { - SparkLambdaContainerHandler newHandler = new SparkLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - new LambdaEmbeddedServerFactory()); - - // For Spark we cannot call initialize here. It needs to be called manually after the routes are set - //newHandler.initialize(); - - return newHandler; - } - - /** - * Returns a new instance of an SparkLambdaContainerHandler initialized to work with HttpApiV2ProxyRequest - * and AwsProxyResponse objects. - * - * @return a new instance of SparkLambdaContainerHandler - * - * @throws ContainerInitializationException Throws this exception if we fail to initialize the Spark container. - * This could be caused by the introspection used to insert the library as the default embedded container - */ - public static SparkLambdaContainerHandler getHttpApiV2ProxyHandler() - throws ContainerInitializationException { - SparkLambdaContainerHandler newHandler = new SparkLambdaContainerHandler<>(HttpApiV2ProxyRequest.class, - AwsProxyResponse.class, - new AwsHttpApiV2HttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(true), - new AwsHttpApiV2SecurityContextWriter(), - new AwsProxyExceptionHandler(), - new LambdaEmbeddedServerFactory()); - - // For Spark we cannot call initialize here. It needs to be called manually after the routes are set - //newHandler.initialize(); - - return newHandler; - } - - //------------------------------------------------------------- - // Constructors - //------------------------------------------------------------- - - - public SparkLambdaContainerHandler(Class requestTypeClass, - Class responseTypeClass, - RequestReader requestReader, - ResponseWriter responseWriter, - SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler, - LambdaEmbeddedServerFactory embeddedServerFactory) - throws ContainerInitializationException { - super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start("SPARK_CONTAINER_HANDLER_CONSTRUCTOR"); - - EmbeddedServers.add(LAMBDA_EMBEDDED_SERVER_CODE, embeddedServerFactory); - this.lambdaServerFactory = embeddedServerFactory; - - // TODO: This is pretty bad but we are not given access to the embeddedServerIdentifier property of the - // Service object - try { - AccessController.doPrivileged((PrivilegedExceptionAction) () -> { - log.debug("Changing visibility of getInstance method and embeddedServerIdentifier properties"); - Method serviceInstanceMethod = Spark.class.getDeclaredMethod("getInstance"); - serviceInstanceMethod.setAccessible(true); - Service sparkService = (Service) serviceInstanceMethod.invoke(null); - Field serverIdentifierField = Service.class.getDeclaredField("embeddedServerIdentifier"); - serverIdentifierField.setAccessible(true); - serverIdentifierField.set(sparkService, LAMBDA_EMBEDDED_SERVER_CODE); - return null; - }); - } catch (PrivilegedActionException e) { - if (e.getException() instanceof NoSuchFieldException) { - log.error("Could not fine embeddedServerIdentifier field in Service class", e.getException()); - } else if (e.getException() instanceof NoSuchMethodException) { - log.error("Could not find getInstance method in Spark class", e.getException()); - } else if (e.getException() instanceof IllegalAccessException) { - log.error("Could not access getInstance method in Spark class", e.getException()); - } else if (e.getException() instanceof InvocationTargetException) { - log.error("Could not invoke getInstance method in Spark class", e.getException()); - } else { - log.error("Unknown exception while modifying Spark class", e.getException()); - } - Timer.stop("SPARK_CONTAINER_HANDLER_CONSTRUCTOR"); - throw new ContainerInitializationException("Could not initialize Spark server", e.getException()); - } - Timer.stop("SPARK_CONTAINER_HANDLER_CONSTRUCTOR"); - } - - //------------------------------------------------------------- - // Methods - Implementation - //------------------------------------------------------------- - - - @Override - protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { - return new AwsHttpServletResponse(request, latch); - } - - - @Override - protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext) - throws Exception { - Timer.start("SPARK_HANDLE_REQUEST"); - - if (embeddedServer == null) { - initialize(); - } - - if (AwsHttpServletRequest.class.isAssignableFrom(httpServletRequest.getClass())) { - ((AwsHttpServletRequest)httpServletRequest).setServletContext(getServletContext()); - } - - doFilter(httpServletRequest, httpServletResponse, null); - Timer.stop("SPARK_HANDLE_REQUEST"); - } - - - @Override - public void initialize() - throws ContainerInitializationException { - Timer.start("SPARK_COLD_START"); - log.debug("First request, getting new server instance"); - - // trying to call init in case the embedded server had not been initialized. - Spark.init(); - - // adding this call to make sure that the framework is fully initialized. This should address a race - // condition and solve GitHub issue #71. - Spark.awaitInitialization(); - - embeddedServer = lambdaServerFactory.getServerInstance(); - - // manually add the spark filter to the chain. This should the last one and match all uris - FilterRegistration.Dynamic sparkRegistration = getServletContext().addFilter("SparkFilter", embeddedServer.getSparkFilter()); - sparkRegistration.addMappingForUrlPatterns( - EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), - true, "/*"); - Timer.stop("SPARK_COLD_START"); - } - - public Servlet getServlet() { - return null; - } -} diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java deleted file mode 100644 index 8d79c613..00000000 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServer.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spark.embeddedserver; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.ExceptionMapper; -import spark.embeddedserver.EmbeddedServer; -import spark.embeddedserver.jetty.websocket.WebSocketHandlerWrapper; -import spark.http.matching.MatcherFilter; -import spark.route.Routes; -import spark.ssl.SslStores; -import spark.staticfiles.StaticFilesConfiguration; - -import jakarta.servlet.Filter; -import java.util.Map; -import java.util.Optional; - -public class LambdaEmbeddedServer - implements EmbeddedServer { - - //------------------------------------------------------------- - // Variables - Private - //------------------------------------------------------------- - - private Routes applicationRoutes; - private ExceptionMapper exceptionMapper; - private MatcherFilter sparkFilter; - private StaticFilesConfiguration staticFilesConfiguration; - private boolean hasMultipleHandler; - private Logger log = LoggerFactory.getLogger(LambdaEmbeddedServer.class); - - - //------------------------------------------------------------- - // Constructors - //------------------------------------------------------------- - - LambdaEmbeddedServer(Routes routes, StaticFilesConfiguration filesConfig, ExceptionMapper exceptionMapper, boolean multipleHandlers) { - Timer.start("SPARK_EMBEDDED_SERVER_CONSTRUCTOR"); - applicationRoutes = routes; - staticFilesConfiguration = filesConfig; - hasMultipleHandler = multipleHandlers; - this.exceptionMapper = exceptionMapper; - - // try to initialize the filter here. - sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, exceptionMapper, true, hasMultipleHandler); - Timer.stop("SPARK_EMBEDDED_SERVER_CONSTRUCTOR"); - } - - - //------------------------------------------------------------- - // Implementation - EmbeddedServer - //------------------------------------------------------------- - @Override - public int ignite(String host, int port, SslStores sslStores, int maxThreads, int minThreads, int threadIdleTimeoutMillis) - throws ContainerInitializationException { - Timer.start("SPARK_EMBEDDED_IGNITE"); - log.info("Starting Spark server, ignoring port and host"); - // if not initialized yet - if (sparkFilter == null) { - sparkFilter = new MatcherFilter(applicationRoutes, staticFilesConfiguration, exceptionMapper, true, hasMultipleHandler); - } - sparkFilter.init(null); - Timer.stop("SPARK_EMBEDDED_IGNITE"); - return port; - } - - - public void configureWebSockets(Map webSocketHandlers, - Optional webSocketIdleTimeoutMillis) { - // Swallowing this exception to prevent Spark from getting stuck - // throw new UnsupportedOperationException(); - log.info("Spark called configureWebSockets. However, web sockets are not supported"); - } - - - @Override - public void join() { - log.info("Called join method, nothing to do here since Lambda only runs a single event per container"); - } - - - @Override - public void extinguish() { - log.info("Called extinguish method, nothing to do here."); - } - - - @Override - public int activeThreadCount() { - log.debug("Called activeThreadCount, since Lambda only runs one event per container we always return 1"); - return 1; - } - - //------------------------------------------------------------- - // Methods - Public - //------------------------------------------------------------- - - /** - * Returns the initialized instance of the main Spark filter. - * @return The spark filter instance. - */ - public Filter getSparkFilter() { - return sparkFilter; - } -} diff --git a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java b/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java deleted file mode 100644 index 9074e5dd..00000000 --- a/aws-serverless-java-container-spark/src/main/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerFactory.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spark.embeddedserver; - -import com.amazonaws.serverless.proxy.internal.testutils.Timer; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import spark.ExceptionMapper; -import spark.embeddedserver.EmbeddedServer; -import spark.embeddedserver.EmbeddedServerFactory; -import spark.route.Routes; -import spark.staticfiles.StaticFilesConfiguration; - -public class LambdaEmbeddedServerFactory implements EmbeddedServerFactory { - - //------------------------------------------------------------- - // Variables - Private - Static - //------------------------------------------------------------- - - private static volatile LambdaEmbeddedServer embeddedServer; - - - /** - * Empty constructor, applications should always use this constructor. - */ - public LambdaEmbeddedServerFactory() {} - - - /** - * Constructor used in unit tests to inject a mocked embedded server - * @param server The mocked server - */ - @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") // suppressing the warning as this constructor is only used for unit tests - public LambdaEmbeddedServerFactory(LambdaEmbeddedServer server) { - LambdaEmbeddedServerFactory.embeddedServer = server; - } - - - //------------------------------------------------------------- - // Implementation - EmbeddedServerFactory - //------------------------------------------------------------- - - - @Override - public EmbeddedServer create(Routes routes, StaticFilesConfiguration staticFilesConfiguration, ExceptionMapper exceptionMapper, boolean multipleHandlers) { - Timer.start("SPARK_SERVER_FACTORY_CREATE"); - if (embeddedServer == null) { - LambdaEmbeddedServerFactory.embeddedServer = new LambdaEmbeddedServer(routes, staticFilesConfiguration, exceptionMapper, multipleHandlers); - } - Timer.stop("SPARK_SERVER_FACTORY_CREATE"); - return embeddedServer; - } - - - //------------------------------------------------------------- - // Methods - Getter/Setter - //------------------------------------------------------------- - - public LambdaEmbeddedServer getServerInstance() { - return embeddedServer; - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java deleted file mode 100644 index 33bc19f1..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkStreamTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.amazonaws.serverless.proxy.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; - -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.services.lambda.runtime.Context; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import spark.Spark; - -import jakarta.servlet.http.Cookie; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.*; -import static spark.Spark.get; - -// This class doesn't actually test Spark. Instead it tests the proxyStream method of the -// LambdaContainerHandler object. We use the Spark implementation for this because it's the -// fastest to start -public class HelloWorldSparkStreamTest { - private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; - private static final String CUSTOM_HEADER_VALUE = "My Header Value"; - private static final String BODY_TEXT_RESPONSE = "Hello World"; - - private static final String COOKIE_NAME = "MyCookie"; - private static final String COOKIE_VALUE = "CookieValue"; - private static final String COOKIE_DOMAIN = "mydomain.com"; - private static final String COOKIE_PATH = "/"; - - private static SparkLambdaContainerHandler handler; - private static SparkLambdaContainerHandler httpApiHandler; - - private String type; - - public void initHelloWorldSparkStreamTest(String reqType) { - type = reqType; - try { - switch (type) { - case "API_GW": - case "ALB": - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - break; - case "HTTP_API": - httpApiHandler = SparkLambdaContainerHandler.getHttpApiV2ProxyHandler(); - break; - default: - throw new RuntimeException("Unknown request type: " + type); - } - - configureRoutes(); - Spark.awaitInitialization(); - } catch (RuntimeException | ContainerInitializationException e) { - e.printStackTrace(); - fail(); - } - } - - public static Collection data() { - return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); - } - - private AwsProxyRequestBuilder getRequestBuilder() { - return new AwsProxyRequestBuilder(); - } - - private ByteArrayOutputStream executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) throws IOException { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - switch (type) { - case "API_GW": - handler.proxyStream(requestBuilder.buildStream(), os, lambdaContext); - break; - case "ALB": - handler.proxyStream(requestBuilder.alb().buildStream(), os, lambdaContext); - break; - case "HTTP_API": - httpApiHandler.proxyStream(requestBuilder.toHttpApiV2RequestStream(), os, lambdaContext); - break; - default: - throw new RuntimeException("Unknown request type: " + type); - } - return os; - } - - @AfterAll - public static void stopSpark() { - Spark.stop(); - } - - @MethodSource("data") - @ParameterizedTest - void helloRequest_basicStream_populatesOutputSuccessfully(String reqType) { - initHelloWorldSparkStreamTest(reqType); - try { - ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path("/hello"), new MockLambdaContext()); - AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); - - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); - assertEquals(BODY_TEXT_RESPONSE, response.getBody()); - } catch (IOException e) { - e.printStackTrace(); - fail(); - } - } - - @MethodSource("data") - @ParameterizedTest - void nullPathRequest_doesntFail_expectA404(String reqType) { - initHelloWorldSparkStreamTest(reqType); - try { - ByteArrayOutputStream outputStream = executeRequest(getRequestBuilder().method("GET").path(null), new MockLambdaContext()); - AwsProxyResponse response = LambdaContainerHandler.getObjectMapper().readValue(outputStream.toByteArray(), AwsProxyResponse.class); - - assertEquals(404, response.getStatusCode()); - } catch (IOException e) { - e.printStackTrace(); - fail(); - } - } - - private static void configureRoutes() { - get("/hello", (req, res) -> { - res.status(200); - res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - return BODY_TEXT_RESPONSE; - }); - - get("/cookie", (req, res) -> { - Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); - testCookie.setDomain(COOKIE_DOMAIN); - testCookie.setPath(COOKIE_PATH); - res.raw().addCookie(testCookie); - return BODY_TEXT_RESPONSE; - }); - - get("/multi-cookie", (req, res) -> { - Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); - testCookie.setDomain(COOKIE_DOMAIN); - testCookie.setPath(COOKIE_PATH); - Cookie testCookie2 = new Cookie(COOKIE_NAME + "2", COOKIE_VALUE + "2"); - testCookie2.setDomain(COOKIE_DOMAIN); - testCookie2.setPath(COOKIE_PATH); - res.raw().addCookie(testCookie); - res.raw().addCookie(testCookie2); - return BODY_TEXT_RESPONSE; - }); - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java deleted file mode 100644 index b687784e..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/HelloWorldSparkTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.amazonaws.serverless.proxy.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import spark.Spark; - -import jakarta.servlet.http.Cookie; -import jakarta.ws.rs.core.HttpHeaders; - -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.*; -import static spark.Spark.get; - - -public class HelloWorldSparkTest { - private static final String CUSTOM_HEADER_KEY = "X-Custom-Header"; - private static final String CUSTOM_HEADER_VALUE = "My Header Value"; - private static final String BODY_TEXT_RESPONSE = "Hello World"; - - private static final String COOKIE_NAME = "MyCookie"; - private static final String COOKIE_VALUE = "CookieValue"; - private static final String COOKIE_DOMAIN = "mydomain.com"; - private static final String COOKIE_PATH = "/"; - - private static final String READ_COOKIE_NAME = "customCookie"; - - private static SparkLambdaContainerHandler handler; - - private boolean isAlb; - - public void initHelloWorldSparkTest(boolean alb) { - isAlb = alb; - } - - public static Collection data() { - return Arrays.asList(new Object[]{false, true}); - } - - private AwsProxyRequestBuilder getRequestBuilder() { - AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(); - if (isAlb) builder.alb(); - - return builder; - } - - @BeforeAll - public static void initializeServer() { - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - - configureRoutes(); - Spark.awaitInitialization(); - } catch (RuntimeException | ContainerInitializationException e) { - e.printStackTrace(); - fail(); - } - } - - @AfterAll - public static void stopSpark() { - Spark.stop(); - } - - @MethodSource("data") - @ParameterizedTest - void basicServer_handleRequest_emptyFilters(boolean alb) { - initHelloWorldSparkTest(alb); - AwsProxyRequest req = getRequestBuilder().method("GET").path("/hello").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); - assertEquals(BODY_TEXT_RESPONSE, response.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void addCookie_setCookieOnResponse_validCustomCookie(boolean alb) { - initHelloWorldSparkTest(alb); - AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); - } - - @MethodSource("data") - @ParameterizedTest - void multiCookie_setCookieOnResponse_singleHeaderWithMultipleValues(boolean alb) { - initHelloWorldSparkTest(alb); - AwsProxyRequest req = getRequestBuilder().method("GET").path("/multi-cookie").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.SET_COOKIE)); - - assertEquals(2, response.getMultiValueHeaders().get(HttpHeaders.SET_COOKIE).size()); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_NAME + "=" + COOKIE_VALUE)); - assertTrue(response.getMultiValueHeaders().get(HttpHeaders.SET_COOKIE).get(1).contains(COOKIE_NAME + "2=" + COOKIE_VALUE + "2")); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_DOMAIN)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.SET_COOKIE).contains(COOKIE_PATH)); - } - - @MethodSource("data") - @ParameterizedTest - void rootResource_basicRequest_expectSuccess(boolean alb) { - initHelloWorldSparkTest(alb); - AwsProxyRequest req = getRequestBuilder().method("GET").path("/").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(CUSTOM_HEADER_KEY)); - assertEquals(CUSTOM_HEADER_VALUE, response.getMultiValueHeaders().getFirst(CUSTOM_HEADER_KEY)); - assertEquals(BODY_TEXT_RESPONSE, response.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void readCookie_customDomainName_expectValidCookie(boolean alb) { - initHelloWorldSparkTest(alb); - AwsProxyRequest req = getRequestBuilder().method("GET").path("/cookie-read").cookie(READ_COOKIE_NAME, "test").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - assertEquals("test", response.getBody()); - } - - private static void configureRoutes() { - get("/", (req, res) -> { - res.status(200); - res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - return BODY_TEXT_RESPONSE; - }); - - get("/hello", (req, res) -> { - res.status(200); - res.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - return BODY_TEXT_RESPONSE; - }); - - get("/cookie", (req, res) -> { - Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); - testCookie.setDomain(COOKIE_DOMAIN); - testCookie.setPath(COOKIE_PATH); - res.raw().addCookie(testCookie); - return BODY_TEXT_RESPONSE; - }); - - get("/multi-cookie", (req, res) -> { - Cookie testCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); - testCookie.setDomain(COOKIE_DOMAIN); - testCookie.setPath(COOKIE_PATH); - Cookie testCookie2 = new Cookie(COOKIE_NAME + "2", COOKIE_VALUE + "2"); - testCookie2.setDomain(COOKIE_DOMAIN); - testCookie2.setPath(COOKIE_PATH); - res.raw().addCookie(testCookie); - res.raw().addCookie(testCookie2); - return BODY_TEXT_RESPONSE; - }); - - get("/cookie-read", (req, res) -> req.cookie(READ_COOKIE_NAME)); - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java deleted file mode 100644 index 92c84a49..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/InitExceptionHandlerTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.amazonaws.serverless.proxy.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServer; -import com.amazonaws.serverless.proxy.spark.embeddedserver.LambdaEmbeddedServerFactory; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; -import spark.Spark; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.when; -import static spark.Spark.get; -import static spark.Spark.initExceptionHandler; - - -public class InitExceptionHandlerTest { - - private static final String TEST_EXCEPTION_MESSAGE = "test exception"; - private static LambdaEmbeddedServer embeddedServer = mock(LambdaEmbeddedServer.class); - - @Test - void initException_mockException_expectHandlerToRun() { - try { - - when(embeddedServer.ignite(anyString(), anyInt(), any(), anyInt(), anyInt(), anyInt())) - .thenThrow(new ContainerInitializationException(TEST_EXCEPTION_MESSAGE, null)); - LambdaEmbeddedServerFactory serverFactory = new LambdaEmbeddedServerFactory(embeddedServer); - new SparkLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - serverFactory); - - configureRoutes(); - Spark.awaitInitialization(); - } catch (Exception e) { - e.printStackTrace(); - fail("Error while mocking server"); - } - - } - - @AfterAll - public static void stopSpark() { - // un-mock the embedded server to avoid blocking other tests - reset(embeddedServer); - // reset the static variable in the factory so that it will be instantiated again next time - new LambdaEmbeddedServerFactory(null); - Spark.stop(); - } - - private static void configureRoutes() { - initExceptionHandler((e) -> { - assertEquals(TEST_EXCEPTION_MESSAGE, e.getLocalizedMessage()); - }); - - get("/test-route", (req, res) -> { - res.status(200); - return "test"; - }); - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java deleted file mode 100644 index a5c5e824..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/SparkLambdaContainerHandlerTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.amazonaws.serverless.proxy.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.spark.filter.CustomHeaderFilter; -import com.amazonaws.serverless.proxy.spark.filter.UnauthenticatedFilter; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Test; -import spark.Spark; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; - -import java.util.EnumSet; - -import static org.junit.jupiter.api.Assertions.*; -import static spark.Spark.get; - - -public class SparkLambdaContainerHandlerTest { - private static final String RESPONSE_BODY_TEXT = "hello"; - - @Test - void filters_onStartupMethod_executeFilters() { - - SparkLambdaContainerHandler handler = null; - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - fail(); - } - - handler.onStartup(c -> { - if (c == null) { - fail(); - } - FilterRegistration.Dynamic registration = c.addFilter("CustomHeaderFilter", CustomHeaderFilter.class); - // update the registration to map to a path - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - // servlet name mappings are disabled and will throw an exception - }); - - configureRoutes(); - - Spark.awaitInitialization(); - - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/header-filter").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertNotNull(response); - assertEquals(200, response.getStatusCode()); - assertTrue(response.getMultiValueHeaders().containsKey(CustomHeaderFilter.HEADER_NAME)); - assertEquals(CustomHeaderFilter.HEADER_VALUE, response.getMultiValueHeaders().getFirst(CustomHeaderFilter.HEADER_NAME)); - assertEquals(RESPONSE_BODY_TEXT, response.getBody()); - - } - - @Test - void filters_unauthenticatedFilter_stopRequestProcessing() { - - SparkLambdaContainerHandler handler = null; - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - fail(); - } - - handler.onStartup(c -> { - if (c == null) { - fail(); - } - FilterRegistration.Dynamic registration = c.addFilter("UnauthenticatedFilter", UnauthenticatedFilter.class); - // update the registration to map to a path - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/unauth"); - // servlet name mappings are disabled and will throw an exception - }); - - configureRoutes(); - Spark.awaitInitialization(); - - // first we test without the custom header, we expect request processing to complete - // successfully - AwsProxyRequest req = new AwsProxyRequestBuilder().method("GET").path("/unauth").build(); - AwsProxyResponse response = handler.proxy(req, new MockLambdaContext()); - - assertNotNull(response); - assertEquals(200, response.getStatusCode()); - assertEquals(RESPONSE_BODY_TEXT, response.getBody()); - - // now we test with the custom header, this should stop request processing in the - // filter and return an unauthenticated response - AwsProxyRequest unauthReq = new AwsProxyRequestBuilder().method("GET").path("/unauth") - .header(UnauthenticatedFilter.HEADER_NAME, "1").build(); - AwsProxyResponse unauthResp = handler.proxy(unauthReq, new MockLambdaContext()); - - assertNotNull(unauthResp); - assertEquals(UnauthenticatedFilter.RESPONSE_STATUS, unauthResp.getStatusCode()); - assertEquals("", unauthResp.getBody()); - } - - @AfterAll - public static void stopSpark() { - Spark.stop(); - } - - private static void configureRoutes() { - get("/header-filter", (req, res) -> { - res.status(200); - return RESPONSE_BODY_TEXT; - }); - - get("/unauth", (req, res) -> { - res.status(200); - return RESPONSE_BODY_TEXT; - }); - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java deleted file mode 100644 index 8cb34eae..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/embeddedserver/LambdaEmbeddedServerTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.amazonaws.serverless.proxy.spark.embeddedserver; - - -import org.junit.jupiter.api.Test; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.fail; - - -public class LambdaEmbeddedServerTest { - private static LambdaEmbeddedServer server = new LambdaEmbeddedServer(null, null, null, false); - - @Test - void webSocket_configureWebSocket_noException() { - try { - server.configureWebSockets(null, Optional.of(0L)); - } catch (Exception e) { - e.printStackTrace(); - fail(); - } - } -} diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java deleted file mode 100644 index 8f4bc99a..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/CustomHeaderFilter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.amazonaws.serverless.proxy.spark.filter; - - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; - - -public class CustomHeaderFilter implements Filter { - public static final String HEADER_NAME = "X-Filter-Header"; - public static final String HEADER_VALUE = "CustomHeaderFilter"; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletResponse resp = (HttpServletResponse)servletResponse; - resp.addHeader(HEADER_NAME, HEADER_VALUE); - - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - - } -} \ No newline at end of file diff --git a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java b/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java deleted file mode 100644 index efa41a2d..00000000 --- a/aws-serverless-java-container-spark/src/test/java/com/amazonaws/serverless/proxy/spark/filter/UnauthenticatedFilter.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.amazonaws.serverless.proxy.spark.filter; - - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; - - -public class UnauthenticatedFilter implements Filter { - public static final String HEADER_NAME = "X-Unauthenticated-Response"; - public static final int RESPONSE_STATUS = 401; - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - if (((HttpServletRequest)servletRequest).getHeader(HEADER_NAME) != null) { - ((HttpServletResponse) servletResponse).setStatus(401); - return; - } - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - - } -} diff --git a/aws-serverless-spark-archetype/pom.xml b/aws-serverless-spark-archetype/pom.xml deleted file mode 100644 index d0ce113f..00000000 --- a/aws-serverless-spark-archetype/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - 4.0.0 - - - com.amazonaws.serverless - aws-serverless-java-container - 2.0.0-SNAPSHOT - - - com.amazonaws.serverless.archetypes - aws-serverless-spark-archetype - 2.0.0-SNAPSHOT - maven-archetype - - - https://github.com/aws/serverless-java-container.git - HEAD - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - - src/main/resources - true - - archetype-resources/pom.xml - archetype-resources/README.md - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.0.1 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.1.0 - - \ - - - - - org.apache.maven.plugins - maven-archetype-plugin - 3.0.1 - - - - integration-test - - - - - - - - diff --git a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index 2ea9dca1..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - src/main/java - - **/*.java - - - - src/test/java - - **/*.java - - - - src/assembly - - * - - - - - - template.yml - README.md - build.gradle - - - - \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md deleted file mode 100644 index 311c40ae..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/README.md +++ /dev/null @@ -1,99 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). - -The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. - -The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). - -#[[##]]# Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -#[[##]]# Building the project -You can use the SAM CLI to quickly build the project -```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false -$ cd \${artifactId} -$ sam build -Building resource '\${resourceName}Function' -Running JavaGradleWorkflow:GradleBuild -Running JavaGradleWorkflow:CopyArtifacts - -Build Succeeded - -Built Artifacts : .aws-sam/build -Built Template : .aws-sam/build/template.yaml - -Commands you can use next -========================= -[*] Invoke Function: sam local invoke -[*] Deploy: sam deploy --guided -``` - -#[[##]]# Testing locally with the SAM CLI - -From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. - -```bash -$ sam local start-api - -... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] -... -``` - -Using a new shell, you can send a test ping request to your API: - -```bash -$ curl -s http://127.0.0.1:3000/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` - -#[[##]]# Deploying to AWS -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... -------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------- -\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets -------------------------------------------------------------------------------------------------------------- -``` - -Copy the `OutputValue` into a browser or use curl to test your first request: - -```bash -$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle deleted file mode 100644 index 781e3123..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/build.gradle +++ /dev/null @@ -1,40 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - implementation ( - 'com.sparkjava:spark-core:2.9.4', - 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', - ) - - testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.10.1")) - testImplementation("org.junit.jupiter:junit-jupiter") -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'jetty-http*' - exclude 'jetty-client*' - exclude 'jetty-webapp*' - exclude 'jetty-xml*' - exclude 'jetty-io*' - exclude 'websocket*' - } - } -} - -test { - useJUnitPlatform() -} - -build.dependsOn buildZip diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index 1151dd29..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,186 +0,0 @@ -#set($dollar = '$') - - - 4.0.0 - - \${groupId} - \${artifactId} - \${version} - jar - - Serverless Spark API - https://github.com/aws/serverless-java-container - - - 1.8 - 1.8 - 2.16.1 - 2.9.4 - 5.10.1 - - - - - com.amazonaws.serverless - aws-serverless-java-container-spark - ${project.version} - - - com.amazonaws.serverless - aws-serverless-java-container-core - ${project.version} - tests - test-jar - test - - - org.apache.httpcomponents.client5 - httpclient5 - 5.2.1 - test - - - - com.sparkjava - spark-core - \${spark.version} - - - - com.fasterxml.jackson.core - jackson-databind - \${jackson.version} - - - - org.junit.jupiter - junit-jupiter - test - - - - - - - org.junit - junit-bom - ${junit.version} - import - pom - - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - false - - - - package - - shade - - - - - - org.eclipse.jetty.websocket:* - org.eclipse.jetty:jetty-http - org.eclipse.jetty:jetty-client - org.eclipse.jetty:jetty-webapp - org.eclipse.jetty:jetty-xml - org.eclipse.jetty:jetty-io - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.1 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.6.1 - - - copy-dependencies - package - - copy-dependencies - - - ${dollar}{project.build.directory}${dollar}{file.separator}lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.3.0 - - - zip-assembly - package - - single - - - ${dollar}{project.artifactId}-${dollar}{project.version} - - src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml - - false - - - - - - - - - diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml deleted file mode 100644 index fcb93503..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml +++ /dev/null @@ -1,32 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - - websocket* - jetty-http* - jetty-client* - jetty-webapp* - jetty-xml* - jetty-io* - - lib - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java deleted file mode 100644 index bc55eb43..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/SparkResources.java +++ /dev/null @@ -1,25 +0,0 @@ -package ${groupId}; - - -import java.util.HashMap; -import java.util.Map; - -import static spark.Spark.before; -import static spark.Spark.get; - -import ${groupId}.util.JsonTransformer; - - -public class SparkResources { - - public static void defineResources() { - before((request, response) -> response.type("application/json")); - - get("/ping", (req, res) -> { - Map pong = new HashMap<>(); - pong.put("pong", "Hello, World!"); - res.status(200); - return pong; - }, new JsonTransformer()); - } -} \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java deleted file mode 100644 index fdd1409a..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import spark.Spark; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SparkLambdaContainerHandler handler; - static { - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - SparkResources.defineResources(); - Spark.awaitInitialization(); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spark container", e); - } - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java deleted file mode 100644 index 8df085ea..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/main/java/util/JsonTransformer.java +++ /dev/null @@ -1,24 +0,0 @@ -package ${groupId}.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.ResponseTransformer; - -public class JsonTransformer implements ResponseTransformer { - - private ObjectMapper mapper = new ObjectMapper(); - private Logger log = LoggerFactory.getLogger(JsonTransformer.class); - - @Override - public String render(Object model) { - try { - return mapper.writeValueAsString(model); - } catch (JsonProcessingException e) { - log.error("Cannot serialize object", e); - return null; - } - } - -} \ No newline at end of file diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java deleted file mode 100644 index 26d5360b..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import jakarta.ws.rs.HttpMethod; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.*; - -public class StreamLambdaHandlerTest { - - private static StreamLambdaHandler handler; - private static Context lambdaContext; - - @BeforeAll - public static void setUp() { - handler = new StreamLambdaHandler(); - lambdaContext = new MockLambdaContext(); - } - - @Test - public void ping_streamRequest_respondsWithHello() { - InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); - - assertFalse(response.isBase64Encoded()); - - assertTrue(response.getBody().contains("pong")); - assertTrue(response.getBody().contains("Hello, World!")); - - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); - } - - @Test - public void invalidResource_streamRequest_responds404() { - InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); - } - - private void handle(InputStream is, ByteArrayOutputStream os) { - try { - handler.handleRequest(is, os, lambdaContext); - } catch (IOException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { - try { - return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { - e.printStackTrace(); - fail("Error while parsing response: " + e.getMessage()); - } - return null; - } -} diff --git a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml deleted file mode 100644 index d45c9923..00000000 --- a/aws-serverless-spark-archetype/src/main/resources/archetype-resources/template.yml +++ /dev/null @@ -1,52 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -#macro(regionVar) - AWS::Region -#end -#set($awsRegion = "#regionVar()") -#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Spark API - ${groupId}::${artifactId} -Globals: - Api: - EndpointConfiguration: REGIONAL - -Resources: - ${resourceName}Function: - Type: AWS::Serverless::Function - Properties: - Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java11 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 15 - Events: - ProxyResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - ${resourceName}Api: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' - Export: - Name: ${resourceName}Api diff --git a/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties deleted file mode 100644 index 33825ed0..00000000 --- a/aws-serverless-spark-archetype/src/test/resources/projects/base/archetype.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=test.service -artifactId=spark-archetype-test -version=1.0-SNAPSHOT diff --git a/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt deleted file mode 100644 index 597acc76..00000000 --- a/aws-serverless-spark-archetype/src/test/resources/projects/base/goal.txt +++ /dev/null @@ -1 +0,0 @@ -package \ No newline at end of file diff --git a/samples/spark/pet-store/README.md b/samples/spark/pet-store/README.md deleted file mode 100644 index 2bfec99d..00000000 --- a/samples/spark/pet-store/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Serverless Spark example -A basic pet store written with the [Spark framework](http://sparkjava.com/). The `StreamLambdaHandler` object is the main entry point for Lambda. - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ sam build -``` - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets ---------------------------------------------------------------------------------------------------------- - -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets -``` \ No newline at end of file diff --git a/samples/spark/pet-store/build.gradle b/samples/spark/pet-store/build.gradle deleted file mode 100644 index 9e37febd..00000000 --- a/samples/spark/pet-store/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - implementation ( - 'com.sparkjava:spark-core:2.9.4', - 'com.amazonaws.serverless:aws-serverless-java-container-spark:[1.0,)', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', - ) -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'jetty-http*' - exclude 'jetty-client*' - exclude 'jetty-webapp*' - exclude 'jetty-xml*' - exclude 'jetty-io*' - exclude 'websocket*' - } - } -} - -build.dependsOn buildZip diff --git a/samples/spark/pet-store/pom.xml b/samples/spark/pet-store/pom.xml deleted file mode 100644 index f1dee637..00000000 --- a/samples/spark/pet-store/pom.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - serverless-spark-example - 1.0-SNAPSHOT - Spark example for the aws-serverless-java-container library - Simple pet store written with the Spark framework - https://aws.amazon.com/lambda/ - - - https://github.com/aws/serverless-java-container.git - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - 1.8 - 1.8 - 2.16.1 - 2.9.1 - - - - - com.amazonaws.serverless - aws-serverless-java-container-spark - [1.6,) - - - - com.sparkjava - spark-core - ${spark.version} - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - false - - - - package - - shade - - - - - - org.eclipse.jetty.websocket:* - org.eclipse.jetty:jetty-http - org.eclipse.jetty:jetty-client - org.eclipse.jetty:jetty-webapp - org.eclipse.jetty:jetty-xml - org.eclipse.jetty:jetty-io - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.2.0 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.1 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.6.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.6.0 - - - zip-assembly - package - - single - - - ${project.artifactId}-${project.version} - - src${file.separator}assembly${file.separator}bin.xml - - false - - - - - - - - - - diff --git a/samples/spark/pet-store/src/assembly/bin.xml b/samples/spark/pet-store/src/assembly/bin.xml deleted file mode 100644 index fcb93503..00000000 --- a/samples/spark/pet-store/src/assembly/bin.xml +++ /dev/null @@ -1,32 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - - websocket* - jetty-http* - jetty-client* - jetty-webapp* - jetty-xml* - jetty-io* - - lib - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java deleted file mode 100644 index bc1692af..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/JsonTransformer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spark; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.ResponseTransformer; - -public class JsonTransformer implements ResponseTransformer { - - private ObjectMapper mapper = new ObjectMapper(); - private Logger log = LoggerFactory.getLogger(JsonTransformer.class); - - @Override - public String render(Object model) { - try { - return mapper.writeValueAsString(model); - } catch (JsonProcessingException e) { - log.error("Cannot serialize object", e); - return null; - } - } - -} \ No newline at end of file diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java deleted file mode 100644 index 4794b7ae..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/SparkResources.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.amazonaws.serverless.sample.spark; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.sample.spark.model.Pet; -import com.amazonaws.serverless.sample.spark.model.PetData; - -import jakarta.ws.rs.core.Response; - -import java.util.UUID; - -import static spark.Spark.before; -import static spark.Spark.get; -import static spark.Spark.post; - - -public class SparkResources { - - public static void defineResources() { - before((request, response) -> response.type("application/json")); - - post("/pets", (req, res) -> { - Pet newPet = LambdaContainerHandler.getObjectMapper().readValue(req.body(), Pet.class); - if (newPet.getName() == null || newPet.getBreed() == null) { - return Response.status(400).entity(new Error("Invalid name or breed")).build(); - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - - res.status(200); - return dbPet; - }, new JsonTransformer()); - - get("/pets", (req, res) -> { - int limit = 10; - if (req.queryParams("limit") != null) { - limit = Integer.parseInt(req.queryParams("limit")); - } - - Pet[] outputPets = new Pet[limit]; - - for (int i = 0; i < limit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - res.status(200); - return outputPets; - }, new JsonTransformer()); - - get("/pets/:petId", (req, res) -> { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - res.status(200); - return newPet; - }, new JsonTransformer()); - } -} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java deleted file mode 100644 index e0249910..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/StreamLambdaHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.amazonaws.serverless.sample.spark; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spark.SparkLambdaContainerHandler; -import com.amazonaws.serverless.sample.spark.filter.CognitoIdentityFilter; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import spark.Spark; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.EnumSet; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SparkLambdaContainerHandler handler; - static { - try { - handler = SparkLambdaContainerHandler.getAwsProxyHandler(); - SparkResources.defineResources(); - Spark.awaitInitialization(); - - // we use the onStartup method of the handler to register our custom filter - handler.onStartup(servletContext -> { - FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); - }); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spark container", e); - } - } - - public StreamLambdaHandler() { - // we enable the timer for debugging. This SHOULD NOT be enabled in production. - Timer.enable(); - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java deleted file mode 100644 index e45370b0..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.amazonaws.serverless.sample.spark.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.spring.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Error.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Error.java deleted file mode 100644 index 3577e6a3..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Error.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spark.model; - -public class Error { - private String message; - - public Error(String errorMessage) { - message = errorMessage; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Pet.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Pet.java deleted file mode 100644 index a6f56959..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/Pet.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spark.model; - -import java.util.Date; - -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java b/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java deleted file mode 100644 index ba9c47db..00000000 --- a/samples/spark/pet-store/src/main/java/com/amazonaws/serverless/sample/spark/model/PetData.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.spark.model; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/spark/pet-store/template.yml b/samples/spark/pet-store/template.yml deleted file mode 100644 index 535e684f..00000000 --- a/samples/spark/pet-store/template.yml +++ /dev/null @@ -1,32 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with spark with the aws-serverless-java-container library - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.sample.spark.StreamLambdaHandler::handleRequest - Runtime: java11 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 20 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - SparkPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: SparkPetStoreApi From 0982dc15aa9d0bd212511ffd08c7d9745e33ca1c Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 21 Jan 2024 18:14:26 +0900 Subject: [PATCH 0817/1214] Deleted 2 disabled tests dispatch_sendsToCorrectServlet dispatchNewPath_sendsToCorrectServlet --- .../internal/servlet/AwsAsyncContextTest.java | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java index 9bbbc13a..a8383b5c 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContextTest.java @@ -46,49 +46,6 @@ void dispatch_amendsPath() throws InvalidRequestEventException { assertEquals("/srv1/hello", req.getRequestURI()); } - @Disabled("AwsAsyncContext does not sends to servlet anymore") - @Test - void dispatch_sendsToCorrectServlet() { - AwsProxyHttpServletRequest req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), lambdaCtx, null); - req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); - req.setServletContext(ctx); - req.setContainerHandler(handler); - - AsyncContext asyncCtx = req.startAsync(); - handler.setDesiredStatus(201); - asyncCtx.dispatch(); - assertNotNull(handler.getSelectedServlet()); - assertEquals(srv1, handler.getSelectedServlet()); - assertEquals(201, handler.getResponse().getStatus()); - - req = new AwsProxyHttpServletRequest(new AwsProxyRequestBuilder("/srv5/hello", "GET").build(), lambdaCtx, null); - req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); - req.setServletContext(ctx); - req.setContainerHandler(handler); - asyncCtx = req.startAsync(); - handler.setDesiredStatus(202); - asyncCtx.dispatch(); - assertNotNull(handler.getSelectedServlet()); - assertEquals(srv2, handler.getSelectedServlet()); - assertEquals(202, handler.getResponse().getStatus()); - } - - @Disabled("AwsAsyncContext does not sends to servlet anymore") - @Test - void dispatchNewPath_sendsToCorrectServlet() throws InvalidRequestEventException { - AwsProxyHttpServletRequest req = (AwsProxyHttpServletRequest)reader.readRequest(new AwsProxyRequestBuilder("/srv1/hello", "GET").build(), null, lambdaCtx, LambdaContainerHandler.getContainerConfig()); - req.setResponse(handler.getContainerResponse(req, new CountDownLatch(1))); - req.setServletContext(ctx); - req.setContainerHandler(handler); - - AsyncContext asyncCtx = req.startAsync(); - handler.setDesiredStatus(301); - asyncCtx.dispatch("/srv4/hello"); - assertNotNull(handler.getSelectedServlet()); - assertEquals(srv2, handler.getSelectedServlet()); - assertNotNull(handler.getResponse()); - assertEquals(301, handler.getResponse().getStatus()); - } private AwsServletContext getCtx() { AwsServletContext ctx = new AwsServletContext(handler); From 3bbeed7822b2680621b6a6561ca712d62dec6512 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sun, 21 Jan 2024 11:02:04 +0100 Subject: [PATCH 0818/1214] chore(deps): update Struts to 7.0.0-M1 for testing --- aws-serverless-java-container-struts/pom.xml | 47 ++++++++++++------- .../archetype-resources/build.gradle | 10 ++-- .../resources/archetype-resources/pom.xml | 20 +++++--- samples/struts/pet-store/build.gradle | 14 +++--- samples/struts/pet-store/pom.xml | 23 +++++---- 5 files changed, 72 insertions(+), 42 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 76770509..0cd2a4aa 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 6.3.0.2 + 7.0.0-M1 @@ -25,12 +25,24 @@ aws-serverless-java-container-core 2.0.0-SNAPSHOT + + com.amazonaws.serverless + aws-serverless-java-container-core + 2.0.0-SNAPSHOT + tests + test-jar + test + org.apache.struts struts2-core ${struts.version} + + org.apache.commons + commons-fileupload2-jakarta + commons-io commons-io @@ -71,38 +83,33 @@ - javax.el - javax.el-api - 3.0.0 + jakarta.el + jakarta.el-api + 5.0.1 test - javax.servlet - jsp-api - 2.0 + jakarta.servlet.jsp + jakarta.servlet.jsp-api + 3.1.0 test org.glassfish - javax.el - 3.0.0 + jakarta.el + 5.0.0-M1 test - + org.apache.commons commons-text - 1.10.0 - - - commons-net - commons-net - 3.9.0 + 1.11.0 @@ -198,4 +205,12 @@ + + + + apache-pre-release + https://repository.apache.org/content/repositories/staging/ + default + + diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 1f03497b..c579ff71 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:6.1.3.1') { + implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:6.1.3.1') { + implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M1') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:6.1.3.1') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M1') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:6.1.3.1') { + implementation ('org.apache.struts:struts2-core:7.0.0-M1') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation(platform("org.junit:junit-bom:5.10.1")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:6.1.3.1') { + testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M1') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 485fa214..30ec31d7 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 6.1.3.1 + 7.0.0-M1 2.16.1 5.10.1 2.22.1 @@ -121,15 +121,15 @@ - javax.el - javax.el-api - 3.0.0 + jakarta.el + jakarta.el-api + 5.0.1 test org.glassfish - javax.el - 3.0.0 + jakarta.el + 5.0.0-M1 test @@ -175,4 +175,12 @@ + + + + apache-pre-release + https://repository.apache.org/content/repositories/staging/ + default + + diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 4982518a..11296662 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -13,15 +13,15 @@ configurations { dependencies { implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-struts:[1.9,)', - 'org.apache.struts:struts2-convention-plugin:6.1.3.1', - 'org.apache.struts:struts2-rest-plugin:6.1.3.1', - 'org.apache.struts:struts2-bean-validation-plugin:6.1.3.1', - 'org.apache.struts:struts2-junit-plugin:6.1.3.1', + 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', + 'org.apache.struts:struts2-convention-plugin:7.0.0-M1', + 'org.apache.struts:struts2-rest-plugin:7.0.0-M1', + 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M1', + 'org.apache.struts:struts2-junit-plugin:7.0.0-M1', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', - 'org.glassfish:javax.el:3.0.0', - 'javax.el:javax.el-api:3.0.0', + 'org.glassfish:jakarta.el:5.0.0-M1', + 'jakarta.el:jakarta.el-api:5.0.1', 'com.fasterxml.jackson.core:jackson-databind:2.16.1', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.16.1', 'org.apache.logging.log4j:log4j-core:2.22.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 6eacfc31..c9fc14f9 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -6,7 +6,7 @@ com.amazonaws.serverless.sample serverless-struts-example - 1.0-SNAPSHOT + 2.0-SNAPSHOT Struts example for the aws-serverless-java-container library Simple pet store written with the Apache Struts framework https://aws.amazon.com/lambda/ @@ -26,7 +26,7 @@ 1.8 1.8 - 6.1.3.1 + 7.0.0-M1 2.16.1 4.13.2 2.22.1 @@ -36,7 +36,7 @@ com.amazonaws.serverless aws-serverless-java-container-struts - [1.9,) + [2.0.0-SNAPSHOT,) @@ -79,13 +79,13 @@ org.glassfish - javax.el - 3.0.0 + jakarta.el + 5.0.0-M1 - javax.el - javax.el-api - 3.0.0 + jakarta.el + jakarta.el-api + 5.0.1 @@ -167,4 +167,11 @@ + + + apache-pre-release + https://repository.apache.org/content/repositories/staging/ + default + + From 3b637dc7bedd832110bffc390f3476b813a7a119 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 04:06:00 +0000 Subject: [PATCH 0819/1214] chore(deps): bump org.owasp:dependency-check-maven from 9.0.8 to 9.0.9 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 9.0.8 to 9.0.9. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v9.0.8...v9.0.9) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9cd64107..0caa7b78 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 9.0.8 + 9.0.9 2.16.1 2.0.11 5.10.1 From 96b1a4a6be9102545efc3c3f6a1e147dc5664bbd Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Mon, 22 Jan 2024 18:52:34 +0900 Subject: [PATCH 0820/1214] Remove AwsLambdaServletContainerHandler from AwsAsyncContext since it is no longer dependent on AwsLambdaServletContainerHandler --- .../serverless/proxy/internal/servlet/AwsAsyncContext.java | 4 +--- .../internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java | 4 ++-- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 0dd115b9..98e7ef8e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -32,7 +32,6 @@ public class AwsAsyncContext implements AsyncContext { private HttpServletRequest req; private HttpServletResponse res; - private AwsLambdaServletContainerHandler handler; private List listeners; private long timeout; private AtomicBoolean dispatched; @@ -41,11 +40,10 @@ public class AwsAsyncContext implements AsyncContext { private Logger log = LoggerFactory.getLogger(AwsAsyncContext.class); - public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response, AwsLambdaServletContainerHandler servletHandler) { + public AwsAsyncContext(HttpServletRequest request, HttpServletResponse response) { log.debug("Initializing async context for request: " + SecurityUtils.crlf(request.getPathInfo()) + " - " + SecurityUtils.crlf(request.getMethod())); req = request; res = response; - handler = servletHandler; listeners = new ArrayList<>(); timeout = 3000; dispatched = new AtomicBoolean(false); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 73239a91..6fdb31f0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -442,7 +442,7 @@ public boolean isAsyncStarted() { @Override public AsyncContext startAsync() throws IllegalStateException { - asyncContext = new AwsAsyncContext(this, response, containerHandler); + asyncContext = new AwsAsyncContext(this, response); setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; @@ -450,7 +450,7 @@ public AsyncContext startAsync() throws IllegalStateException { @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { - asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 280a7e30..3e92d43d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -495,7 +495,7 @@ public boolean isAsyncStarted() { @Override public AsyncContext startAsync() throws IllegalStateException { - asyncContext = new AwsAsyncContext(this, response, containerHandler); + asyncContext = new AwsAsyncContext(this, response); setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; @@ -506,7 +506,7 @@ public AsyncContext startAsync() public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { servletRequest.setAttribute(DISPATCHER_TYPE_ATTRIBUTE, DispatcherType.ASYNC); - asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse, containerHandler); + asyncContext = new AwsAsyncContext((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); log.debug("Starting async context for request: " + SecurityUtils.crlf(request.getRequestContext().getRequestId())); return asyncContext; } From 42353cb3d3e36b47363715f8b1feab78d3a42888 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Tue, 23 Jan 2024 17:32:02 -0800 Subject: [PATCH 0821/1214] Added SpringBoot3-GraphQl sample --- .../springboot3/graphql-pet-store/README.md | 38 ++++ samples/springboot3/graphql-pet-store/pom.xml | 162 ++++++++++++++++++ .../graphql-pet-store/src/assembly/bin.xml | 27 +++ .../sample/springboot3/Application.java | 49 ++++++ .../springboot3/StreamLambdaHandler.java | 50 ++++++ .../controller/PetsController.java | 21 +++ .../filter/CognitoIdentityFilter.java | 69 ++++++++ .../sample/springboot3/model/Owner.java | 20 +++ .../sample/springboot3/model/Pet.java | 20 +++ .../main/resources/graphql/schema.graphqls | 16 ++ .../src/main/resources/logback.xml | 5 + .../graphql-pet-store/template.yml | 32 ++++ 12 files changed, 509 insertions(+) create mode 100644 samples/springboot3/graphql-pet-store/README.md create mode 100644 samples/springboot3/graphql-pet-store/pom.xml create mode 100644 samples/springboot3/graphql-pet-store/src/assembly/bin.xml create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java create mode 100644 samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls create mode 100644 samples/springboot3/graphql-pet-store/src/main/resources/logback.xml create mode 100644 samples/springboot3/graphql-pet-store/template.yml diff --git a/samples/springboot3/graphql-pet-store/README.md b/samples/springboot3/graphql-pet-store/README.md new file mode 100644 index 00000000..7d18a0dd --- /dev/null +++ b/samples/springboot3/graphql-pet-store/README.md @@ -0,0 +1,38 @@ +# Serverless Spring Boot 3 and Spring-graphQl example +A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). Unlike older examples, this example uses the [Spring for GraphQl](https://docs.spring.io/spring-graphql/reference/) library. + + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. + +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package +``` +$ sam build +``` + +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. + +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` to make a call to the URL + +``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl +--------------------------------------------------------------------------------------------------------- + +$ curl -X POST https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl -d '{"query":"query petDetails {\n petById(id: \"pet-1\") {\n id\n name\n breed\n owner {\n id\n firstName\n lastName\n }\n }\n}","operationName":"petDetails"}' -H "Content-Type: application/json" + +``` \ No newline at end of file diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml new file mode 100644 index 00000000..35535e2a --- /dev/null +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -0,0 +1,162 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-springboot3-example + 2.0-SNAPSHOT + Spring Boot example for the aws-serverless-java-container library + Simple pet store written with the Spring framework and Spring Boot + https://aws.amazon.com/lambda/ + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 21 + + + + + org.springframework.boot + spring-boot-starter-graphql + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.graphql + spring-graphql-test + test + + + com.amazonaws.serverless + aws-serverless-java-container-springboot3 + 2.0.0-SNAPSHOT + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.1 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.6.0 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + + + diff --git a/samples/springboot3/graphql-pet-store/src/assembly/bin.xml b/samples/springboot3/graphql-pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..efc312c2 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java new file mode 100644 index 00000000..678477a2 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.sample.springboot3; + +import com.amazonaws.serverless.sample.springboot3.controller.PetsController; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java new file mode 100644 index 00000000..a65c6f1e --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.sample.springboot3; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.EnumSet; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + }); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java new file mode 100644 index 00000000..93eb999b --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java @@ -0,0 +1,21 @@ +package com.amazonaws.serverless.sample.springboot3.controller; + +import org.springframework.graphql.data.method.annotation.Argument; +import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.graphql.data.method.annotation.SchemaMapping; +import org.springframework.stereotype.Controller; +import com.amazonaws.serverless.sample.springboot3.model.Owner; +import com.amazonaws.serverless.sample.springboot3.model.Pet; + +@Controller +public class PetsController { + @QueryMapping + public Pet petById(@Argument String id) { + return Pet.getById(id); + } + + @SchemaMapping + public Owner owner(Pet pet) { + return Owner.getById(pet.ownerId()); + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..d6ccae76 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot3.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java new file mode 100644 index 00000000..f048e690 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.sample.springboot3.model; + +import java.util.Arrays; +import java.util.List; + +public record Owner (String id, String firstName, String lastName) { + + private static List owners = Arrays.asList( + new Owner("owner-1", "Joshua", "Bloch"), + new Owner("owner-2", "Douglas", "Adams"), + new Owner("owner-3", "Bill", "Bryson") + ); + + public static Owner getById(String id) { + return owners.stream() + .filter(owner -> owner.id().equals(id)) + .findFirst() + .orElse(null); + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java new file mode 100644 index 00000000..f97b973d --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.sample.springboot3.model; + +import java.util.Arrays; +import java.util.List; + +public record Pet (String id, String name, String breed, String ownerId) { + + private static List pets = Arrays.asList( + new Pet("pet-1", "Alpha", "Bulldog", "owner-1"), + new Pet("pet-2", "Max", "German Shepherd", "owner-2"), + new Pet("pet-3", "Rockie", "Golden Retriever", "owner-3") + ); + + public static Pet getById(String id) { + return pets.stream() + .filter(pet -> pet.id().equals(id)) + .findFirst() + .orElse(null); + } +} diff --git a/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls b/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls new file mode 100644 index 00000000..293cdcc4 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls @@ -0,0 +1,16 @@ +type Query { + petById(id: ID): Pet +} + +type Pet { + id: ID + name: String + breed: String + owner: Owner +} + +type Owner { + id: ID + firstName: String + lastName: String +} diff --git a/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml b/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..8ff98899 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/samples/springboot3/graphql-pet-store/template.yml b/samples/springboot3/graphql-pet-store/template.yml new file mode 100644 index 00000000..c6543b15 --- /dev/null +++ b/samples/springboot3/graphql-pet-store/template.yml @@ -0,0 +1,32 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot3, Spring for GraphQl and the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler::handleRequest + Runtime: java21 + CodeUri: . + MemorySize: 1512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 60 + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/graphql' + Export: + Name: SpringBootPetStoreApi From 1b4a659270129c8e2b90f846c13c7efc50581dc3 Mon Sep 17 00:00:00 2001 From: Neves97 <43831599+Neves97@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:42:47 -0300 Subject: [PATCH 0822/1214] fix: Changed Maven version range to resolve both SNAPSHOTs and released versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pom.xml missing references fix * Using version range * revert maven shade downgrade --------- Co-authored-by: João Neves --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 569552a7..04de7678 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -43,7 +43,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - [2.0-SNAPSHOT,) + [2.0.0-SNAPSHOT,),[2.0.0-M1,) From c30b1977659f41d0c2742bc7fb5ac6a5d4c1f0f2 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 24 Jan 2024 19:07:06 +0100 Subject: [PATCH 0823/1214] Address PR comments and add sample which also addresses most of the PR comments from the sample PR that I have closed Update jacoco exclusions --- .../proxy/AsyncInitializationWrapper.java | 2 +- .../pom.xml | 4 +- .../serverless/proxy/spring/AWSHttpUtils.java | 12 +- .../spring/AWSWebRuntimeInitializer.java | 6 +- ...r.java => AwsSpringAotTypesProcessor.java} | 5 +- ...> AwsSpringWebCustomRuntimeEventLoop.java} | 27 +- .../resources/META-INF/spring/aot.factories | 2 +- .../proxy/spring/AWSHttpUtilsTests.java | 2 +- .../proxy/spring/AWSWebRuntimeTests.java | 8 +- .../{build.gradle => build.gradles} | 0 samples/springboot3/alt-pet-store/pom.xml | 6 - .../springboot3/pet-store-native/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + .../springboot3/pet-store-native/Dockerfile | 43 +++ .../springboot3/pet-store-native/README.md | 44 +++ samples/springboot3/pet-store-native/mvnw | 308 ++++++++++++++++++ samples/springboot3/pet-store-native/mvnw.cmd | 205 ++++++++++++ samples/springboot3/pet-store-native/pom.xml | 122 +++++++ .../pet-store-native/src/assembly/java.xml | 31 ++ .../pet-store-native/src/assembly/native.xml | 29 ++ .../sample/springboot3/DemoApplication.java | 12 + .../sample/springboot3/HelloController.java | 17 + .../controller/PetsController.java | 82 +++++ .../filter/CognitoIdentityFilter.java | 69 ++++ .../sample/springboot3/model/Error.java | 29 ++ .../sample/springboot3/model/Pet.java | 55 ++++ .../sample/springboot3/model/PetData.java | 117 +++++++ .../src/main/resources/META-INF/.gitignore | 1 + .../src/main/resources/application.properties | 1 + .../pet-store-native/src/shell/java/bootstrap | 7 + .../src/shell/native/bootstrap | 5 + .../pet-store-native/template.yaml | 33 ++ 33 files changed, 1302 insertions(+), 33 deletions(-) rename aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/{AWSTypesProcessor.java => AwsSpringAotTypesProcessor.java} (92%) rename aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/{AWSWebRuntimeEventLoop.java => AwsSpringWebCustomRuntimeEventLoop.java} (84%) rename samples/springboot3/alt-pet-store/{build.gradle => build.gradles} (100%) create mode 100644 samples/springboot3/pet-store-native/.gitignore create mode 100644 samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar create mode 100644 samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties create mode 100644 samples/springboot3/pet-store-native/Dockerfile create mode 100644 samples/springboot3/pet-store-native/README.md create mode 100755 samples/springboot3/pet-store-native/mvnw create mode 100644 samples/springboot3/pet-store-native/mvnw.cmd create mode 100644 samples/springboot3/pet-store-native/pom.xml create mode 100644 samples/springboot3/pet-store-native/src/assembly/java.xml create mode 100644 samples/springboot3/pet-store-native/src/assembly/native.xml create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java create mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java create mode 100644 samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore create mode 100644 samples/springboot3/pet-store-native/src/main/resources/application.properties create mode 100644 samples/springboot3/pet-store-native/src/shell/java/bootstrap create mode 100644 samples/springboot3/pet-store-native/src/shell/native/bootstrap create mode 100644 samples/springboot3/pet-store-native/template.yaml diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index b6b9b037..f5264e5f 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -47,7 +47,7 @@ public class AsyncInitializationWrapper extends InitializationWrapper { private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND); private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault( INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS))); - private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; + public static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; private CountDownLatch initializationLatch; private final long actualStartTime; diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 82b87b46..e7ab41cd 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -203,8 +203,8 @@ ${basedir}/target/coverage-reports/jacoco-unit.exec - com/amazonaws/serverless/proxy/spring/AWSWebRuntimeEventLoop* - com/amazonaws/serverless/proxy/spring/AWSTypesProcessor* + com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop* + com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor* diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java index aa2edefe..e19226b8 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java @@ -14,6 +14,7 @@ import org.springframework.util.MultiValueMapAdapter; import org.springframework.util.StringUtils; +import com.amazonaws.serverless.proxy.AsyncInitializationWrapper; import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.RequestReader; @@ -29,18 +30,21 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServletRequest; -public class AWSHttpUtils { +class AWSHttpUtils { - private static Log logger = LogFactory.getLog(AWSWebRuntimeEventLoop.class); + private static Log logger = LogFactory.getLog(AWSHttpUtils.class); + private AWSHttpUtils() { + + } - public static AwsProxyResponse serviceAWS(String gatewayEvent, ServerlessMVC mvc, ObjectMapper mapper, AwsProxyHttpServletResponseWriter responseWriter) { + public static AwsProxyResponse processRequest(String gatewayEvent, ServerlessMVC mvc, ObjectMapper mapper, AwsProxyHttpServletResponseWriter responseWriter) { HttpServletRequest request = AWSHttpUtils.generateHttpServletRequest(gatewayEvent, null, mvc.getServletContext(), mapper); CountDownLatch latch = new CountDownLatch(1); AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch); try { mvc.service(request, response); - latch.await(10, TimeUnit.SECONDS); + latch.await(AsyncInitializationWrapper.LAMBDA_MAX_INIT_TIME_MS, TimeUnit.SECONDS); AwsProxyResponse awsResponse = responseWriter.writeResponse(response, null); return awsResponse; } diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java index 4d09e6ba..e6dbd878 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java @@ -45,9 +45,9 @@ public void initialize(GenericApplicationContext context) { } if (context instanceof ServletWebServerApplicationContext && isCustomRuntime(environment)) { - if (context.getBeanFactory().getBeanNamesForType(AWSWebRuntimeEventLoop.class, false, false).length == 0) { - context.registerBean(StringUtils.uncapitalize(AWSWebRuntimeEventLoop.class.getSimpleName()), - SmartLifecycle.class, () -> new AWSWebRuntimeEventLoop((ServletWebServerApplicationContext) context)); + if (context.getBeanFactory().getBeanNamesForType(AwsSpringWebCustomRuntimeEventLoop.class, false, false).length == 0) { + context.registerBean(StringUtils.uncapitalize(AwsSpringWebCustomRuntimeEventLoop.class.getSimpleName()), + SmartLifecycle.class, () -> new AwsSpringWebCustomRuntimeEventLoop((ServletWebServerApplicationContext) context)); } } } diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSTypesProcessor.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java similarity index 92% rename from aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSTypesProcessor.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java index 70e961c8..f7fbe9e2 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSTypesProcessor.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java @@ -28,6 +28,7 @@ import com.amazonaws.serverless.proxy.model.ApiGatewayRequestIdentity; import com.amazonaws.serverless.proxy.model.AwsProxyRequest; import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.Headers; import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap; import com.amazonaws.serverless.proxy.model.SingleValueHeaders; @@ -40,7 +41,7 @@ * * @author Oleg Zhurakousky */ -public class AWSTypesProcessor implements BeanFactoryInitializationAotProcessor { +public class AwsSpringAotTypesProcessor implements BeanFactoryInitializationAotProcessor { @Override public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { @@ -55,6 +56,8 @@ public void applyTo(GenerationContext generationContext, BeanFactoryInitializati runtimeHints.reflection().registerType(AwsProxyRequest.class, MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(AwsProxyResponse.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); runtimeHints.reflection().registerType(SingleValueHeaders.class, MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); runtimeHints.reflection().registerType(JsonToken.class, diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java similarity index 84% rename from aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeEventLoop.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index a09f0c0d..4bb81059 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -48,9 +48,9 @@ * @author Mark Sailes * */ -public final class AWSWebRuntimeEventLoop implements SmartLifecycle { +public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle { - private static Log logger = LogFactory.getLog(AWSWebRuntimeEventLoop.class); + private static Log logger = LogFactory.getLog(AwsSpringWebCustomRuntimeEventLoop.class); static final String LAMBDA_VERSION_DATE = "2018-06-01"; private static final String LAMBDA_ERROR_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/error"; @@ -65,7 +65,7 @@ public final class AWSWebRuntimeEventLoop implements SmartLifecycle { private ExecutorService executor = Executors.newSingleThreadExecutor(); - public AWSWebRuntimeEventLoop(ServletWebServerApplicationContext applicationContext) { + public AwsSpringWebCustomRuntimeEventLoop(ServletWebServerApplicationContext applicationContext) { this.applicationContext = applicationContext; } @@ -110,7 +110,7 @@ private void eventLoop(ServletWebServerApplicationContext context) { RequestEntity requestEntity = RequestEntity.get(URI.create(eventUri)) .header("User-Agent", USER_AGENT_VALUE).build(); RestTemplate rest = new RestTemplate(); - ObjectMapper mapper = context.getBean(ObjectMapper.class); + ObjectMapper mapper = new ObjectMapper();//.getBean(ObjectMapper.class); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); @@ -128,16 +128,23 @@ private void eventLoop(ServletWebServerApplicationContext context) { try { logger.debug("Submitting request to the user's web application"); - AwsProxyResponse awsResponse = AWSHttpUtils.serviceAWS(incomingEvent.getBody(), mvc, mapper, responseWriter); - + AwsProxyResponse awsResponse = AWSHttpUtils.processRequest(incomingEvent.getBody(), mvc, mapper, responseWriter); if (logger.isDebugEnabled()) { - logger.debug("Received response - body:" + awsResponse.getBody() + - "; status:" + awsResponse.getStatusCode() + "; headers:" + awsResponse.getHeaders()); + logger.debug("Received response - body: " + awsResponse.getBody() + + "; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders()); } + String invocationUrl = MessageFormat.format(LAMBDA_INVOCATION_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE, requestId); - ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(invocationUrl)) - .header("User-Agent", USER_AGENT_VALUE).body(awsResponse, AwsProxyResponse.class), Object.class); + + ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(invocationUrl)) + .header("User-Agent", USER_AGENT_VALUE).body(awsResponse), byte[].class); + if (logger.isDebugEnabled()) { + logger.debug("Response sent: body: " + result.getBody() + + "; status: " + result.getStatusCode() + "; headers: " + result.getHeaders()); + } + System.out.println("==> status " + result.getStatusCode()); + System.out.println("==> body " + result.getBody()); logger.debug("Response submitted back to the AWS Gateway"); if (logger.isInfoEnabled()) { logger.info("Result POST status: " + result); diff --git a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories index 779aeae9..44acc0d8 100644 --- a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories +++ b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories @@ -1 +1 @@ -org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=com.amazonaws.serverless.proxy.spring.AWSTypesProcessor \ No newline at end of file +org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=com.amazonaws.serverless.proxy.spring.AwsSpringAotTypesProcessor \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java index 741162f6..61adfdce 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java @@ -221,7 +221,7 @@ public void validateRequestResponse(String jsonEvent) throws Exception { try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context); AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); - AwsProxyResponse awsResponse = AWSHttpUtils.serviceAWS(jsonEvent, mvc, mapper, responseWriter); + AwsProxyResponse awsResponse = AWSHttpUtils.processRequest(jsonEvent, mvc, mapper, responseWriter); assertEquals("hello", awsResponse.getBody()); assertEquals(200, awsResponse.getStatusCode()); } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java index f6eb7d92..9903e8f8 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java @@ -19,14 +19,14 @@ public void after() { @Test public void testWebRuntimeInitialization() throws Exception { try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { - assertFalse(context.getBeansOfType(AWSWebRuntimeEventLoop.class).size() > 0); + assertFalse(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); } System.setProperty("_HANDLER", "foo"); - AWSWebRuntimeEventLoop loop = null; + AwsSpringWebCustomRuntimeEventLoop loop = null; try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { Thread.sleep(100); - assertTrue(context.getBeansOfType(AWSWebRuntimeEventLoop.class).size() > 0); - loop = context.getBean(AWSWebRuntimeEventLoop.class); + assertTrue(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); + loop = context.getBean(AwsSpringWebCustomRuntimeEventLoop.class); assertTrue(loop.isRunning()); } assertFalse(loop.isRunning()); diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradles similarity index 100% rename from samples/springboot3/alt-pet-store/build.gradle rename to samples/springboot3/alt-pet-store/build.gradles diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index cf67ee6f..a39244f9 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -32,12 +32,6 @@ org.springframework.boot spring-boot-starter - - - - - - diff --git a/samples/springboot3/pet-store-native/.gitignore b/samples/springboot3/pet-store-native/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/samples/springboot3/pet-store-native/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar b/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 zcmb5V1CS=sk~Z9!wr$(CZEL#U=Co~N+O}=mwr$(Cds^S@-Tij=#=rmlVk@E|Dyp8$ z$UKz?`Q$l@GN3=8fq)=^fVx`E)Pern1@-q?PE1vZPD);!LGdpP^)C$aAFx&{CzjH` zpQV9;fd0PyFPNN=yp*_@iYmRFcvOrKbU!1a*o)t$0ex(~3z5?bw11HQYW_uDngyer za60w&wz^`W&Z!0XSH^cLNR&k>%)Vr|$}(wfBzmSbuK^)dy#xr@_NZVszJASn12dw; z-KbI5yz=2awY0>OUF)&crfPu&tVl|!>g*#ur@K=$@8N05<_Mldg}X`N6O<~3|Dpk3 zRWb!e7z<{Mr96 z^C{%ROigEIapRGbFA5g4XoQAe_Y1ii3Ci!KV`?$ zZ2Hy1VP#hVp>OOqe~m|lo@^276Ik<~*6eRSOe;$wn_0@St#cJy}qI#RP= zHVMXyFYYX%T_k3MNbtOX{<*_6Htq*o|7~MkS|A|A|8AqKl!%zTirAJGz;R<3&F7_N z)uC9$9K1M-)g0#}tnM(lO2k~W&4xT7gshgZ1-y2Yo-q9Li7%zguh7W#kGfnjo7Cl6 z!^wTtP392HU0aVB!$cPHjdK}yi7xNMp+KVZy3_u}+lBCloJ&C?#NE@y$_{Uv83*iV zhDOcv`=|CiyQ5)C4fghUmxmwBP0fvuR>aV`bZ3{Q4&6-(M@5sHt0M(}WetqItGB1C zCU-)_n-VD;(6T1%0(@6%U`UgUwgJCCdXvI#f%79Elbg4^yucgfW1^ zNF!|C39SaXsqU9kIimX0vZ`U29)>O|Kfs*hXBXC;Cs9_Zos3%8lu)JGm~c19+j8Va z)~kFfHouwMbfRHJ``%9mLj_bCx!<)O9XNq&uH(>(Q0V7-gom7$kxSpjpPiYGG{IT8 zKdjoDkkMTL9-|vXDuUL=B-K)nVaSFd5TsX0v1C$ETE1Ajnhe9ept?d;xVCWMc$MbR zL{-oP*vjp_3%f0b8h!Qija6rzq~E!#7X~8^ZUb#@rnF~sG0hx^Ok?G9dwmit494OT z_WQzm_sR_#%|I`jx5(6aJYTLv;3U#e@*^jms9#~U`eHOZZEB~yn=4UA(=_U#pYn5e zeeaDmq-$-)&)5Y}h1zDbftv>|?GjQ=)qUw*^CkcAG#o%I8i186AbS@;qrezPCQYWHe=q-5zF>xO*Kk|VTZD;t={XqrKfR|{itr~k71VS?cBc=9zgeFbpeQf*Wad-tAW7(o ze6RbNeu31Uebi}b0>|=7ZjH*J+zSj8fy|+T)+X{N8Vv^d+USG3arWZ?pz)WD)VW}P z0!D>}01W#e@VWTL8w1m|h`D(EnHc*C5#1WK4G|C5ViXO$YzKfJkda# z2c2*qXI-StLW*7_c-%Dws+D#Kkv^gL!_=GMn?Y^0J7*3le!!fTzSux%=1T$O8oy8j z%)PQ9!O+>+y+Dw*r`*}y4SpUa21pWJ$gEDXCZg8L+B!pYWd8X;jRBQkN_b=#tb6Nx zVodM4k?gF&R&P=s`B3d@M5Qvr;1;i_w1AI=*rH(G1kVRMC`_nohm~Ie5^YWYqZMV2<`J* z`i)p799U_mcUjKYn!^T&hu7`Lw$PkddV&W(ni)y|9f}rGr|i-7nnfH6nyB$Q{(*Nv zZz@~rzWM#V@sjT3ewv9c`pP@xM6D!StnV@qCdO${loe(4Gy00NDF5&@Ku;h2P+Vh7 z(X6De$cX5@V}DHXG?K^6mV>XiT768Ee^ye&Cs=2yefVcFn|G zBz$~J(ld&1j@%`sBK^^0Gs$I$q9{R}!HhVu|B@Bhb29PF(%U6#P|T|{ughrfjB@s- zZ)nWbT=6f6aVyk86h(0{NqFg#_d-&q^A@E2l0Iu0(C1@^s6Y-G0r32qll>aW3cHP# zyH`KWu&2?XrIGVB6LOgb+$1zrsW>c2!a(2Y!TnGSAg(|akb#ROpk$~$h}jiY&nWEz zmMxk4&H$8yk(6GKOLQCx$Ji-5H%$Oo4l7~@gbHzNj;iC%_g-+`hCf=YA>Z&F)I1sI z%?Mm27>#i5b5x*U%#QE0wgsN|L73Qf%Mq)QW@O+)a;#mQN?b8e#X%wHbZyA_F+`P%-1SZVnTPPMermk1Rpm#(;z^tMJqwt zDMHw=^c9%?#BcjyPGZFlGOC12RN(i`QAez>VM4#BK&Tm~MZ_!#U8PR->|l+38rIqk zap{3_ei_txm=KL<4p_ukI`9GAEZ+--)Z%)I+9LYO!c|rF=Da5DE@8%g-Zb*O-z8Tv zzbvTzeUcYFgy{b)8Q6+BPl*C}p~DiX%RHMlZf;NmCH;xy=D6Ii;tGU~ zM?k;9X_E?)-wP|VRChb4LrAL*?XD6R2L(MxRFolr6GJ$C>Ihr*nv#lBU>Yklt`-bQ zr;5c(o}R!m4PRz=CnYcQv}m?O=CA(PWBW0?)UY)5d4Kf;8-HU@=xMnA#uw{g`hK{U zB-EQG%T-7FMuUQ;r2xgBi1w69b-Jk8Kujr>`C#&kw-kx_R_GLRC}oum#c{je^h&x9 zoEe)8uUX|SahpME4SEog-5X^wQE0^I!YEHlwawJ|l^^0kD)z{o4^I$Eha$5tzD*A8 zR<*lss4U5N*JCYl;sxBaQkB3M8VT|gXibxFR-NH4Hsmw|{={*Xk)%!$IeqpW&($DQ zuf$~fL+;QIaK?EUfKSX;Gpbm8{<=v#$SrH~P-it--v1kL>3SbJS@>hAE2x_k1-iK# zRN~My-v@dGN3E#c!V1(nOH>vJ{rcOVCx$5s7B?7EKe%B`bbx(8}km#t2a z1A~COG(S4C7~h~k+3;NkxdA4gbB7bRVbm%$DXK0TSBI=Ph6f+PA@$t){_NrRLb`jp zn1u=O0C8%&`rdQgO3kEi#QqiBQcBcbG3wqPrJ8+0r<`L0Co-n8y-NbWbx;}DTq@FD z1b)B$b>Nwx^2;+oIcgW(4I`5DeLE$mWYYc7#tishbd;Y!oQLxI>?6_zq7Ej)92xAZ z!D0mfl|v4EC<3(06V8m+BS)Vx90b=xBSTwTznptIbt5u5KD54$vwl|kp#RpZuJ*k) z>jw52JS&x)9&g3RDXGV zElux37>A=`#5(UuRx&d4qxrV<38_w?#plbw03l9>Nz$Y zZS;fNq6>cGvoASa2y(D&qR9_{@tVrnvduek+riBR#VCG|4Ne^w@mf2Y;-k90%V zpA6dVw|naH;pM~VAwLcQZ|pyTEr;_S2GpkB?7)+?cW{0yE$G43`viTn+^}IPNlDo3 zmE`*)*tFe^=p+a{a5xR;H0r=&!u9y)kYUv@;NUKZ)`u-KFTv0S&FTEQc;D3d|KEKSxirI9TtAWe#hvOXV z>807~TWI~^rL?)WMmi!T!j-vjsw@f11?#jNTu^cmjp!+A1f__Dw!7oqF>&r$V7gc< z?6D92h~Y?faUD+I8V!w~8Z%ws5S{20(AkaTZc>=z`ZK=>ik1td7Op#vAnD;8S zh<>2tmEZiSm-nEjuaWVE)aUXp$BumSS;qw#Xy7-yeq)(<{2G#ap8z)+lTi( ziMb-iig6!==yk zb6{;1hs`#qO5OJQlcJ|62g!?fbI^6v-(`tAQ%Drjcm!`-$%Q#@yw3pf`mXjN>=BSH z(Nftnf50zUUTK;htPt0ONKJq1_d0!a^g>DeNCNpoyZhsnch+s|jXg1!NnEv%li2yw zL}Y=P3u`S%Fj)lhWv0vF4}R;rh4&}2YB8B!|7^}a{#Oac|%oFdMToRrWxEIEN<0CG@_j#R4%R4i0$*6xzzr}^`rI!#y9Xkr{+Rt9G$*@ zQ}XJ+_dl^9@(QYdlXLIMI_Q2uSl>N9g*YXMjddFvVouadTFwyNOT0uG$p!rGF5*`1 z&xsKPj&;t10m&pdPv+LpZd$pyI_v1IJnMD%kWn{vY=O3k1sJRYwPoDV1S4OfVz4FB z$^ygjgHCW=ySKSsoSA&wSlq83JB+O-)s>>e@a{_FjB{@=AlrX7wq>JE=n@}@fba(;n4EG| zge1i)?NE@M@DC5eEv4; z#R~0aNssmFHANL@-eDq2_jFn=MXE9y>1FZH4&v<}vEdB6Kz^l)X%%X@E#4)ahB(KY zx8RH+1*6b|o1$_lRqi^)qoLs;eV5zkKSN;HDwJIx#ceKS!A$ZJ-BpJSc*zl+D~EM2 zm@Kpq2M*kX`;gES_Dd1Y#UH`i!#1HdehqP^{DA-AW^dV(UPu|O@Hvr>?X3^~=1iaRa~AVXbj z-yGL<(5}*)su2Tj#oIt+c6Gh}$0|sUYGGDzNMX+$Oi$e&UJt3&kwu)HX+XP{es(S3 z%9C9y({_fu>^BKjI7k;mZ4DKrdqxw`IM#8{Sh?X(6WE4S6-9M}U0&e32fV$2w{`19 zd=9JfCaYm@J$;nSG3(|byYDqh>c%`JW)W*Y0&K~g6)W?AvVP&DsF_6!fG3i%j^Q>R zR_j5@NguaZB{&XjXF+~6m|utO*pxq$8?0GjW0J-e6Lnf0c@}hvom8KOnirhjOM7!n zP#Iv^0_BqJI?hR5+Dl}p!7X}^NvFOCGvh9y*hgik<&X)3UcEBCdUr$Dt8?0f&LSur ze*n!(V(7umZ%UCS>Hf(g=}39OcvGbf2+D;OZ089m_nUbdCE0PXJfnyrIlLXGh2D!m zK=C#{JmoHY1ws47L0zeWkxxV=A%V8a&E^w%;fBp`PN_ndicD@oN?p?Bu~20>;h;W` ztV=hI*Ts$6JXOwOY?sOk_1xjzNYA#40dD}|js#3V{SLhPEkn5>Ma+cGQi*#`g-*g56Q&@!dg)|1YpLai3Bu8a;l2fnD6&)MZ~hS%&J}k z2p-wG=S|5YGy*Rcnm<9VIVq%~`Q{g(Vq4V)CP257v06=M2W|8AgZO0CC_}HVQ>`VU zy;2LDlG1iwIeMj?l40_`21Qsm?d=1~6f4@_&`lp~pIeXnR)wF0z7FH&wu~L~mfmMr zY4_w6tc{ZP&sa&Ui@UxZ*!UovRT})(p!GtQh~+AMZ6wcqMXM*4r@EaUdt>;Qs2Nt8 zDCJi#^Rwx|T|j_kZi6K!X>Ir%%UxaH>m6I9Yp;Sr;DKJ@{)dz4hpG>jX?>iiXzVQ0 zR$IzL8q11KPvIWIT{hU`TrFyI0YQh`#>J4XE*3;v^07C004~FC7TlRVVC}<}LC4h_ zZjZ)2*#)JyXPHcwte!}{y%i_!{^KwF9qzIRst@oUu~4m;1J_qR;Pz1KSI{rXY5_I_ z%gWC*%bNsb;v?>+TbM$qT`_U8{-g@egY=7+SN#(?RE<2nfrWrOn2OXK!ek7v`aDrH zxCoFHyA&@^@m+#Y(*cohQ4B76me;)(t}{#7?E$_u#1fv)vUE5K;jmlgYI0$Mo!*EA zf?dx$4L(?nyFbv|AF1kB!$P_q)wk1*@L0>mSC(A8f4Rgmv1HG;QDWFj<(1oz)JHr+cP|EPET zSD~QW&W(W?1PF-iZ()b|UrnB(#wG^NR!*X}t~OS-21dpXq)h)YcdA(1A`2nzVFax9rx~WuN=SVt`OIR=eE@$^9&Gx_HCfN= zI(V`)Jn+tJPF~mS?ED7#InwS&6OfH;qDzI_8@t>In6nl zo}q{Ds*cTG*w3CH{Mw9*Zs|iDH^KqmhlLp_+wfwIS24G z{c@fdgqy^Y)RNpI7va^nYr9;18t|j=AYDMpj)j1oNE;8+QQ)ap8O??lv%jbrb*a;} z?OvnGXbtE9zt;TOyWc|$9BeSGQbfNZR`o_C!kMr|mzFvN+5;g2TgFo8DzgS2kkuw@ z=`Gq?xbAPzyf3MQ^ZXp>Gx4GwPD))qv<1EreWT!S@H-IpO{TPP1se8Yv8f@Xw>B}Y z@#;egDL_+0WDA)AuP5@5Dyefuu&0g;P>ro9Qr>@2-VDrb(-whYxmWgkRGE(KC2LwS z;ya>ASBlDMtcZCCD8h+Awq1%A|Hbx)rpn`REck#(J^SbjiHXe-jBp!?>~DC7Wb?mC z_AN+^nOt;3tPnaRZBEpB6s|hCcFouWlA{3QJHP!EPBq1``CIsgMCYD#80(bsKpvwO)0#)1{ zos6v&9c=%W0G-T@9sfSLxeGZvnHk$SnHw57+5X4!u1dvH0YwOvuZ7M^2YOKra0dqR zD`K@MTs(k@h>VeI5UYI%n7#3L_WXVnpu$Vr-g}gEE>Y8ZQQsj_wbl&t6nj{;ga4q8SN#Z6cBZepMoyv7MF-tnnZp*(8jq848yZ zsG_fP$Y-rtCAPPI7QC^nzQjlk;p3tk88!1dJuEFZ!BoB;c!T>L>xSD<#+4X%*;_IB z0bZ%-SLOi5DV7uo{z}YLKHsOHfFIYlu8h(?gRs9@bbzk&dkvw*CWnV;GTAKOZfbY9 z(nKOTQ?fRRs(pr@KsUDq@*P`YUk4j=m?FIoIr)pHUCSE84|Qcf6GucZBRt;6oq_8Z zP^R{LRMo?8>5oaye)Jgg9?H}q?%m@2bBI!XOOP1B0s$%htwA&XuR`=chDc2)ebgna zFWvevD|V882V)@vt|>eeB+@<-L0^6NN%B5BREi8K=GwHVh6X>kCN+R3l{%oJw5g>F zrj$rp$9 zhepggNYDlBLM;Q*CB&%w zW+aY{Mj{=;Rc0dkUw~k)SwgT$RVEn+1QV;%<*FZg!1OcfOcLiF@~k$`IG|E8J0?R2 zk?iDGLR*b|9#WhNLtavx0&=Nx2NII{!@1T78VEA*I#65C`b5)8cGclxKQoVFM$P({ zLwJKo9!9xN4Q8a2F`xL&_>KZfN zOK?5jP%CT{^m4_jZahnn4DrqgTr%(e_({|z2`C2NrR6=v9 z*|55wrjpExm3M&wQ^P?rQPmkI9Z9jlcB~4IfYuLaBV95OGm#E|YwBvj5Z}L~f`&wc zrFo!zLX*C{d2}OGE{YCxyPDNV(%RZ7;;6oM*5a>5LmLy~_NIuhXTy-*>*^oo1L;`o zlY#igc#sXmsfGHA{Vu$lCq$&Ok|9~pSl5Q3csNqZc-!a;O@R$G28a@Sg#&gnrYFsk z&OjZtfIdsr%RV)bh>{>f883aoWuYCPDP{_)%yQhVdYh;6(EOO=;ztX1>n-LcOvCIr zKPLkb`WG2;>r)LTp!~AlXjf-Oe3k`Chvw$l7SB2bA=x3s$;;VTFL0QcHliysKd^*n zg-SNbtPnMAIBX7uiwi&vS)`dunX$}x)f=iwHH;OS6jZ9dYJ^wQ=F#j9U{wJ9eGH^#vzm$HIm->xSO>WQ~nwLYQ8FS|?l!vWL<%j1~P<+07ZMKkTqE0F*Oy1FchM z2(Nx-db%$WC~|loN~e!U`A4)V4@A|gPZh`TA18`yO1{ z(?VA_M6SYp-A#%JEppNHsV~kgW+*Ez=?H?GV!<$F^nOd+SZX(f0IoC#@A=TDv4B2M z%G-laS}yqR0f+qnYW_e7E;5$Q!eO-%XWZML++hz$Xaq@c%2&ognqB2%k;Cs!WA6vl z{6s3fwj*0Q_odHNXd(8234^=Asmc0#8ChzaSyIeCkO(wxqC=R`cZY1|TSK)EYx{W9 z!YXa8GER#Hx<^$eY>{d;u8*+0ocvY0f#D-}KO!`zyDD$%z1*2KI>T+Xmp)%%7c$P< zvTF;ea#Zfzz51>&s<=tS74(t=Hm0dIncn~&zaxiohmQn>6x`R+%vT%~Dhc%RQ=Cj^ z&%gxxQo!zAsu6Z+Ud#P!%3is<%*dJXe!*wZ-yidw|zw|C`cR z`fiF^(yZt?p{ZX|8Ita)UC$=fg6wOve?w+8ww|^7OQ0d zN(3dmJ@mV8>74I$kQl8NM%aC+2l?ZQ2pqkMs{&q(|4hwNM z^xYnjj)q6uAK@m|H$g2ARS2($e9aqGYlEED9sT?~{isH3Sk}kjmZ05Atkgh^M6VNP zX7@!i@k$yRsDK8RA1iqi0}#Phs7y(bKYAQbO9y=~10?8cXtIC4@gF#xZS;y3mAI`h zZ^VmqwJ%W>kisQ!J6R?Zjcgar;Il%$jI*@y)B+fn^53jQd0`)=C~w%Lo?qw!q3fVi{~2arObUM{s=q)hgBn64~)W0tyi?(vlFb z>tCE=B1cbfyY=V38fUGN(#vmn1aY!@v_c70}pa(Lrle-(-SH8Nd!emQF zf3kz0cE~KzB%37B24|e=l4)L}g1AF@v%J*A;5F7li!>I0`lfO9TR+ak`xyqWnj5iwJ$>t_vp(bet2p(jRD;5Q9x2*`|FA4#5cfo8SF@cW zeO{H7C0_YJ*P@_BEvm2dB}pUDYXq@G1^Ee#NY9Q`l`$BUXb01#lmQk^{g3?aaP~(* zD;INgi#8TDZ&*@ZKhx$jA^H-H1Lp`%`O{Y{@_o!+7ST}{Ng^P;X>~Bci{|Qdf1{}p z_kK+zL;>D30r6~R?|h!5NKYOi6X&I5)|ME+NG>d9^`hxKpU^)KBOpZiU^ z;|SzGWtbaclC-%9(zR-|q}kB8H&($nsB1LPAkgcm+Qs@cAov{IXxo5PHrH(8DuEMb z3_R#>7^jjGeS7$!`}m8!8$z|)I~{dhd)SvoH9oR9#LjO{{8O&r7w{d9V1z^syn&E6 z{DG0vlQF_Yb3*|>RzVop^{$mWp|%NDYj@4{d*-@O^<(=L=DMFIQHEp-dtz@1Rumd; zadt^4B#(uUyM6aeUJkGl0GfaULpR!2Ql&q$nEV^+SiDptdPbuJ=VJ)`czZ@&HPUuj zc5dSRB&xk)dI~;6N?wkzI}}4K3i%I=EnlKGpPJ9hu?mNzH7|H0j(mN3(ubdaps3GM z1i+9gk=!$mH=L#LRDf4!mXw0;uxSUIXhl|#h*uK+fQPilJc8RCK9GNPt=X^8`*;3$ zBBo77gkGB5F8a8)*OR10nK&~8CEMPVQyhY>i`PS{L^-*WAz$ljtU%zlG1lm%%U4Zw zms0oZR8b|`>4U1X*9JLQQ>m9MF5%ppoafz^;`7DbmmIENrc$hucekkE4I83WhT%(9 zMaE;f7`g4B#vl(#tNP8$3q{$&oY*oa0HLX6D?xTW3M6f<^{%CK4OE1Pmfue`M6Dh= z&Z-zrq$^xhP%|hU&)(+2KSSpeHgX^0?gRZ5wA8@%%9~@|*Ylux1M{WQ4ekG(T+_b` zb6I)QRGp%fRF)^T?i^j&JDBhfNU9?>Sl6WVMM%S?7< ze|4gaDbPooB=F4Y=>~_+y~Q1{Ox@%q>v+_ZIOfnz5y+qy zhi+^!CE*Lv-}>g^%G=bGLqD(aTN;yHDBH#tOC=X02}QU~Xdme``Wn>N>6{VwgU~Z>g+0 zxv0`>>iSfu$baHMw8(^FL6QWe;}(U>@;8j)t)yHAOj?SdeH;evFx-kpU@nT>lsrUt zqhV}2pD^5bC4786guG1`5|fK@pE6xcT#ns)vR|^?A08G62teHaE&p`ZrCBj_Swt*~dVt=5*RK6Y{% zABqK$X59BnrK3r3u=wxklRnA1uh+q`?T0kE1YhvDWF4OY#<(+V|R@R%tdkq2huF(!Ip+EpZF3zr*|9pmKHPo)Cu z;H+^s&`Ql}u=Jt~ZWj`bAw|i-3#7(2WuRU3DU{BW8`?!O?YO1M$*MMTsaEM!5Jyp~ z!gp6yR4$O%wQ8%dyz43ZPeoJwy;o;yg=S0^Y}%|)to>=N^`!3VMf1~}OZ`Dl$q&|w z9$!i3!i1uAgPTuKSWdBrDr*N$g=E#mdqfj*h;Z}OG`{n245+g;IKfdn!&gF2OtHaD zyGDzj@@d2!P(_Ux)3v;1ABTj__{w*kaRF-1YVU`})Acgk?(T*1YqEve3=5)8bkZK* z!Tus*e$h@^u z>#zV0771Bix~r&h2FJ9)%N{>s>?2tk1$bId)1#G;OKgn-U8jUo^AK;Hu)hQEi}swD(264kAS-SBCD$R(Ro0rh8~Le zzRwxbz_JHDbD+hTX15AWmVw!#rC)-zeZahQQmo6FG1)ah3uuyIuTMof}RO!`Y3^Fxn_-G$23RDOh(@NU?r6`*S?#E50)w zpcsgDZ-iO{;EesgDQq9;p*C#QH(sp~2w^zAJWaUL%@yo)iIL6y8;e_}=dwQc%k%;H zFt5lenH*`}LWd+fPqi;exJeRZgl&nLR%|a!%1x0RQ54cgyWBYrL>sskcAtPxi&8c( zw_K?sI*3n%S;lKiYpveBN08{rgV&-B1NN5Jiu07~%n#%&f!(R(z1)xsxtRBkg#+Lv zh21zX?aYDd_f}qdA`Os*j!eC<5)iUJ&Twj7?*p%vEOGElGhpRZsccM!<k}DeC;TY;rULQs3e}lZyP#UVb=6 zB$Dkm2FaHWUXr7<{R&46sfZ)&(HXxB_=e`%LZci`s7L6c-L7iF&wdmTJz`*^=jD~* zpOZ@jcq8LezVkE^M6D9^QgZqnX&x*mr1_Cf#R9R3&{i3%v#}V$UZzGC;Or*=Dw5SXBC6NV|sGZp^#%RTimyaj@!ZuyJ z6C+r}O1TsAzV9PAa*Gd!9#FQMl)ZLHzTr99biAqA(dz-m9LeIeKny3YB=*+|#-Gq# zaErUR5Z*Wh^e<+wcm70eW;f-g=YTbMiDX)AznDM6B73)T4r%nq+*hKcKF?)#vbv?K zPMe=sFCuC*ZqsBPh-?g!m*O`}6<}Pfj}Y1n9|Y@cUdD5GX_)6Sx9pPfS7 zxkt?g6ZwJ+50C7qrh6dMFmr7qah`FskT_H=GC92vkVh$WfZa2%5L99_DxyM{$#6HQ zx$VR-Wwt!q9JL2{ybEGJr$^?!V4m_BqDqt!mbs=QjHf340+^a{)waVvP0+98(BA$M ztWr&sM=juyYgvf`(SC}+y@QtYgU>0ghJ6VbU}|kEraR&&W%#;!#KI?le%g`e>ZVPiDrneh#&1(Y?uiMo^f5qo@{JEr(p9>8GhDa+PC9yG;lX+D?hQ^fZB&Sdox219zUj_5;+n<0@Wi3@DK`MU8FM!OFJ z8*_mTA-u!Ab#95FRVWTIqAL#BVQGxE_s?>Ql|@0o9vos&r<_4d!+Q6(_270)6#lu$ zV!j$a?_V0I<(3Z=J7C-K0a^Kc1Go9p&T6yQeAD+)dG-$a&%Fo0AOte~_Z&_m2@ue~ z9cKFf-A41Dz31Ooj9FSR`l?H5UtdP?JS=UU$jF#znE1k@0g%K?KQuwZkfDI3Ai)(q z#x_Yo6WR_Y@#6I_02S&NpcP<%sw!!M_3#*8qa+*4rS@x=i{-2K#*Qr)*Q$-{<_(<| z0730e+rubnT38*m;|$-4!1r6u&Ua2kO_s-(7*NGgDTe##%I>_9uW;X__b_k)xlv$; zW%K2hsmr>5e^Z~`tS-eUgWmSF9}Yg8E}qydSVX0nYZMX_x94QK?tw2>^;raVTqstR zIrNAX2`X~|h->dTOb9IrA!i5INpLV}99ES|i0ldzC`;R$FBY5&7+TIy8%GO8SZ37_ zw=^Swk?z+j-&0-cTE|LU0q@IKRa&C6ZlXbSa2vN5r-)*f<3{wLV*uJUw980AFkWN7 zKh{?97GmVu-0rs9FB6ludy|n`gN5p~?y51aJzBg6#+-=0pWdZ2n4xTiQ=&3As-!-6 zFlb|ssAJEJL#s8(=odfz8^9b#@RrvNE4gjuEITzAd7R4+rq$yEJKXP?6D@yM7xZ&^ z@%jnE3}bteJo{p(l`hu`Yvzg9I#~>(T;>c;ufeLfc!m3D&RaQS=gAtEO-WbI+f_#| zaVpq-<%~=27U8*qlVCuI6z9@j)#R!z3{jc>&I(qT-8IBW57_$z5Qm3gVC1TcWJNc% zDk?H3%QHno@fu9nT%L^K)=#sRiRNg|=%M zR;8BE)QA4#Dsg^EakzttRg9pkfIrF3iVYVM#*_+#3X+~qeZc^WQJvEyVlO@9=0pl!ayNOh|{j0j^a z+zi_$_0QKhwArW)sJ$wji;A`?$ecbr?(4x5%2pLgh#wggbt)#T^2R3a9m+>GcrUxU z*u-WTgHAN*e!0;Wa%1k)J_P(Vdp>vwrROTVae@6Wn04q4JL-)g&bWO6PWGuN2Q*s9 zn47Q2bIn4=!P1k0jN_U#+`Ah59zRD??jY?s;U;k@%q87=dM*_yvLN0->qswJWb zImaj{Ah&`)C$u#E0mfZh;iyyWNyEg;w0v%QS5 zGXqad{`>!XZJ%+nT+DiVm;lahOGmZyeqJ-;D&!S3d%CQS4ZFM zkzq5U^O|vIsU_erz_^^$|D0E3(i*&fF-fN}8!k3ugsUmW1{&dgnk!|>z2At?h^^T@ zWN_|`?#UM!FwqmSAgD6Hw%VM|fEAlhIA~^S@d@o<`-sxtE(|<><#76_5^l)Xr|l}Q zd@7Fa8Bj1ICqcy2fKl1rD4TYd84)PG5Ee2W4Nt@NNmpJWvc3q@@*c;~%^Vasf2H`y z+~U-19wtFT?@yIFc4SE_ab?s@wEUfSkOED}+qVjjy>=eac2^S^+|_3%cjH%EUTJ&r znp9q?RbStJcT*Vi{3KDa^jr4>{5x+?!1)8c2SqiCEzE$TQ+`3KPQQnG8_Qk<^)y_o zt1Q^f{#yCUt!1e(3;E6y?>p+7sGAYLp`lA3c~Y`re9q&`c6>0?c0E2Ap5seFv92#X z1Vldj!7A8@8tWr&?%;EBQ_Fwd)8A3!wIx`V!~~h(!$pCy7=&*+*uIzG@*d%*{qG#4 zX0^}}sRN^N=p{w(+yjv%xwb!%lnVTE7l1l6gJwQmq_G83J&Y98$S!r*L8}IiIa2E= zE!0tbOuEDb*No0-KB{zjo1k#_4FHtr{!)>o+Y@bll}Sa6D^xktI0H&l{jKAK)A(iz zB-N00F?~Z}Y7tG+vp)-q*v71(C}65$-=uXx^|R$xx9zZip-V>Hqeyfd(wteM)+!!H z$s+>g4I@+`h2>C|J;PhvtOq)`xm4;CyF}R<)!ma3T{Vf_5|zo;D4YI4ZDBkE(vMeE zb#ZV;n}CgA0w8x!UC2&5Z(K)9bibj#?~>R(72lFx_Am~jS?;7mo~p+05~XGD+(wV4 zEVYnf0N5+-7O+Gc1L!sPGUHv<6=cV8}*m$m`kBs@z zy;goR(?J^JrB7uXXpD00+SD0luk!vK3wwp(N%|X!HmO{xC#OMYQ&a7Yqv-54iEUK4 zVH;)rY6)pUX~ESvQK^w|&}>J{I?YlvOhpMgt-JB}m5Br`Q9X+^8+Xa%S81hO<1t#h zbS+MljFP1J0GGNR1}KwE=cfey%;@n&@Kli+Z5d>daJjbvuO3dW{r$1FT0j zR$c9$t~P50P+NhG^krLH%k}wsQ%mm+@#c;-c9>rYy;8#(jZ|KA8RrmnN2~>w0ciU7 zGiLC?Q^{^Ox-9F()RE^>Xq(MAbGaT0^6jc>M5^*&uc@YGt5Iw4i{6_z5}H$oO`arY z4BT(POK%DnxbH>P$A;OWPb@gYS96F7`jTn6JO@hdM za>_p!1mf?ULJZb1w-+HamqN__2CtI%VK`k^(++Ga0%z*z@k0wYJDqT^)~%|4O299; zh1_iRtc7you(kOK8?Q$R7v-@Qk4+i=8GD2_zI0%{Ra`_prF{+UPW^m5MCA&4ZUpZb z2*!)KA8b--Upp~U%f+rsmCmV~!Y>Gzl#yVvZER2h;f&rkdx{r#9mc8DZMJaQXs?SL zCg3#>xR6ve8&YkP*`Z=lng|Ow+h@t*!Ial*XQg3P;VS8@E1C)VS`?L9N+rxlD7bxC z3@Ag)Vu?#ykY`ND+GvRYTUP&-KDMiqly$Z~uFXt^)4Jjk9RIs*&$?-UPM*d7&m${m zm12kaN3mV1J|c6f$>V+{lvHp~XVW3DU0;cBR>7|)4bo{xa1-ts-lYU-Q-b)_fVVl`EP5X}+J9EzT20x8XIv=m7witdu7!3Lh=KE#OyKpT1GWk{YAo^ny|fvZt<+jmsFs=l*%e& zmRkBt5ccv4O7!HAyv2~rsq*(FmMTm?@TX3&1`nu|7C^F{ad%GLuoX}Rl}6`)uHF_xlx^gVca+mGH4T8u8;q{S*x3=j;kelz^atO~)v!Q_BT z4H6%IA}bvfuk0_vweELeEl8N5w-Q1GF!@f{VKnbyYB2?}d&QvI-j}~RI_+9t9$tC2 z94m=3eLi=sQb^S5;fqP?3aaXc&`}`lq z&M8dOXvxx9Y1^u_ZQHhO+qP}nwkvJhwoz$Mp6Qcq^7M#eWm}!3U@s07hop` zW24|J{t$aB`W>uBTssEvYMyi$hkaOqWh+^(RV_1MYnE0XPgW?7sBDk=Cqs(;$qrPEflqa0ZE?A3cBfW%0RPA235Wb6@=R_d>Sez; z`spwa50bq?-zh+id~Q!T`AYn`$GHzs;jxIw(A1_Ql&f|qP}|bon#H;sjKmSDM!nyn z>bU8l%3DB3F+$}|J^da!!pN|DO!Ndc2J)wMk!+Rr1hes#V}5o(?(yQSphn|9_aU<- zn|nsDS{^x&tweP;Ft`2ur>Koo2IdXJDsr6IN)7vB41Yy-^Wbo9*2th2QA@C zE0-0Gk12YOO?d_Guu6b3&(PIL`d zh4{`k54hu9o%v1K3PGuccez-wdC<&2fp)>`qIIaf)R{5un7-vwm=>LD7ibnJ$|KyE zzw`X*tM0S|V(I3vf454PY{yA5lbE+36_<1kd=&0Xy4jfvUKZ0$Jq!AG4KS7DrE9rph;dK^6*#CIU9qu7 z?)6O`TN&MCWGmUVd1@E2ow2`vZ1A#nGo8_n!dmX77DCgAP1va*ILU+!a&$zdm6Pa6 z4#|*&3dM+r_RJb%!0}7X!An&T4a4@ejqNJ;=1YVQ{J6|oURuj8MBZ8i7l=zz%S4-; zL}=M^wU43lZVwNJgN|#xIfo$aZfY#odZ6~z?aNn=oR1@zDb=a(o3w`IGu&j>6lYxL z&MtqINe4Z>bdsHNkVIu$Dbq0wc#X-xev221e~L zbm8kJ(Xzij$gF4Ij0(yuR?H1hShSy@{WXsHyKtAedk4O!IdpR{E32Oqp{1TD{usJi zGG@{3A$x%R*pp8b$RQo4w&eDhN`&b~iZ2m3U>@9p1o5kXoEVmHX7I6Uw4dn((mFw` zilWrqFd=F5sH$&*(eJB52zaLwRe zz`sruIc=Ck75>v5P5kd>B2u=drvGPg6s&k5^W!%CDxtRO)V6_Y_QP{%7B>E~vyMLG zhrfn8kijyK&bX+rZsnSJ26!j$1x+V!Pyn|ph%sXWr9^f&lf|C;+I^Fi_4;`-LJI&F zr;5O@#4jZX=Yaw0`pUyfF4J8A9wE#7_9!X|_s8~YUzWu&#E^%4NxUA3*jK-F5R3LP2|msHBLmiMIzVpPAEX)2 zLKYjm3VI4r#7|nP^}-}rL+Q4?LqlmBnbL+R8P%8VmV{`wP0=~2)LptW_i682*sUR# z+EifOk_cWVKg-iWr^Qf4cs^3&@BFRC6n0vu{HqZzNqW1{m)3K@gi$i}O(hT`f#bT- z8PqCdSj~FncPNmMKl9i9QPH1OMhvd42zLL~qWVup#nIJRg_?7KQ-g3jGTt5ywN;Qx zwmz4dddJYIOsC8VqC2R%NQ>zm=PJH70kS|EsEB>2Otmtf-18`jUGA6kMZL3vEASDN zNX%?0+=vgsUz!dxZ@~)eU17m4pN3xGC0T;#a@b9Iu0g_v*a3|ck^s_DVA^%yH-wt= zm1)7&q6&Rq#)nc9PQ6DKD{NU=&ul10rTiIe!)x^PS~=K(wX9|?k&{Mv&S$iL9@H7= zG0w~UxKXLF003zJ-H%fGA4Db9{~#p&Bl7ki^SWwv2sfoAlrLMvza)uh;7Aa_@FL4b z4G>`j5Mn9e5JrrN#R$wiB(!6@lU@49(tawM&oma6lB$-^!Pmmo;&j57CDmKi)yesg~P;lJPy9D(!;n;^1ql)$5uYf~f z&GywSWx=ABov_%8pCx=g-gww_u26?5st=rdeExu?5dvj^C?ZZxDv@Si^nX~2qA&K= z2jr;{=L(x~9GLXrIGXs>dehU^D}_NMCMegdtNVWyx)8xHT6Qu!R>?%@RvADs9er;NMkweUBFNrBm1F5e0_>^%CwM6ui}K_MpRqLS0*@lAcj zB6TTCBv>w2qh)qU3*kN+6tPmMQx|5Z0A4n67U-nss90Ec_rDF}r)IR4PE{$8;BSt= zT%6|jyD^(w6a*A5>_|TkMqx~e$n@8{`q?|)Q&Y4UWcI!yP-8AwBQ#P`%M&ib;}pli z9KAPU_9txQ3zOM#(x}*lN8q$2(Tq1yT4RN0!t~|&RdQMXfm!81d0ZuyD}aG3r4+g` z8Aevs3E_ssRAMR+&*Q30M!J5&o%^(3$ZJ=PLZ9<@x^0nb>dm17;8EQJE>hLgR(Wc% zn_LXw|5=b$6%X zS~ClDAZ?wdQrtKcV9>_v1_IXqy)?<@cGGq#!H`DNOE1hb4*P_@tGbMy6r@iCN=NiA zL1jLwuMw&N-e9H(v7>HGwqegSgD{GSzZ@sZ?g5Y`fuZ^X2hL=qeFO(;u|QZl1|HmW zYv+kq#fq_Kzr_LaezT zqIkG6R+ve#k6!xy*}@Kz@jcRaG9g|~j5fAYegGOE0k8+qtF?EgI99h*W}Cw z7TP&T0tz4QxiW!r zF4?|!WiNo=$ZCyrom-ep7y}(MVWOWxL+9?AlhX<>p||=VzvX`lUX(EdR^e5m%Rp_q zim6JL6{>S%OKoX(0FS>c1zY|;&!%i-sSE>ybYX3&^>zb`NPj7?N^ydh=s=0fpyyz% zraFILQ17_9<ettJJt~I+sl=&CPHwz zC9dEb#QFQcY?bk11Y=tEl{t+2IG`QFmYS>ECl;kv=N6&_xJLQt>}ZQiFSf+!D*4Ar zGJ~LFB7e_2AQaxg*h{$!eJ6=smO(d2ZNmwzcy3OG@)kNymCWS44|>fP^7QkJHkE9JmLryhcxFASKb4GYkJ|u^Fj=VdF0%6kgKllkt zC|_ov2R4cJ2QjjYjT6jE#J1J<xaNC>Xm;0SX<`LuW*}*{yQ3c9{Zl=<9NP z^2g5rAdO!-b4XfeBrXa4f{M0&VDrq+ps&2C8FYl@S59?edhp~7ee>GR$zQI4r8ONi zP^OA+8zrTAxOMx5ZBS03RS@J_V`3{QsOxznx6Yt*$IuEd3%R|Ki&zZkjNvrxlPD$m z%K+rwM!`E&Z46ogXCu!3 z8use`FJJ?g_xi?~?MxZYXEu=F=XTC8P3{W*CbG3Wk)^31nD~W>*cJ@W4xg%Qqo7rq z`pUu8wL!6Cm~@niI*YmQ+NbldAlQRh?L!)upVZ)|1{2;0gh38FD&8h#V{7tR&&J}I zX1?;dBqK}5XVyv;l(%?@IVMYj3lL4r)Wx9$<99}{B92UthUfHW3DvGth^Q0-=kcJ1 z!*I9xYAc$5N$~rXV>_VzPVv`6CeX(A_j3*ZkeB~lor#8O-k+0OOYzTkri@PVRRpOP zmBV|NKlJT?y4Q82er)@lK&P%CeLbRw8f+ZC9R)twg5ayJ-Va!hbpPlhs?>297lC8 zvD*WtsmSS{t{}hMPS;JjNf)`_WzqoEt~Pd0T;+_0g*?p=dEQ0#Aemzg_czxPUspzI z^H5oelpi$Z{#zG$emQJ#$q#|K%a0_x5`|;7XGMuQ7lQB9zsnh6b75B9@>ZatHR_6c z0(k}`kfHic{V|@;ghTu>UOZ_jFClp>UT#piDniL(5ZNYXWeW0VRfBerxamg4su5<; z(}Ct2AhR@I-ro0}DdZLRtgI@dm+V`cRZjgV-H+aXm5|Mgz`aZX63i<|oHk-E)cABn z0$NR?(>fla7)Ong28FZSi9Yk0LtYl5lZw5wT!K5=fYT$avgkMKJWx~V#i@7~6_{dM zxDDPIW2l{O2Elv#i^cjYg~lGHRj(W*9gD`(FILKY$R`tL2qo&rtU*c;li!V`O$aV{ z!m|n!FAB2>MR_FVN*Ktv5+2dW4rr3YmfEheyD+48%USM#q6)w%#2}~=5yZE1LLcth zF%VtefH&#AcMx7)JNC$P>~OFuG6sK}F7V$D7m!{ixz&inpAVpFXiu^QruAw@Sc7Y2 z_A^V(2W_+KTGRp2aQSMAgyV#b3@{?5q@hPEP6oF3^}|@8GuD6iKbX;!LI!L=P#Za zL$Zuv#=x3fseRMZ()#SQcXv->xW`C|6quwqL1M&KByBj z2V`}(uL4JB-hUs6304@%QL~S6VF^6ZI=e-Nm9Tc^7gWLd*HM-^S&0d1NuObw-Y3e> zqSXR3>u^~aDQx>tHzn9x?XRk}+__h_LvS~3Fa`#+m*MB9qG(g(GY-^;wO|i#x^?CR zVsOitW{)5m7YV{kb&Z!eXmI}pxP_^kI{}#_ zgjaG)(y7RO*u`io)9E{kXo@kDHrbP;mO`v2Hei32u~HxyuS)acL!R(MUiOKsKCRtv z#H4&dEtrDz|MLy<&(dV!`Pr-J2RVuX1OUME@1%*GzLOchqoc94!9QF$QnrTrRzl`K zYz}h+XD4&p|5Pg33fh+ch;6#w*H5`@6xA;;S5)H>i$}ii2d*l_1qHxY`L3g=t? z!-H0J5>kDt$4DQ{@V3$htxCI;N+$d^K^ad8q~&)NCV6wa5(D${P!Y2w(XF!8d0GpJ zRa=xLRQ;=8`J2+A334};LOIhU`HQ*0v4Upn?w|sciL|{AJSrG_(%-(W9EZb%>EAGG zpDY?z1rQLps`nbCtzqJ#@wxU4}(j!ZQ{`g`g*SXlLah*W9 zyuh)UWoRCknQtd~Lk#BT_qjwj&Kw8U)w=owaJ;A5ae}3)y>{neYNS`|VHJdcSEBF# zBJ6a;T)u;^i#L~LVF-X7!E$SggILXMlsEy~v}K*DM2)f@U~g|Q6I-Pss@)`>fgFWx zsq&7pe!|VA-h;@=fBF{(mR1^{1>ukTYUdyF^#A+(|I_&nm{_xaKn3h4&yMyym2k-wMFg(s@ez=DPmuB%`| z6;e@HQKB(|!PU1sW)W6~x|=8m6rL~4dQ9LTk|RzL-_(_77B4I~ZG=q7K%qHiv!FD8 zmt;Vnhb{ymaydv2V;X-5p zTt2ln?kaB9&(dH_X70^@rrCfz)nwfa9LYTHXO(IPcTEf$QiEhTpl??L+`Eetyqof8 zzl=q)?KdYni!C_9b8Z3xm7r5<5ZG-0uA`u^7Dm7k4mAsQ(rkoWy*^DZJa~#y6+hNG zh?7{D9$a9LS`a@SvZ5?C{JUHovWU9KI}z8YV4pWftx21v*Q;MpU{+b@>Or(}pwO^fu0qA3_k_Bo2}lIxvmMhucG-o>O=+R6YxZ zjs!o%K1AA*q#&bs@~%YA@C;}?!7yIml1`%lT3Cvq4)%A)U0o1)7HM;mm4-ZZK2`Lj zLo?!Kq1G1y1lk>$U~_tOW=%XFoyIui^Cdk511&V}x#n4JeB7>bpQkYIkpGQRHxH$L z%tS=WHC~upIXSem>=TTv?BLsQ37AO88(X+L1bI<;Bt>eY!}wjYoBn#2RGEP49&ZH-Z_}R_JK_ z>o*_y!pOI6?Vf*{x-XT;^(_0}2twfk`*)_lLl0H-g|}BC?dm7CU|^-gNJ~rx z($>97WTKf71$?2|V$Ybpf~Aj@ZZOcb3#uRq51%4^ts-#RMrJhgm|K3QpCsPGW=2dZ zAr5-HYX!D*o#Q&2;jL%X?0{}yH}j*(JC4ck;u%=a_D6CrXyBIM&O#7QWgc?@7MCsY zfH6&xgQmG$U6Miu$iF(*6d8Mq3Z+en_Fi`6VFF=i6L8+;Hr6J zmT=k0A2T{9Ghh9@)|G5R-<3A|qe_a#ipsFs6Yd!}Lcdl8k)I22-)F^4O&GP&1ljl~ z!REpRoer@}YTSWM&mueNci|^H?GbJcfC_Y@?Y+e4Yw?Qoy@VLy_8u2d#0W~C6j(pe zyO6SqpGhB-;)%3lwMGseMkWH0EgErnd9a_pLaxbWJug8$meJoY@o-5kNv&A$MJZ=U z^fXPLqV6m3#x%4V*OYD zUPS&WHikdN<{#Yj|EFQ`UojD4`Zh*CZO4Cv`w^&*FfqBi`iXsWg%%a< zk@*c%j1+xib(4q^nHHO^y5d8iNkvczbqZ5;^ZVu%*PJ!O?X-CoNP*&tOU!5%bwUEw zQN?P*a=KKlu{`7GoA}DE=#nDibRgecw>-*da~7&wgow}|DyCJq!-Lp8a~(zR@tO1 zgu(4s4HptPGn(HmN2ayYs@g+yx1n`nU3KM{tQHhMHBw7f#gwru$=C()`aKZAl^dYc ze7fC)8EZEXOryk6AD&-4L+4cJ&M@3;;{R)mi4=`ti7IZByr^|_HNsjcNFu?mIE)jD za2j)FPwRY!R_YR-P?URm0Pti*e#5jmfK)6EvaKCT{h)kbJl{AGr1Ekt}pG?^e z*botRf-RsB8q10BTroj{ZP**)2zkXTF+{9<4@$aNDreO7%tttKkR3z`3ljd?heAJEe<0%4zYK?};Ur*!a>PbGYFFi(OF-%wyzbKeBdbkjv^i9mn@UocSS z4;J%-Q$l`zb&r*Pb`U;3@qkc=8QaPE9KwmlVwAf01sa*uI2*N`9U^3*1lLsM9dJ(4 zZBkU}os|5YT#Z;PD8xVv!yo$-n{-n4JM5ukjnTciniiT`(cZ6sD6~67e5_?8am%!w zeCLUxq~7x-!Xg#PgKV&caC@7mu<86am{WaXo(lAemt4~I$utSp(URWpYNo$RvU*$N z#%iiA+h`(E;BUg;=I!#EaxO89bUK3*v5Nc3GPmURC5TqzC|))DsFNtJICH6oBW6#q z+B(N{ey+^mk_{!@ z)VhAWXG=_0j|0f9iJ;c404PiIFqK)(AD05Xh`Fk`r$^b`v+>*g+_+h@r)e+ELJ45) z?20~u<}HQyQ5AsBz(teF9!!_GLXnm{5Z0e{Ki*@!=&3x4-RcjBn##DDzHJ|KSZ5(E z9=tFZ)p~-}x%9sCY27)2i>(E-^OiYT?_)a;yXAGR$y+E`myMd;xDA#_Q49t*E}&ql#H~|x z2J2R1_#2lt91NnF!uqW%_=HlbF?A{B{n>}9$g5QF!bh_a7LTU~Jyz}7>W5{_LAov{ zy2_dmGy)d)&7^bJyUjEw%3xj{cuG0Eo zwL*XQB*Oi=r&HIIecC1%lbE;Y-*5|cL955S+2@uR18JDL<0;;Uc2Q9JEyo1R!!sz_ z#BqnkGfbLP#oQJk3y}nwMd(3Tt^PVA#zXnYF7D0W1)#+`i?@cm}fBkKD z+Mpcuim53|v7;8Tv(KraEyOK`HvJq^;rlNzOjIbW&HJDFqW>doN&j7)`RDv#v|PQ+ z03WnB4Y4X@Fe-@%3;He*FjY1MFmkyv0>64Cp~FIDKQTwmFP~_CxZOf{8gPy}I<=JC zo%_bmue&$UU0|GG%%99eI!m#5Y1MD3AsJqG#gt3u{%sj5&tQ&xZpP%fcKdYPtr<3$ zAeqgZ=vdjA;Xi##r%!J+yhK)TDP3%C7Y#J|&N^))dRk&qJSU*b;1W%t1;j#2{l~#{ zo8QYEny2AY>N{z4S6|uBzYp>7nP_tqX#!DfgQfeY6CO7ZRJ10&$5Rc+BEPb{ns!Bi z`y;v{>LQheel`}&OniUiNtQv@;EQP5iR&MitbPCYvoZgL76Tqu#lruAI`#g9F#j!= z^FLRVg0?m$=BCaL`u{ZnNKV>N`O$SuDvY`AoyfIzL9~ zo|bs1ADoXMr{tRGL% zA#cLu%kuMrYQXJq8(&qS|UYUxdCla(;SJLYIdQp)1luCxniVg~duy zUTPo9%ev2~W}Vbm-*=!DKv$%TktO$2rF~7-W-{ODp{sL%yQY_tcupR@HlA0f#^1l8 zbi>MV~o zz)zl1a?sGv)E}kP$4v3CQgTjpSJo?s>_$e>s2i+M^D5EfrwjFAo(8E%(^ROV0vz0o z-cg0jIk24n!wxZainfH)+?MGu@kg$XgaMY-^H}z^vG~XC7z2;p2Kv`b^3S#b5ssMOJ7724v>S36dD zeypxJ<=E~sD4f5wX060RIF-AR0#{Z z=&y$r8A-e6q18lIF{@O9Mi%dYSYT6erw!@zrl=uj>o(3=M*Bg4E$#bLhNUPO+Mn}>+IVN-`>5gM7tT7jre|&*_t;Tpk%PJL z%$qScr*q7OJ6?p&;VjEZ&*A;wHv2GdJ+fE;d(Qj#pmf2WL5#s^ZrXYC8x7)>5vq_7 zMCL}T{jNMA5`}6P5#PaMJDB2~TVt;!yEP)WEDAoi9PUt89S2Cj?+E0V(=_sv4Vn6b z_kS6~X!G;PKK>vZF@gWpg8Zuh%YX^2UYPdCg7?EH#^gkdOWpy(%RnXyyrhmJT~UJw zAR;%Zgb6z(mS+o9MT|Sc6O({!i0pzk;s9?Dq)%tTW3*XdM3zhPn*`z45$Bg!P4xfy zD*{>30*JsSk?bQ-DgG62v>Vw-w`SA}{*Za7%N(d-mr@~xq5&OvPa*F2Q3Mqzzf%Oe z4N$`+<=;f5_$9nBd=PhPRU>9_2N8M`tT<-fcvc&!qkoAo4J{e3&;6(YoF8Wd&A+>; z|MSKXb~83~{=byCWHm57tRs{!AI<5papN(zKssb_p_WT@0kL0T0Z5#KLbz%zfk?f7 zR!vXBs36XaNcq5usS7<>skM_*P$e*^8y1ksiuokbsGFQ_{-8BAMfu!Z6G=88;>Fxt z|F-RU{=9i6obkTa0k~L#g;9ot8GCSxjAsyeN~1;^E=o5`m%u7dO1C*nn1gklHCBUw z;R(LgZ}sHld`c%&=S+Vx%;_I1*36P`WYx%&AboA1W@P;BvuFW+ng*wh?^aH4-b7So zG?9kFs_6ma85@wo!Z`L)B#zQAZz{Mc7S%d<*_4cKYaKRSY`#<{w?}4*Z>f2gvK`P1 zfT~v?LkvzaxnV|3^^P5UZa1I@u*4>TdXADYkent$d1q;jzE~%v?@rFYC~jB;IM5n_U0;r>5Xmdu{;2%zCwa&n>vnRC^&+dUZKy zt=@Lfsb$dsMP}Bn;3sb+u76jBKX(|0P-^P!&CUJ!;M?R?z7)$0DXkMG*ccBLj+xI) zYP=jIl88MY5Jyf@wKN--x@We~_^#kM2#Xg$0yD+2Tu^MZ1w%AIpCToT-qQbctHpc_ z>Z97ECB%ak;R<4hEt6bVqgYm(!~^Yx9?6_FUDqQQVk=HETyWpi!O^`EZ_5AoSv@VbUzsqusIZ;yX!4CsMiznO}S{4e>^0`c<)c~mC#*{90@+T@%EQ~>bovc8n_$bvqkOU7CrYe8uI5~{3O7EijeX`js z-$LNz4pJA7_V5~JA_Wl*uSrQYSh9Wm($%@jowv^fSPW<~kK&M*hAleywHd?7v{`;Y zBhL2+-O+7QK_)7XOJAbdTV-S`!I)t~GE8z+fV7y;wp#!wj75drv;R*UdSh(}u$%{VSd0gLeFp;h6FkiVz%g=EY3G#>RU;alRy;vQmk*| z@x-ba0XKE%IyL4OYw6IXzMiS(q^UDk=t(#XgkuF`{P?=k8k3r)rmhkv`vg@kiWd34 z-~t+1aV3SabTbG=nQYs>3~E<}{5@0g**LAWi*~SfRZhGcgP{e5T!0M7CU}`f@r8xI z0bx%sI!?5);-wG+Mx&S=NRfIi>V-wP(n&$X0Bhd)qI^ch%96s6&u7qpiK8ijA=X_R zk&|9f$GXf-;VgnrxV83Cp-Q!!sHH`5O^o~qZu!xny1t?(Au(EAn)D??v<1Uo;#m7-M@ovk|()C(`o>QMTp}F?> zakm3bHBKUjH-MHXDow7#Z|@wea1X9ePH;%YA)fCZ9-MD)p^(p!2E`aU9nmJlm;CXQ zkx~$WQ`Yq{1h5k>E>Ex{Z=P=)N*0b8_O({IeKg?vqQ)hk=JHe z5iqUKm!~mLP0fnRwkCO(xxTV@&p+o8wdSP$jZofYP}yEkvSc z5yD-^>04{zTP7X44q9Af&-wgt7k|XtncO&L@y-wFFR44RsPu57FRvIBaI^Pqy_*DV z@i13CsaR5@X@xH=NT3}T`_vsy!a02n80eQqya=-p7#YW`Jc0z!QglGg`1zeg6uXwI zsB~hlNMo)kFL(V3Q1<%8yoI6X7ncn-&&Uh3rL@S(6@wKAXt6Wr=a2ObI7}8$D-FoI z>AJA>WsBEMi5ba6JhJ%9EAi&ocd(ZsD|MsXwu@X;2h#|(bSWu@2{+c7soC`%uo{sMYq&Vyufb)?OI59ds)O+kyE8@G z@tlpNr0UO~}qd0HQve6njJ zda2+l$gdX7AvvGhxM6OToCuQ|Zw|9!g1)O+7>~{KNvASjp9#Cqce-or+y5xdzWL3gLWt2oa+T(I+{j(&bF1laUsJB{fOgE-B}qslaS>C z)TjzG8XecbS%a+?yT!0QmTex?E478;D|sL*oS4C-g0Tq(YoH|eyxJ#1j088C|U-w5id`%Sz7X_w#l+U9+)$|2no<}5J zRb_9@0esSr?n}HvVGbD5@$p$8k4?qOe-GNOk3-K^Mw>Xg+drCKi5@$GTeijpI;;IG ziD<&go`ptLC&^<0jw^l0aY?_pUUK+xp#0Bk66iQ29vpR)VBE{JOJ&OL^gKsN<&t<| zCMLTYMSDG5Ie9O>6Dl#T{@cscz%)}?tC#?rj>iwQ0!YUk~R z$rB-k=fa9x&631Z9Mfqj_GRoS1MzqSMEdaZ2!isP19Sr>qG8!yL(WWF)_&{F)r>KnJGSciSp!P0fqHr+G=fGO02Q#9gHK zpwz+yhpC4w*<9JO@#(MdkZcWbdCO5B!H`Z|nV?UtcBo96$BgX+7VYMwp@b-%;BrJu zMd*K!{1txv{kHKPDs9?WZrz_^o1Tq2P=+=|E=Oy4#WE{>9}*9(apqhmE`&AeBzQgQ zELFLCmb~q|6y0FCt|B}*uI*ayZ#6=$BpGtF{Jfye#Q>FZ?BPnk)*Qmd?rNG^tvFUU z_b&antYsZnUR6Q9tQUy81r$&ovT#fy;(Db4F&M*C=KxQgHDrRcVR#d+ z0(D|*9#u`w_%2o3faI{?dNd9$#5nj1PROHNq z7HJ(;7B1ThyM>a@Fo^lJb2ls2lD`}ocREH|5pKN;$>gFyM6k)kZG;lA;@kSJIqUhf zX%dhcN(Jtomz4(rNng&1br3Xx33EvCWz%o8s;SpRiKEUFd+KJ+u|gn|J85dZ)Exc&=V|Ns8Xs#P>qv6PX&VAJXJ(ILZO!WJd0 z`+|f5HrEj~isRN7?dBHotcPI7;6W48*%J(9 zftl1Tr`bKH*WNdFx+h;BZ+`p!qKl~|Zt5izh}#pU9FQKE97#$@*pf38Hr8A+`N+50U3$6h%^!4fBN zjh^cl#8qW5OZbvxCfYzKHuyeKLF4z^@~+oqlz9(Hx8vypIiUlt!(vs}_t#4@nh$s; z>FYERg*KD#Xs+W4q-V-IBQK!)M1)Aa+h+V+is)z!_=gEn&^ci7<DEEmYcoSh?WdXUsP7O4)&lQXA(BVM5jI8s6;mO}94AC0gG(`>|T)yuV1l~i-ejCCt zoejDhX0nrZDP|x9u4zp%S2UeDzV`o#pBGu1tZ-$<9TIbN=ALwhQ0=9S{8#}Uu8n-~ z5~xIvUhLSz@c@0|me$CdZCpZl(vQw@a0Y4^{T0w_>pOkwI^x4KkBf3qGmm)nG|Ps5 z_XTY~^b^mL&_*yjl~RRIi&eS(>y?y}O4-)nWyTEPpQAb#Xz8SnnfIL+nAcNL9nqV9 zRL|eyF)RKI5-kJO6}>Q89XmgY@b1&!JI>g3ryZ@jN2v3vm7O`AL!BTWNouJzV+$+Y zYY}u%i>K6=IYU2O$2TAyVjGt?wgF9xCj;?EK(8fWu!!~48`3u^W$eUlCh*91PLxu1 zRY(F7Q3s7h$Q-p&L$ucN}it*-9KR z_<wHu?!dav0$P+PI3{J8?{+l|n&2YMLV2 z+hRta$A5WpCXl1RNbYBsX8IGX{2v>U|8_I-JD56K|GexW>}F_e_g_1r?08v8Kz{V$ zT=6aGMk>ibvRO@Yrc@ezaD0%ydHkXGHrR{7>q~~tO7ChJflwa4-xL|@#YIJejC5VT zInU4CjQ9V0+lClQY=vh^s4MadwQmk7li{54Y;Ht}gkZOIh9(vfK?3kXLoD72!lHD# zwI-Jg|IhT=Y#s|tso1PWp;|aJ2}M?Y{ETyYG<86woO_b+WVRh<9eJu#i5jxKu(s~3 z4mz+@3=aNl^xt{E2_xewFIsHJfCzEkqQ0<7e|{vT>{;WlICA|DW4c@^A*osWudRAP zJut4A^wh@}XW4*&iFq|rOUqg*x%1F+hu3U6Am;CLXMF&({;q0uEWG2w2lZtg)prt` z=5@!oRH~lpncz1yO4+)?>NkO4NEgP4U~VPmfw~CEWo`!#AeTySp3qOE#{oUW>FwHkZ3rBaFeISHfiVSB7%}M) z=10EZ1Ec&l;4 zG98m5sU!pVqojGEFh8P{2|!ReQ&hfDEH2dmTVkrS;$dN~G2v-qnxn^A2VeHqY@;P} zudZD5vHtVvB*loIDF1M7AEEvS&h0;X`u}!1vj6S-NmdbeL=r{*T2J6^VA7F`S`CDd zY|=AA6|9Tu8>ND6fQhfK4;L3vAdJPBA}d6YOyKP&ZVi%z6{lbkE|VyB*p1_julR^k zqBwjkqmFK=u&e8MfArjW-(Ei8{rWso1vt5NhUdN|zpXqK{ylJ8@}wq-nV~L4bIjtt zt$&(1FTIs+aw}{&0SO4*sa0H2h&7g}VN5uYjfed5h7eGp$2Wu*@m9WIr0kxOc}fX9eOWh zFKfV>+SD$@kESKYm{F*J90XQjr$!<~v(J%&RMuQM+6CkmnYZDGlOUdq}%)VA& zl#acS%XE2KuX~7IamK`og@C`21~*cEEc#PZM6HT*Veb_l&Ej~j0zL7p0Eo`mMu(=X zJ$v;&Lya75I4C^saKROgfi(fdP0C$GM3WyZn%mm3yEI>|S&O(u{{S<}ihUp#`X&_z zmQBma;82#`C;dR5Sx09e07FvtJLhZ{9R~|$FCdU6TDNUwTc9kNct?8e@o2MpQDrkg zN?G+aYtTjiUPA=RX5o{4RYu}6;)ET>TcgL^VpfIpluJ|lQR(_)>6k%L^FZmoK-Wm- zR5qy0P)hm8yvqOL>>Z;k4U}!s?%1~7v7K~m+gh=0c9Ip_9UC3nwr$%^I>yU6`;2kV z-uJ%y-afzA7;BC7jc-=XnpHK+Kf*tcOS>f5ab2&J&5hIOfXzs=&cz|Qmrpu6Z);`R z0%3^dioK5x?o7t~SK7u5m{dyUZ#QUPqBHYn@jETeG>VU=ieZuJ;mm^j>dZM7))cw?a`w8R z%3M0R=kdOt^W^$Kq5Z%aJ(a$(*qFpy^W}Ij$h+Jnmc9eaP(vB@{@8t zz=RQ$x4XYC#enS$fxh@;cSZ|D%7ug;0z{C8I8h{KocN-cyv3UG_nk99UNS4ki^OFkYea`q`rs zG@qdMI;4ogcd5Tr`di1JBg4I*6CFvCID_2SN5&)DZG&wXW{|c+BdQ4)G9_{YGA@A* zaf}o^hQFJCFtzt&*ua~%3NylCjLtqWTfmA-@zw;@*?d&RE3O8G&d;AVC|rZrU}jx# zC-9SF`9;CbQ(?07o8Q9E12vi)EP@tOIYKEKnO@-o!ggkC)^#L-c40iZtb4Y-cS>$I zTn~+>rn*Ts>*y*z^b3-fAlne+M-*%ecrI^rmKAVv23cB`aWD?JDJ5NIafRvRr*~~C z)99Afs`BPK!5BFT)b_^8GyH*{22}yDq;be`GnPl=vW+ITnaqzl(uYOHhXi}S!P+QZ z4SwfEPuu&z4t#?6Zaw}bvN{;|80DfxCTuOdz-}iY%AO}SBj1nx1(*F%3A-zdxU0aj z`zzw9-l?C(2H7rtBA*_)*rea>G?SnBgv#L)17oe57KFyDgzE36&tlDunHKKW$?}ta ztJc>6h<^^#x1@iTYrc}__pe0yf1OnQmoTjWaCG`#Cbdb?g5kXaXd-7;tfx?>Y-gI| zt7_K}yT5WM-2?bD-}ym*?~sZ{FgkQ9tXFSF zls=QGy?fZ=+(@M>P3Y>@O{f44yU^fP>zNzIQ0(&O$JCd_!p?2;} zI6E1j@`DxzgJvqcE@zgapQ?tophO14`=14DUZ*#@%rRi``pi0lkNgidSsHGjXK8gO{drQoNqR&tRjM4>^DtW`)fiRFO4LE=Z+nCBS~|B3gZsh`Y?-$g z@8@Z$D7C!L9l=SWoE;(+*YirPLWvBd$5Ztn3J3EaGM+#pW#@{3%yksGqy(2Bt5PVE zf*fICtPp77%}5j#0G8<=v=)LR>-a3dxja8cy3m$=MZ2#$8mbLvxE%NptMd+L?mG`v zF1cANFv17DqP^P5)AYHDQWHk*s~HFq6OaJ3h#BUqUOMkh)~!(ptZ2WP!_$TBV}!@>Ta#eQS_{ffgpfiRbyw1f)X4S z_iU`lNuTy86;%!sF3yh?$5zjW4F?6E9Ts-TnA zDyx5p1h$Z3IsHv7b*Q{5(bkPc{f`2Wfxg*Z#IvQ;W_q9|GqXGj<@abo)FyPtzI~i25&o zC!cJR%0!}lLf^L2eAfZg7Z69wp{J?D6UhXr%vvAn?%)7Ngct4Hrs@LZqD9qFHYAWy z4l=2LI?ER&$He2n`RiG&nsfLv?8$Cl)&d8a-~-N`I|&EPa@Y=v@>0Gl?jlt>AUY;H z`**5bpS#VGhdp4pKbf3iEF*>-eXg_$bqt5Dc%q0+)R50>zd^l7sN5R5Z)Ut+oz-8_ zJ`Z9HE9(=wRTD)T=%GZTEi9K5naPzlfE$|3GYGLRCLsnqLi8Sc6y&iskqA&Z$#7Ng z7Q@C0)6k;J$TlQ+VKZ5)-Ff_BNoIMm+~!@Cv1yAUI-U!R)LHc@+nSUzo$GlRb+8W< zYPG%NFfr;!(RlnvBbN~~EpT6Xj5*^Z&73tdIQ$LZu`vkfzdTKa5|JJtQ_rm4g$9LO zKtgYVdW=b<2WGM3I_j|Rd8gZ3j;)S#AT(aP^d>9wrtQS_+K>pZDX^?mN!Z>f^jP@1 zlJ;i79_MgOAJa`%S9EdVn>ip{d!k6c5%zizdIoB9Nr!n`*X#%6xP1?vHKc6*6+vKx zmEt|f^02)S_u_wlW_<`7uLQU%{wdH0iojOf_=}2=(krE<*!~kn%==#0Zz`?8v@4gP zPB=-O-W=OO3tD19%eX>PZj3YfrCt0sEjgTd#b$buAgBri#)wW14x7QcHf2Cneuizz z368r7`zpf`YltXY9|2V{stf8VCHgKXVGjv$m!hdDf0gi`(Q!(Pyg~FO28Vr#!BYP| zI)qG2?Ho=1Us9dTml}-ZOR?g5Vk)f+r=dbCN*N1=qNfG>UCLeA8pd3Ub-pRx1b3FA zEn`CIMf`2Mt3>>#3RkE19o}aMzi^C`+Z>8iIPHSdTdmjCdJBtNmd9o0^LrJc9|U9c zD~=FUnSyghk7jScMWT|SHkP(&DK$Z=n&lGm+FDTpGxfoIyKV)H6^nY~INQ#=OtIT! zyB*J=(#oHf=S)MNOncW->!c0r0H#=2QzobO&f@x&Y8sYi-)Ld;83zO$9@nPPhD}yt z{P`*fT@Z(?YAmF{1)C;o?G@dfd2$c+=Av*|;P@Yz1KnclB-Z-fJQ-=+T*g>0B7!g# zQH{dHt_%wj=wlmT&m59)TQ~xK)gB6f^EY$=1zcbGf~Q>p_PzDCHR6lndGmqPY2)&w z$Th^K%1v@KeY-5DpLr4zeJcHqB`HqX0A$e)AIm(Y(hNQk5uqovcuch0v=`DU5YC3y z-5i&?5@i$icVgS3@YrU<+aBw+WUaTr5Ya9$)S>!<@Q?5PsQIz560=q4wGE3Ycs*vK z8@ys>cpbG8Ff74#oVzfy)S@LK27V5-0h|;_~=j1TTZ9_1LrbBUHb?)F4fc)&F7hX1v160!vJc!aRI>vp*bYK=CB(Qbtw7 zDr2O^J%%#zHa7M5hGBh#8(2IBAk}zdhAk$`=QYe^0P6Bb+j5X)Grmi$ z6YH?*kx9hX>KCI04iaM_wzSVD+%EWS)@DR&nWsSBc2VIZ>C(jX((ZiV0=cp}rtTO&|GMvbmE4FpBF5Rd z6ZG=>X&>N3?ZN2^11pXEP4L?XUo`qrwxgQm4X~RCttXmZAhnhu4KDK=VkKq?@@Q_Z za`*xyHrsAEsR zV(7)2+|h)%EHHLD3>Qg{>G|ns_%5g5aSzA#z91R zMDKNuIt@|t?PkPsjCxUy&fu^At*yUYdBV!R_KOyVb?DO&z$GLJh9~b|3ELsysL7U6 zp24`RH+;%C(!bWHtX&*bF!l-jEXsR_|K~XL+9c+$`<11IzZ4>se?JZh1Ds60y#7sW zoh+O!Tuqd}w)1VxzL>W?;A=$xf1Os={m;|NbvBxm+JC@H^Fj$J=?t2XqL|2KWl$3+ zz$K+#_-KW(t)MEg6zBSF8XqU$IUhHj+&VwsZqd7) ztjz$#CZrccfmFdi_1$#&wl~A*RisBaBy~)w|txu1QrvR1?)2mb&m2N$C(5MS%hSX)VJnb@ZGXB5^%(<#1L@ zL^>fBd+dEe`&hxXM<0A9tviIs^BDkByJdc~mtTYr!%F7Q1XnK2$%h$Ob30*hSP$Bt zDd#w{2Z%x^Wpv8!)hm>6u01mY!xmPgwZ#Q0148)SxJc3Udt!-&}eRO^LN ze26pQB!Jhg&Z>#FD>`C`sU44><=v>O>tJdLs!HPpV#AM32^J@Za-9J(CQjKxpzXao zQfRkWP%g9P8XV21MmoHfx{DICLSc*t4qVeQL9t}&Pz0rM}YTba@XsD=XMW@FxFM{QYQJHvM(JsUSa3mcTUl9^qcVA zBveO--fqw%{#QGR1vy;x88+qMcgzmcYc#8U`CPPt6bl?uj%w_`b~9JliftnOa|ziW z|6(q&STs_*0{KNa(Z79@{`X&JY1^+;Xa69b|Dd7D&H!hVf6&hh4NZ5v0pt&DEsMpo zMr0ak4U%PP5+e(ja@sKj)2IONU+B`cVR&53WbXAm5=K>~>@0Qh7kK*=iU^KaC~-ir zYFQA7@!SSrZyYEp95i%GCj*1WgtDId*icG=rKu~O#ZtEB2^+&4+s_Tv1;2OIjh~pG zcfHczxNp>;OeocnVoL-HyKU!i!v0vWF_jJs&O1zm%4%40S7_FVNX1;R4h^c1u9V@f z`YzP6l>w>%a#*jk(Y82xQ@`@L(*zD&H>NY`iH(iyEU5R$qwTKC5jm4>BikQGHp^)u z-RQ`UCa70hJaYQeA=HtU1;fyxkcB2oY&q&->r-G9pis)t$`508$?eDDueFdW=n5hJ z08lH$dKN$y#OEE@k{#|<%GYY=_c~fHfC@pD54KSP9{Ek@T47ez$;m$}iwR}3?)hbkwS$@p2iVH0IM$lB*XYA+#}-re|UNzCE)SOYwy z=Y!fkG4&I%3J(_H#UsV#SjHulRIVcpJ`utDTY{k&6?#fzt~@Om=L(vs6cxAJxkIWI z@H7)f2h%9!jl@C!lm+X4uu;TT6o0pd7 zteFQ(ND@djf#o2kTkjcgT=dHs7ukmP0&l8{f;o3JuHGd2Op*?p7?Ct=jA*tIg{MZk z$2Lsc0e8Tdcwrjx|_Ok?9uB3Il|^2FF%X#ck}WoIvrzQXN%kT$9NI{79Wm~gZ3`8I+O`)`n30feZ( zDO-fl6IG3c^8S;Y_M-)+^CmM0tT^g0?H#>H8!oC8W%oU!~3|DJ?)~LT9*&GAQG13zOGq6gs*={cu|(V7{R$y@{-iV*9q@AD(#Ktb}J&3&k|5Djs$)9WM7!6#EaJ_ilvbfUvyh8c?-{n zfuFrC0u6}UJZ7aj@(cNG_(CKgjQQTA-UK@-MVmick zot}6F%@jhq(*}!rVFp5d6?dg|G}M*moyLriI!PQDI;E1L1eOa6>F9E6&mdLD>^0jJ z09l?1PptuV65gm=)VYiv<5?*<+MH~*G|$~9Z3XEy@B1-M(}o&*Fr9Sv6NYAP#`h{p zbwbUE3xeJ;vD}QMqECN)!yvDHRwb7c1s6IRmW!094`?Fm!l~45w)0X`Hg+6Y0-xf# zSMemBdE)Q=e^58HR{kWrL5-H0X6pDu%o{0=#!KxGp0A;6{N5kI+EoY_eTE%2q|rwm zekNeLY-R?htk!YP2|@dbd8TWG4#G)=bXlE{^ZTb^Q$}Er zz)Fp)ul24tBtQFIegdI37`K$VR3tVdi<(fIsu{#QMx=$&CK9M8oN%3Mk;>ZPd-;Q- zn|sSKSnc-S0yrw#TlA$+p{J~u=u98s>IoL@cNLOxH=+1m?;t1bR$vR=M$US&Z8DO3 z_&zhQuId1$wVNsS=X?&s(ecIi#00o{kuPs6kpYkL$jMyGW8U7mlCVaZeEL=HsIxqm zFRLxWin8B>!Dc#9Z#t0RNQiR-@5J+=;tC7|1D*~rxcwHa5iIVD@99cCFE@BukUC-S z^iJdt?dwU)kH2VY9?|zVShMbZctzFRz5Q4tiXa^>@U%jDYq}$rSyc#p2wXr}mc0qq z^lT>$y)N(Qg0dwmEwTopneoU(y)>Mj+f{iHM0o|>ZtCg-itPj4addYz??aE)Rp&hk z_SI)%XeSf=SjZq18h!Cc>Xy&EynnxdHQ){(x@g|ZA%`3LU^KzX02c5N;F#tEk1)7v z(|V9tO3>?^X|kQ*rRBf4>mWW2$-Lx})|M7z125&VHcxsCqB!<$l1F$zCrJ+nm0f3Z z%Hq^=SKpHyV2@Y*Cu2x>fXC0SscnR*($zEB{KOniJcpn@e`PMH*_Q6*0Z^8RNCEvZ z+UU9!927p9YZ&g=bnUvQUZcdisyn;-4;ACXOe-Xor9K8Qbp{ldE17+G@VQT+9ZJQ*9dZoXfU2ue|mMhrrZk2R7&~YjFW4`BTq45UwVc6JORKU)wBCTanITh0GD}s$`C5pb(9{b9 znwee6j%?-UV)_7opOioCf5@C?@w^@g& z&68+oMmV;5JW@TT63&CSDrfYL2$L)pVseDtAwPwleEM3F^-Ufn3PpfxFmx6o zQ`Wq9x#d$e`VKn5LOXNsrqhGao7~|s(u~drPrZ+;aP!C%z4NskZstCbAibD}O%8Ij zb~C(taxco~WzJLxhL1T}3ctXMbV6}_z=IZN9L0|SxLSe`$X`<)BhM`$1&&)e_}fCh z=idVL<+u6Vn{&ksP*ZLlMo$fC`dtzF_?~L?4Rril2G4%v5^7sUa^&8aMtMX&mtapl zD(dW|cisM3fqMaB`8?QbkyiUl2g>hMB5EoS&IB8TdoC~)b$nT=`%GgU`k-)+8}`)F*~I~DXMaTP%kZftx11~?iALs5J+&Rom#p%Y z>dH}-euH4u=_V3hc6^*2WMtL!9%yRTJ93p}@aV0zdY*?xchFI>m+UivV=;aMFp0P~ zwB8P)wvV6D-GL?6hJ#g7Hy7=2i^&Od#S=j!;Rc_yjO!*4aN7{vqzg2t-R|Dav%_NDk z`H_FVlSi==(~f-#65VmQ{EE92x<03lwo5p)s=ZJ^L7PlS>132Whr zR6v~t(#I+(`usYLCoO;Rt8j&b^5g_xgs*98Gp|N}b>-`HtVm)MscD)71y?(K6DRCZV26RsHPHKk)EKKZA%C99t3$t^B0-k5@?E>A-YMbFe?>ms?J?_guHHNU(;id*>xH zTrtam+Aq?n@-y@uY@A?hy?1qX^eLu_RaH4Ave?A8NapgQF=C%XI7wlcCf4<6BRo_% zBXxxc*A6-3CruF?3i8HOdbc%>N=-iiOF+9HX|ht6SCkz;A^am&qi_I&qk1B(x<=(m z>QG)nswCOLl_1{SZ@_eE#m^qb6#6DoMsB*)`17ui+XvF%(}|J4G$z2G*;E!1ERnAH z@q%=#uV6kBddqy4=g>!VTV)9*1=i{wJ}Ep!I*?)uJdA(LwE?(!?;}_u=^M2NShWC_ z*7l4aBJ=!QVU2-iehgb`$vOI8zkm{W%QO~?xOD;NgI;Iqa3#^$^U5D&McReLe&qs# zR<^@QpR4#W~Laz+QBsPt@3L#KF`Yr8}jgHe;5(cfpQ=;Zjtbt;c%y^#-m=hqOT z;KAYakW+$w0&F}>K10&SiPcD9SrDOuczj@U#W})5jGU-_htU`U6Q%wdy((%?J}y+$ z=$4jw1N nJo)qTxG{D(`3*#8tY|67hJRF;)r6F|#I`Ar6I0aafRa=kr-Z0I^}9xf^u;G5iEQCbpv3b#S#%H|HYHsQaHK$! zU#3Fpz8*^pK%RRmX<_09eIVziB0jOgPgFnI-*QcwEBtBiO#v!>{W1cLNXyw3D9M|A z*oGy(u8BkDA1c;MsXmpK^-~pl=We^RYnhZ4bz*)Q)C2G+E3tgx9PzU0T>c|1ilS!T zyE=bz`=wskDiOi!@!l?Y))#%{FM`}7r~X)i1)1*c6_2Q!_1{)fp%cS|YF+Q-CB%d< z=zYus`Vt@Mx*a7V)=mpLS$-5viaKgNB=+zN657qy0qR94!cTtX-Z%KBCg4OKw7b=t zr=`7q5Ox=lJ%!G5WIyNQC1xpqYU0{!I$hyrk!6%De$gp<_*Gc?ES(OwY8U^)Kjgc{ zSlhpXDb|;{+y9`u{EuMz54rlky2~p6xX2>MV6BZ&k`$q%q7v(xYps2wr9e8^4<;CB zc)eAT~B^rjzO6<4BDDH;il6 zFsM8jL+agQ;zazW(uiQjM%fPf2N~_p{cy29XP11_lQFpt`t#9nlk}>fv((FZt-dBa zuMIc4HmPHW04n0TTG9ug9;&OV9euL$Ib|+M7}}L~z4e%%%b|r~6OQj(S2d7XfYn#xp8;KQ55UYu#gY*De5j6Cc z#R%?rqwpy7I1(kpU7B*Pq=etXeYUn04jg%ZPjYqQNa$==yTG=6KX+=;i2Xg+kjV2T*Gc!(ef z`Q4fR*TA=M5-}z+s%YO+!K{k}S**ic&>o4_Tmv$EQTOp7F6TXPCj-UTXy?OQ=%*y62Qajk{rXbR%jMCOFMiVE3KekQa4xR}B%=iPtd8BXo~q$OX_ zSp910{Ew;m|GATsq_XiJ3w@s(jrj^NDtr(Dp!`Ve!Oq?|EJ9=vY2>IfrV{rT%(jiY zi}W@jA2iqd=?q>s;3%?@oi7~Ndo3Ge-2!zX58j(w&zVlPuXm3rcHb7O0RsM|!Ys(b zh(=*&Aywo3vuJoWZnU!u2_4bNkDTc&&bCYc%T zM~~xYxS#3KXFzQ@OXdc%9QDOxqiTd_> zT;(DX9{5dIuC4pO_xy+3{Ov)1I7j!Z)6&nHUvTRP>VU5dm#849icG)cvl0QOPkCIzG^lOp4#UcNr`VhBp(Ha%8@KPlvT*5u!v_$b#b~%sn3K{mu zaxeD%Q~{;Lw03ZAq(Pc-IVj>n*h3l2{sqioCMGatQY0kx zi`1(WWDQ=;gmLSGptEQ%UFC)th@|71<8eiRtX&Mx@#1q#nMF_BMfQdS>!!Qkx2o}= zuqRi?`UOX5P3fP%M+71Q$ctH4Av}bXED#fQ`KR4!b~60nsAv^*M7c-x`|~B}XIuq% zlqIJOf>WvlhQ@Uw$du|14)tZ?; zPNZ|xZSwp1y+d4sut8E4*l2JWR|~o0A9vD-?zC-w zDc@=wE1YKb*OMSi_Kx}&w;#h3>sHp|8^hnA3w?-WK)X?@Z2dgV7`9Cupf-B2RE4x^ zwlw+~!V9C^tyb`J;m2}ksD`w}G9`yu(^--{SQ+wt^Fu4Li~Fft!3QO`upSkAU?o;# z(1Q%GUVWbbkTK-M=T+ULkk3s6Dc9`G4CO6|=&-S&D+rbJQ$`Y-xL~ol;kc(l)VbU>{&>bV+*?ua;$bnDc29RW+Ig16)Vf6=L|fMR_P2b7>6}0 zdlB#-gj|j*C~M=F^2=K*k~=tl6YM3SXXi&K-`EvEXnWz&4D-^hQRBJI3gKKDj^6|> z*WhHSim1qAffNt60Mve9lfw^+&0bx-AM0%j>QP3%W=S@(l=(nrJ678mRQ(#+sI@d{ zdb#5fo#T;hK7xJ=M58wZf|?DHwD%!OZ3JrTGV5#{cfQwuiMvz%!CQ}CubJ7`z?@rSF<+KHNV2goc)a6hP0oHB@3LLKSH2w{um&J*z1Ka2 zLIR>lvOvh>Oxe%?3A@v<_T|}${zf_&@C~^FCo#jB(W9VLO?DX{)n(BQ0(V0`mI|9Y z#U3WwxixJkU_NTvA>5q(A@r2dnEXJp#6B=pww$XGU}~1~c``UKqQb=^*2P|4Dq*_! zhY^i61Sy%T5$Td0O6^C>h(xVvT!}Y##WeT8+s+Uuz=7)~V$>!zU;%d>H)rm*6^IrsCma%|cifwDLk_ z!^W2voQ)D;I$=v2E>iSaBw!d7aD+|LWl2iD!cBw`Q5p1~fk_xGiPi8e^mY&#viTAk zmaKL8m;JQ4bY(n6uBZt02z#noMMxTfF-RzjKre-c+@B)#J3pN-Zv7F}JtAwNk3j?OkpVCL6W1)Q$FLAj zGI!tX;g`O{%pt=0|q54Jyj##w*4e*|_;Us2Tn?!#^R(>u}|FAw1G_ z#wQsagnj9$TAC`2B_XgB$wNq~Sxgl?#0+QWWcB{G`c6~&SosbtRt}Tukw`TQ!oG1= zYyL(y<;Wh+H24>=E}Gs=Hs2%fg;&Qdvr74{E!R?Bd zIRQ?{{xkLJ_44P@y3^#(Be%(pk%$liKbUUo76wSoVfJmt9iTKL3z{uW6L&?jYg>EY zsx{kRiW@q%<$VZvbS(TKKTO4{Ad6l^IeY(F^3}=mX9|FZmQ`~RErNxlBPl3ast}W$T4V?SW=6kIGn@-^`qJv| zZXwhK4Kl1a4E}nLI`rdOi?^pd6;LZ-|8G&INHgOeC5q{_#s+SXb0r(;5ryHFsoTJD zx$VtNDh=-Tx3t!NTlk=hgAaSM)#U}e>_-Ex(|JoX*hWmBPPdTIa-2(BIOUJ|Iddy| zwY*J%z%W$}*;uSoB!BIJB6N6UhQUIQE_yz_qzI>J^KBi}BY>=s6i!&Tc@qiz!=i?7 zxiX$U`wY+pL|g$eMs`>($`tgd_(wYg79#sL4Fo+aAXig?OQz2#X0Qak(8U8^&8==C z#-0^IygzQfJG4SWwS5vko2aaOJn*kM+f1-)aG{T43VJAgxdP(fJ4&U{XR90*#a)G8+clOwdF?hJ?D) zmxu>0>M|g_QRHe_7G|q6o`C>9x4xd$Gl7lAuR~+FtNid=%DRsnf}YI*yOToWO%xnP zY*1G5yDnTGv{{xg5FhWU65q3-|-(+-rJ2WCeSJn(7Az>ej4Jp9+l-GyZ_| zJ8}>iA4g|}q1AhEEv#uWR&$g&Uyht?fVU(qk(j?^D`))s>oG08pow!f>P1u71P%oL2)UC4GeS87&G?{)NE;D=my1Q9{~;y zJULE=bG6jXE28Y11YmoZoo945`MM*`v%5b=_02*0cwzDve#3(4M}NPt`)?SCa|7*q z-94ks(R6WH-l9fE4m4}10WSu&O`|;ZCIT%vL$_pbABY!}s33@~gIvZ0H4co|=_-T$ zF#lC7r`89_+RL9wYN=E3YwR?2{$^ki(KKd>smX(Wh*^VmQh|Ob5$n_%N{!{9xP~LJO0^=V?BK8AbCEFBhDd$^yih$>U z(o{RReCU{#zHSEavFNdc8Yt<%N9pd1flD{ZVSWQu*ea1t#$J5f6*6;tCx=&;EIN^S}*3s%=M#)`~=nz!&Q0&{EP|9nzWyS<#!QxP;!E8&3D}?QKh^ zqGum|+;xu9QE=F#fe2ws5+y1Igr&l`fLyLKry=1}(W+2W`waeOR`ZXlW1B{|;4sE3 zn^ZVlR11hiV~p<~TaSen8I~ay#7Ql=-_|U@$8yjZsZ=Vi+^`JV2+kn+oiSUi%omO_+7}saXnJ9 z5ETilbag(g#jZPopCgJu+n@(i7g}3EK2@N zd64$77H5a`i%b%a^iRjMaprwzWz(`=7E6QY)o)gek7H)yZ-BLw^6FAoHwTj9nJtWc ztKaytMlWGLg29W{?gr|rx&snb@XyvR_}x3fmC>d=-nQp5ab3*whTw}DfUcKlMDDx` z-%?ek^*|Kqooy#>2lfklZ|jN4X$&n6f)RNNPl(+0S>t(8xSeOGj~X0CGRrWmm(WXT z))DDW_t&y$D#2`9<-+JT0x1==26*gpWPV~IF=rePVF%e-I&y$@5eo~A+>yZ&z6&7> z*INESfBHGNegTWga&d@;n;FSCGyW?}e_Qw#GTLHo*fWxuuG@I~5VA!A1pOdRTiPA~ z^AGe(yo=9bwLJD}@oDf$d+34~=(vIuPtOKiP}obDc|?@hY}J*@V|UynBeAkYa?S{@ z_f$U=K+>deTAi&=a*xv>Ruyw$UsTWY=Yn=xjf;s)6NQu>_niQ_idmzIwuL`Scf)f= zyzK?D5a5)^D@H&qN%F6Zd0JeXX*Knbe~VLe^gi|?JK67&mB4jrapV-$`hCQT;C{%T z*pjxB+Y|~LD9bmMN%Iq}S$F$x1yWU7@GcR91V8h;!O2I5MN_rq*gRx(k8T!1WSDTp zr9eJO4$~H94aG^6k5p8k=kFJ>4lnY0q_Bsa$@vTRW6uY?slH|Qt)Yu6Yun&pfJ zBi!h;6x?FDs&79#PT*HSCEUsKws#s%TFy*=2PAfb`>gEPBn+D-WdfXA?MkB=<8kb_ z1+4D11mdHG0EcAyg4dneLtfJ8)RyHQl@6hWJNe(d_EjyCHf7%Xsd)S4A-4COz{G@% z5xQ!P>AS@H@;4Ws)N91)3A6PleMe2<& z!(zv#%Uc?N`(Xmm)OJPYt)BM`nRjoWA&P0Yxl@c9Y02zlPH1J5l$nhPrMwu=atkz4 z)a-1+OEL;d@ctx=s<<+3Sv1VYy0RYmiji|#hy$66#`5;u~BkH4^$EGZ-Y4xyZ=%3KuaeLYKAUr$xMtIh_5mga> zPz<#G0mQ7IxEw-yO}BueN}RaFlg$RwCDB)vLF$wDu%qZyLYsPKdcbHD23$qn9i#JFqIo#OK?u7db2-$GatzO!On87%}Br};~#}n zziVB;qf_4(K$u>Qyz$ln_kBGS!CD-t4Y}9oxL@7@Sx*?NOAzdeINUD>Hl#*V%pfA; zSA`==YatS*G*crJ3`3ll4)vKss&)UtY#7ZxiVoG%9(4<%`WWcjX2jV(^g7Yhj+h5J z$5=?S=tuCyEt74^6jo@6y|@~N>&cVfFNtaRl=)Gm!vR;Bc$3-;ySCI$%kdmjQ|si` z{$q_YCe6vjy6re9jGN|`43D``)1PODtz0)vhV4XV36nVpOnMx2uM%qZ<3TtcI%>BQ zf0(J`{JqPPJxw>k#&nIvoZ5e9Sno)B2r+E0G} z@&M|zf4E0Q$O*NBR2I;?i7N} z@2^Su#`%qeX}m3cbSojiLk#84kvW1fICNPS`OyT0SpUoA0(s^2m~J<^eKE!dhJx_N zG_T}0&(<*an>oF=@?6?55g&IxSgY3?7|@pmDRE6gJyJNPH6un~%0hZ@?h=hI6O$b^ z)29#<4$E)cE-5IFbRpk9JVrw$$966UDyw;Iym4OY4Fc!&s1ZH4BJ1-$9<)Zt1c)N- zU^&9hsk6z?3%<9kGKHW|6~k;&cghtWz`oz`_YjVuvy;B;T67=L2c6=8`7WyTBv*QH zNv*bo1#KOk{O&)@&pkd*?v+kcJ8tM>AGx$~WMhH{L40_N=bkrVg+^p!H)IqXCQf2_ z0fPig=8CEo>p4vE(nc^DKbZ|9_Xo}$i4zJ`jVh95; z5%aNP3@``=EJ=Vt9U`y+$YtX;%OPzgZ_3+;+mh{p#W&y4-%%Bf`LhOy-*kB0qnB^m z_nBTz_b?-`F$*ymByshU>D)za2g`0j^ioo;A#QeL@x3@|+_!=YXA5f6Xg(Ack&WOg zJ<2i|Fd6OmyH!@YSMVxb;=M)ZDhBt)4`5T*>cUXWPG#%@$&*>K&u3#|`fm2mj*FKVf?du{xZ}WKWETTFhq6_fO$PS5(ItF=3~pFp~*j z!ys1<4EL1)#{`mz@gW|t-FpPkd%pK)n_Rb)F;z7cQ6dym_>YI3&e!=!m006oS3Mjq{q ze%hNzW=G0jpfl2K(x`CDuZCsJV*hm9T~%5n7R_g}VFpk`G((D^MWVMAmRp--T{`P; zwMgD<;e`fm`g3|fPns|6qnd{|FCHY*YAguXH(?%sx%4+Gu|Y)_8mk4EljxmP+MP`* z`SUbI{TCIN2OV+$y#g->Jqv#$wL;}4xJmah#$0`v^ughM_XjTA$B}ux)JZuY5-GW4 zKy440I+w=ZtE-_i+0xImq}vyzD68?8;94-5L~_O6Ty>X3itdA-x?6P(c4jkr+f!H( zUDeqiG>3bn^Sf8(`_YwqPeJ9&-@OCQZm4X{FfRMeBtN4E9Ca@;GVpU*L>lVb;@=PH zTQvTr?^jKyCKh&ZVOI*<y%T*Aw(XCPrFC=39*y$A`FSzxBiQ#W+uW10d8&gYp4{teh;^p@anft+z$5!Hv&@h0X-@xJG>hbTCxjDwMiWK@1b%8wYL6BrV zT41m}tX8g-`P@vj4T!Mlk8F0S!MA`^J=SCy9-jdwDe^hVDa`WwyI^H@ryt=F5y6>b zT8&iI6&j8edAfX^ycgWbnMZQ26Q~`LmdEScKC8|~$Jgyw(>18NAQ$9AwCRmri!96L zp^)b0P2CR-9S%cG$#rU}MXnx21T#031o>2VrDs@sa-FpjfvgLPW>Q&LHUoNOtmkt# zoDZ=5OGp{^vO~=p29^`aXd8K?(+f-bW`N$U;-o;%f?RcR!k02Nod2h^^8ly%Z67#E zC3|IOuj~^YBO=Fklo@3mvd6I{Z*&FZ>iq* zxh|JuJoo2$p8MJ3zO@dQ;%1#~Mrm48 zB0053{1bDi_a@jo<4!@!`w4}B(&Qb`~IeSBh zu+_yIYl2Wgk+?x4pCmAM>x_SqBPUj#c`C`k>_fp@qPlAAwD$!zOxRkL7;=|nu(#ut zyF^;&hm-D_;ji{d6rOloACu5*NkF4IC3@rifMG(|^Skv$H&^YnYL*rpw=UCi;JOuz zN*NX(7wZXS4tF@6PIWAs%*j!$RoL*3sh)}iry%thDvN5AUM888q_(>|Tzt|Yea3AyMYBgm$H_`F^v2%)bux)3s znFIEBDK;-JS5SH|;1?afJb<*=c5puu=w%tv#ihn*R!^Hd$KWAp4$#`joJ*)$kNtZ z2Al6h>Z>(u?3tmzA4^d+jLKx{97!Pb4;CX&u;M||**7zXI7hO6nrdMx*Xa=|-`#1^ zBQ?Ha&7cd7hN=%y4yUp?zl8~Lo;%mQrDe8!ce-W_K94FFMN*g(w8q-_K5S+c0{o29X&PzpV;UJE^!xnFc%b@>kvW4m#xiOj-L*DadC&2N#0Us z;<-(m1WB7$=j6hjcPC6JB)D3T2#IC`ibu#yi!uK7W2!j|Z>~RaJ*&XXy#ytIk2DIp z5?Qd^s90_?ILjU#>ZWk5HXts}grg_!Gmgm!d?eLGR7xEP zvTCrslV~94ym5_i<5oqy(@@?wN}lIdtiY8=?|Ng!XeYnly`@9wCGx2S$3x|0x8T2h zz7A85Vb2>s44rKpI_4Y7_Pnd2^mYj2%^jM|Du>u4`^Psda^JIP%*DK6bo`Vf&f{!% zDTYCwF5Nhi=)QhU2$@eQv&ZzxsX+Hl+gP6kW|e!n9IU2>Vh~cioI{>4WvR}t*4Hpz z%5z?HjLGoka}Q3AbX9AkY|Yjf^M(>@tBAI9JO5pDCQu0R3Nns>)LC#vB2p96C*?K? zvX$un$sBDx$1=+NNj*@Oa@u*b@O*XBr_sg@8sCUq-|LK!MUmC)epklrv}5O_^<{NP zX16|c$9Wtbks3y7geI^tF5oRZJu;v zwkW8j+8Ccxo9stEDOT_Go&j%$KCgVO7pm+^%PKEPBZqbMw%s@732XS{cX+wCSjH1s z5)bc=g**<^NNsroY` z?}fHHlgu^B?2r{^^gQ&j zbF~T((>|Yg&C5WKL8DCnl1}Z3!YHFW2S1|;Xr0`Uz-;=FxEwYc4QpeAtnm7^f~uzX zl;xA!?>MLR?tL80Iudm;mi{!ewL91KhG7Hsa-XepKi<2mc6%zf0GwtbfJ1Zf-<@Xu z#|XWDzv|04t)&9Id!UxAAkN{t5qC%%8-WV3i;3duS19%m2||Y{!3pR1=g|zQYAMqc zff)_2nj-O4wfxy;UNM?|Uieo!^J$A*uDe>@V(NKH;KS;Y_dtE8${p>RdcrW;=2*fj4~d?OG0l-(g?ik}vz} z)5-wDppVts>K-=|@{=!53?=8)Jw#RGpS_FWpbwtn}{v!JEJ$q-sr7F6&OPBuI# zuVNFMPte79XgEu!P&qRq8u4J>r%$l-IQ00Lin90(_KtC)aR_de zxN=pY2<1b29_^AG2WJIGmmX4rv3$!`l15{e(H!1^+x9voZ6;882YAE12q7+lgy+>) zj|s0CyzI9=Mo!R}&LXB`&DYpZ7c?0r(&KNV+~TULd0y^e;G{KVR4nL0KvU9mr8&$^ zxrM-9P8zE`J?aZ(iB~Rz<{vvnk2HaZU#K$aVFfYnbAXVUOLU#As5JvS%+26 zi$sNuPY}dLGUS$0g&;oBqhzv2dY`l3@6Na403M!Sh${B|7(y|_cONa;6BrtUe@ZzV z7SThtHT8k?Rwc)(Z}@BP#H@JJHz&GR&M=E@P9KJ89yQKmRh&I~%vbL1L-K3E>7>CH z)Y!=jXVb1iPrAoAZZ3}3wU*5~nrV!ZjL5zqJ<@NwjHCZC>68Cc<{&E_#S;E*jOdjtg?uKN|l`P8sjz&Qf7a^z9 z;{3-8T+H4y99_zc;JYIvs!sk$G}` z??mt*Mm9Z@glCZb!X?!xXD-21sFDPEpZOK{sbQseQ$%6~b;n+*z0hRoR}0Pe>B|#t z$XrVcXv8M|q*Z8MY&r9J0A=d^1bHpjrUXu)qEj~$%%=gZp`^~%O*lzxUquG^p6;n; z^(3HL+hx4gRP?4N*b2p9!^|2~rcw3!9nQj$vmZusbXYz_x^AVc`3qBFm(jS9ueU5h z^AnNnbswfQ2Jq=W=T+p-V|nQco@bOAH$pLQZ+BKH8E$iM>IDz z3|wc?QP`yI=X5YTlp8h}%p6{Deq?S0QD$Ug>ih1SdPZg237Rl{S~=Ha4~-ckMoIWMn+X@@`V6 z#HHZj>MQbt$Qqp*9T(cjc^lxZ7UO(>PwzF-qEr(wo`vaulxdall|KP`7p4gd`23&Jy=#sAes*0diLB(U$Nx46VQvP)8idSs8^zaV91xw*O-JMH=)FoJshRob|_)O)ojtfP))WHCr(;*2;VMQ75^ zfN@a^f#o<|*9X;3IcGodLUz-3i~FAu+zI4c5h+nW^h_!^)b*B_xw-l4O$TB(ixaqW ziMoa%i=BeS<-F45kMO;Tw|FWa`G2c!SuOA3CbowPhF6csf1|&qqugUrj;UgGHm| z;j^yoH?MZhR;AYOW_XW2Lg2j%%ejL)B@*bUMD`g<#Z${1+fa57r7X82 zcqY-cfPnK%Y^3@szRner zt)bBToYCph6Jv*W+&t?&9FG4(Iu2w46 z4B#AcFy_^J@f*6<{>CN}Sj969*DYV*e7<61U>GoN{tz!Do90+jApFueVY_IW(MQF; zl?4yA_(MvMwN&pWKVyg{3uU_+y6RMdot2vu%mC?st=N0pf-~JZXE?3JFf)j<{1xsU z`2ephz)#HzsWEP!inHm2hI(V(~@W zY7gGU-lO52cHD&SY)>QHgy$=>^X%u0TQZfCizro!*weMyvZC=;MWOawdAx~`3C*W` z%^#^$uRP;gyqEE0<(i8xcQY$oc+6mY#z{-XFxsO1(cN8Y)>p;^q9|5bk`Z*p|c!?(rErw#y;yT(%@c7trQBv6cj)$3>pI z>tz+;IB?D=aQV=s(n)o63*yn8dX1m7#Z4G{%fF@K2o5n3jxR~mU?nzMi#;}8e#(>{ zy{Z4!AI)jZ8TY;nq1aq}tq;~=zzoTv)er06oeX3;9{uP{LWR*2%9cmE%S^`~!BW>X zn3PZFTf3g*dG68~^1*q@#^Ge(_8puPEFLD8OS|0b2a{5e=N4S%;~f3tC>F6UxK#v9 z)N-#Mv8=ePCh1KsUKD1A8jF_%$MPf|_yCN9oy%*@um6D{w*2|4GY zb}gafrSC+f=b*W{)!a!fqwZ9)K>fk=i4qf!4M?0v{CMNTo2A9}mQzV=%3UT&i{3{W z>ulG#M!K7%jPf6Mjff9BMslgQq3zIogY);Cv3v;&b#;^=sh#(Bn%W)H*bHNaLwdpq z85%fUTUJJNjYO_426T2TBj0D{6t zw&S_HZ|C?pI_2q(9Fas&@uJs6nVX;P*5K#6p|#)_(8PM-{L(;2wl`ma{ZAd5gA)?y z>0GSLoK<*FwW+G8@-M3vcffg7I(qm7lzF)n`Q9iCvp*mn7=|CjlpG{x z&r0n}XLWZ!>=lynUr7D`6n`7a_ZgT< zm!i;&?Fb0Q2QmqmCHfZ7ex=_tU~(7b)L?RIvPyEAU=gLIZ-VTAA~WR00yKyTXg^(G zqWLZJs!FnQYMOH3*fN&Tn(IKMLf{Ki?pRo8zZJ6YVyj)y0^)-sR}2-)%mI(Aw2AgT zbbp1T{qB(OSNJd0cVBH^tI>HR(q+#*lmi@LWe*rZz&M2h1L_=50uZ1e*n#E*`6?aw zj`ka&JpceRGe@}Ey1)Q~O}0qHRg4K_u>4e1arvJ7Q9!=t5AuzG`n=a-f0}{+lnCE#zu$`oVn44eS&T?N*wz~t~E&oQDBrB_MSg z_yVrQehWbD0xHX|v-hpselAu;O7s;P*!uAT`dr~}Lie=tknaGoiU?;*8Cwgala-65 zosOB4mATbdXJFujzgA4?UkCKE093A1KM?W&Pw>A?IACqg1z~IZYkdP70EeCfjii(n z3k%ax?4|rY(87N&_vhsyVK1zp@uils|B%`(V4e3%sj5f|i(eIhiSg-fHK1Pb0-mS^ zeh?WA7#{hhNci5e;?n*iVy|)iJiR>|8{TN3!=VBC2dN)~^ISSW_(g<^rHr$)nVrdA z39BMa5wl5q+5F@)4b%5-> zA^-P20l_e^S2PTa&HE2wf3jf)#)2ITVXzndeuMpPo8}kphQKhegB%QO+yBpDpgkcl z1nlPp14#+^bIA7__h16pMFECzKJ3p4`;Rf$gnr%{!5#oG42AH&X8hV8061%4W91ku z`OW_hyI+uBOqYXkVC&BqoKWmv;|{O|4d#Nay<)gkxBr^^N48(VDF7Sj#H1i3>9138 zkhxAU7;M)I18&d!Yw!V9zQA0tp(G4<8U5GX{YoYCQ?p56FxcD-2FwO5fqyx@__=$L zeK6Sg3>XQv)qz1?zW-k$_j`-)tf+yRU_%fXrenc>$^70d1Q-W?T#vy;6#Y-Q-<2)+ z5iTl6MA7j9m&oBhRXTKr*$3gec z3E;zX457RGZwUvD$l&8e42Qb^cbq>zYy@ive8`2N9vk=#6+AQlZZ7qk=?(ap1q0n0 z{B9Fte-{Gi-Tvax1)M+d1}Fyg@9X~sh1m|hsDcZuYOnxriBPN;z)q3<=-yBN2iM6V A?*IS* literal 0 HcmV?d00001 diff --git a/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties b/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..7d02699a --- /dev/null +++ b/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile new file mode 100644 index 00000000..b86403b6 --- /dev/null +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -0,0 +1,43 @@ +FROM arm64v8/amazonlinux:2 + +RUN yum -y update \ + && yum install -y tar unzip gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \ + less libcurl-devel openssl openssl-devel readline-devel xz-devel \ + zlib-devel glibc-static libcxx libcxx-devel llvm-toolset-7 zlib-static \ + && rm -rf /var/cache/yum + +ENV GRAAL_VERSION 21.0.2 +ENV GRAAL_FOLDERNAME graalvm-community-openjdk-${GRAAL_VERSION} +ENV ARCHITECTURE aarch64 +RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz | tar -xvz +RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm +RUN rm -rf $GRAAL_FOLDERNAME + +# Graal maven plugin requires Maven 3.3.x +ENV MVN_VERSION 3.6.3 +ENV MVN_FOLDERNAME apache-maven-${MVN_VERSION} +ENV MVN_FILENAME apache-maven-${MVN_VERSION}-bin.tar.gz +RUN curl -4 -L https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${MVN_VERSION}/${MVN_FILENAME} | tar -xvz +RUN mv $MVN_FOLDERNAME /usr/lib/maven +RUN rm -rf $MVN_FOLDERNAME + +# Gradle +ENV GRADLE_VERSION 7.4.1 +ENV GRADLE_FOLDERNAME gradle-${GRADLE_VERSION} +ENV GRADLE_FILENAME gradle-${GRADLE_VERSION}-bin.zip +RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip +RUN unzip gradle-${GRADLE_VERSION}-bin.zip +RUN mv $GRADLE_FOLDERNAME /usr/lib/gradle +RUN rm -rf $GRADLE_FOLDERNAME + +VOLUME /project +WORKDIR /project + +#RUN /usr/lib/graalvm/bin/gu install native-image +#RUN ln -s /usr/lib/graalvm/bin/native-image /usr/bin/native-image +RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn +RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle + +ENV JAVA_HOME /usr/lib/graalvm + +WORKDIR /pet-store-native diff --git a/samples/springboot3/pet-store-native/README.md b/samples/springboot3/pet-store-native/README.md new file mode 100644 index 00000000..07eac9c7 --- /dev/null +++ b/samples/springboot3/pet-store-native/README.md @@ -0,0 +1,44 @@ +In this sample, you'll build a native GraalVM image for running web workloads in AWS Lambda. + + +## To build the sample on macOS (Apple silicon arm64) + +You first need to build the function, then you will deploy it to AWS Lambda. + +### Step 1 - Build the native image + +Before starting the build, you must clone or download the code in **function-sample-aws-native**. + +1. Change into the project directory: `samples/springboot3/function-sample-aws-serverless-web-native` +2. Run the following to build a Docker container image which will be used to create the Lambda function zip file. + ``` + docker build -t "al2-graalvm21:native-web" . + ``` +3. Start the container + ``` + docker run -dit -v `pwd`:`pwd` -w `pwd` -v ~/.m2:/root/.m2 al2-graalvm21:native-web + ``` +4. In Docker, open the image terminal. + + > Your working directory should default to the project root. Verify by running `ls` to view the files. + +6. From inside the container, build the Lambda function: + ``` + ./mvnw clean -Pnative native:compile -DskipTests + ``` + +After the build finishes, you need to deploy the function. +You can do it manually or you can use SAM (AWS Serverless Application Model) with the included template.yaml file. +If you chose SAM simply execute the following command. + ``` + sam deploy --guided + ``` + This will deploy your application and will attach an AWS API Gateway +Once the deployment is finished you shouild see the following: +``` +Key ServerlessWebNativeApi +Description URL for application +Value https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/pets +``` + +You can now simply execute GET on this URL and see the listing fo all pets. diff --git a/samples/springboot3/pet-store-native/mvnw b/samples/springboot3/pet-store-native/mvnw new file mode 100755 index 00000000..8d937f4c --- /dev/null +++ b/samples/springboot3/pet-store-native/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/samples/springboot3/pet-store-native/mvnw.cmd b/samples/springboot3/pet-store-native/mvnw.cmd new file mode 100644 index 00000000..f80fbad3 --- /dev/null +++ b/samples/springboot3/pet-store-native/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml new file mode 100644 index 00000000..1c33325e --- /dev/null +++ b/samples/springboot3/pet-store-native/pom.xml @@ -0,0 +1,122 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.2.0-SNAPSHOT + + + com.amazonaws.serverless.sample + pet-store-native + 0.0.1-SNAPSHOT + pet-store-native + Sample of AWS with Spring Native + + 21 + 2022.0.5-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + + + com.amazonaws.serverless + aws-serverless-java-container-springboot3 + 2.0.0-SNAPSHOT + + + com.amazonaws + aws-lambda-java-events + 3.9.0 + + + com.amazonaws + aws-lambda-java-core + 1.1.0 + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + native + + + + org.springframework.boot + spring-boot-maven-plugin + + -agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image/ --enable-preview + + --enable-preview + + + + + org.graalvm.buildtools + native-maven-plugin + + + --enable-url-protocols=http --enable-preview + + + + + + build + + package + + + test + + test + + test + + + + + maven-assembly-plugin + + + native-zip + package + + single + + false + + + + + src/assembly/native.xml + + + + + + + + \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/assembly/java.xml b/samples/springboot3/pet-store-native/src/assembly/java.xml new file mode 100644 index 00000000..bd4961b5 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/assembly/java.xml @@ -0,0 +1,31 @@ + + java-zip + + zip + + + + + target/classes + / + + + src/shell/java + / + true + 0775 + + bootstrap + + + + + + /lib + false + runtime + + + \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/assembly/native.xml b/samples/springboot3/pet-store-native/src/assembly/native.xml new file mode 100644 index 00000000..9bd97a5b --- /dev/null +++ b/samples/springboot3/pet-store-native/src/assembly/native.xml @@ -0,0 +1,29 @@ + + native-zip + + zip + + + + + src/shell/native + / + true + 0775 + + bootstrap + + + + target + / + true + 0775 + + pet-store-native + + + + \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java new file mode 100644 index 00000000..bf53a01f --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java @@ -0,0 +1,12 @@ +package com.amazonaws.serverless.sample.springboot3; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(DemoApplication.class, args); + } +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java new file mode 100644 index 00000000..2c3fcfb0 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java @@ -0,0 +1,17 @@ +package com.amazonaws.serverless.sample.springboot3; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + public HelloController() { + System.out.println("Creating controller"); + } + + @GetMapping("/hello") + public String something(){ + return "Hello World"; + } +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java new file mode 100644 index 00000000..849286fe --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java @@ -0,0 +1,82 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.controller; + + + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import com.amazonaws.serverless.sample.springboot3.model.Pet; +import com.amazonaws.serverless.sample.springboot3.model.PetData; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @PostMapping(path = "/pets") + public Pet createPet(@RequestBody Pet newPet) { + System.out.println("==> Creating Pet: " + newPet); + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @GetMapping(path = "/pets") + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + System.out.println("==> Listing Pets"); + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @GetMapping(path = "/pets/{petId}") + public Pet listPets() { + System.out.println("==> Listing Pets"); + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..d6ccae76 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot3.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java new file mode 100644 index 00000000..320f2158 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java new file mode 100644 index 00000000..4f0c4ba8 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java new file mode 100644 index 00000000..68ea3c18 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot3.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore b/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore new file mode 100644 index 00000000..0726bbaa --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore @@ -0,0 +1 @@ +/native-image/ diff --git a/samples/springboot3/pet-store-native/src/main/resources/application.properties b/samples/springboot3/pet-store-native/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/samples/springboot3/pet-store-native/src/shell/java/bootstrap b/samples/springboot3/pet-store-native/src/shell/java/bootstrap new file mode 100644 index 00000000..4586728a --- /dev/null +++ b/samples/springboot3/pet-store-native/src/shell/java/bootstrap @@ -0,0 +1,7 @@ +#!/bin/sh + +cd ${LAMBDA_TASK_ROOT:-.} + +java -Dspring.main.web-application-type=none -Dlogging.level.org.springframework=DEBUG \ + -noverify -XX:TieredStopAtLevel=1 -Xss256K -XX:MaxMetaspaceSize=128M \ + -cp .:`echo lib/*.jar | tr ' ' :` com.amazonaws.serverless.sample.springboot3.DemoApplication \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/shell/native/bootstrap b/samples/springboot3/pet-store-native/src/shell/native/bootstrap new file mode 100644 index 00000000..0156b090 --- /dev/null +++ b/samples/springboot3/pet-store-native/src/shell/native/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +cd ${LAMBDA_TASK_ROOT:-.} + +./pet-store-native -Dlogging.level.org.springframework=DEBUG -Dlogging.level.com.amazonaws.serverless.proxy.spring=DEBUG diff --git a/samples/springboot3/pet-store-native/template.yaml b/samples/springboot3/pet-store-native/template.yaml new file mode 100644 index 00000000..bb6ace59 --- /dev/null +++ b/samples/springboot3/pet-store-native/template.yaml @@ -0,0 +1,33 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Serverless Java Container GraalVM +Resources: + ServerlessWebNativeFunction: + Type: AWS::Serverless::Function + Properties: + MemorySize: 512 + FunctionName: pet-store-native + Timeout: 15 + CodeUri: ./target/pet-store-native-0.0.1-SNAPSHOT-native-zip.zip + Handler: NOP + Runtime: provided.al2 + Architectures: + - arm64 + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL +Outputs: + ServerlessWebNativeApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: ServerlessWebNativeApi + \ No newline at end of file From 0b9384f40da14066b8121ab3a62d201b4395036f Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 24 Jan 2024 21:50:40 +0100 Subject: [PATCH 0824/1214] Fix gradle file name --- samples/springboot3/alt-pet-store/{build.gradles => build.gradle} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/springboot3/alt-pet-store/{build.gradles => build.gradle} (100%) diff --git a/samples/springboot3/alt-pet-store/build.gradles b/samples/springboot3/alt-pet-store/build.gradle similarity index 100% rename from samples/springboot3/alt-pet-store/build.gradles rename to samples/springboot3/alt-pet-store/build.gradle From cc462ff952ef8d6bb3dc617f0bfb5bbda57ab6c5 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Wed, 24 Jan 2024 13:53:20 -0800 Subject: [PATCH 0825/1214] Deleted unused imports --- samples/springboot3/graphql-pet-store/README.md | 2 +- .../serverless/sample/springboot3/Application.java | 6 ------ samples/springboot3/graphql-pet-store/template.yml | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/samples/springboot3/graphql-pet-store/README.md b/samples/springboot3/graphql-pet-store/README.md index 7d18a0dd..e5bfad12 100644 --- a/samples/springboot3/graphql-pet-store/README.md +++ b/samples/springboot3/graphql-pet-store/README.md @@ -1,4 +1,4 @@ -# Serverless Spring Boot 3 and Spring-graphQl example +# Serverless Spring Boot 3 with GraphQL example A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). Unlike older examples, this example uses the [Spring for GraphQl](https://docs.spring.io/spring-graphql/reference/) library. diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java index 678477a2..9cf0ea61 100644 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java @@ -5,19 +5,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - @SpringBootApplication @Import({ PetsController.class }) diff --git a/samples/springboot3/graphql-pet-store/template.yml b/samples/springboot3/graphql-pet-store/template.yml index c6543b15..ce5dcc6b 100644 --- a/samples/springboot3/graphql-pet-store/template.yml +++ b/samples/springboot3/graphql-pet-store/template.yml @@ -14,7 +14,7 @@ Resources: Handler: com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler::handleRequest Runtime: java21 CodeUri: . - MemorySize: 1512 + MemorySize: 1024 Policies: AWSLambdaBasicExecutionRole Timeout: 60 Events: From ec852727da1c15f5d6e9ad361efdba73bc9bd383 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 09:05:27 +0000 Subject: [PATCH 0826/1214] chore(deps-dev): bump org.apache.httpcomponents.client5:httpclient5 Bumps [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client) from 5.3 to 5.3.1. - [Changelog](https://github.com/apache/httpcomponents-client/blob/rel/v5.3.1/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.3...rel/v5.3.1) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0caa7b78..541d6bcc 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3 + 5.3.1 test From f532873c1c893581cb86f92b7c7464dd756c7486 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 09:05:32 +0000 Subject: [PATCH 0827/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.9.0 to 5.10.0 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.9.0 to 5.10.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.9.0...v5.10.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0caa7b78..04a4b58e 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.16.1 2.0.11 5.10.1 - 5.9.0 + 5.10.0 1.3 UTF-8 From 8f0fc79094c8d7025d47ce21d384b08d871a341e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 13:44:40 +0100 Subject: [PATCH 0828/1214] feat: native Spring Web workloads (#335) - consistent naming --- ...java => AwsSpringHttpProcessingUtils.java} | 44 ++++--------------- .../AwsSpringWebCustomRuntimeEventLoop.java | 4 +- ...va => AwsSpringWebRuntimeInitializer.java} | 4 +- ...pringDelegatingLambdaContainerHandler.java | 2 +- .../main/resources/META-INF/spring.factories | 2 +- ...=> AwsSpringHttpProcessingUtilsTests.java} | 8 ++-- 6 files changed, 18 insertions(+), 46 deletions(-) rename aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/{AWSHttpUtils.java => AwsSpringHttpProcessingUtils.java} (84%) rename aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/{AWSWebRuntimeInitializer.java => AwsSpringWebRuntimeInitializer.java} (92%) rename aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/{AWSHttpUtilsTests.java => AwsSpringHttpProcessingUtilsTests.java} (96%) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java similarity index 84% rename from aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index e19226b8..25a9c9cd 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -30,16 +30,16 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServletRequest; -class AWSHttpUtils { +class AwsSpringHttpProcessingUtils { - private static Log logger = LogFactory.getLog(AWSHttpUtils.class); + private static Log logger = LogFactory.getLog(AwsSpringHttpProcessingUtils.class); - private AWSHttpUtils() { + private AwsSpringHttpProcessingUtils() { } public static AwsProxyResponse processRequest(String gatewayEvent, ServerlessMVC mvc, ObjectMapper mapper, AwsProxyHttpServletResponseWriter responseWriter) { - HttpServletRequest request = AWSHttpUtils.generateHttpServletRequest(gatewayEvent, null, mvc.getServletContext(), mapper); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(gatewayEvent, null, mvc.getServletContext(), mapper); CountDownLatch latch = new CountDownLatch(1); AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch); try { @@ -56,7 +56,7 @@ public static AwsProxyResponse processRequest(String gatewayEvent, ServerlessMVC public static String extractVersion() { try { - String path = AWSHttpUtils.class.getProtectionDomain().getCodeSource().getLocation().toString(); + String path = AwsSpringHttpProcessingUtils.class.getProtectionDomain().getCodeSource().getLocation().toString(); int endIndex = path.lastIndexOf('.'); if (endIndex < 0) { return "UNKNOWN-VERSION"; @@ -94,8 +94,8 @@ public static HttpServletRequest generateHttpServletRequest(String jsonRequest, ? new AwsHttpApiV2SecurityContextWriter() : new AwsProxySecurityContextWriter(); HttpServletRequest httpServletRequest = "2.0".equals(_request.get("version")) - ? AWSHttpUtils.generateRequest2(jsonRequest, lambdaContext, securityWriter, mapper, servletContext) - : AWSHttpUtils.generateRequest1(jsonRequest, lambdaContext, securityWriter, mapper, servletContext); + ? AwsSpringHttpProcessingUtils.generateRequest2(jsonRequest, lambdaContext, securityWriter, mapper, servletContext) + : AwsSpringHttpProcessingUtils.generateRequest1(jsonRequest, lambdaContext, securityWriter, mapper, servletContext); return httpServletRequest; } @@ -155,33 +155,5 @@ private static T readValue(String json, Class clazz, ObjectMapper mapper) throw new IllegalStateException(e); } } - -// public static class ProxyServletConfig implements ServletConfig { -// -// private final ServletContext servletContext; -// -// public ProxyServletConfig(ServletContext servletContext) { -// this.servletContext = servletContext; -// } -// -// @Override -// public String getServletName() { -// return DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME; -// } -// -// @Override -// public ServletContext getServletContext() { -// return this.servletContext; -// } -// -// @Override -// public Enumeration getInitParameterNames() { -// return Collections.enumeration(new ArrayList()); -// } -// -// @Override -// public String getInitParameter(String name) { -// return null; -// } -// } + } diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index 4bb81059..705cc80c 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -57,7 +57,7 @@ public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle private static final String LAMBDA_RUNTIME_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/next"; private static final String LAMBDA_INVOCATION_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/response"; private static final String USER_AGENT_VALUE = String.format("spring-cloud-function/%s-%s", - System.getProperty("java.runtime.version"), AWSHttpUtils.extractVersion()); + System.getProperty("java.runtime.version"), AwsSpringHttpProcessingUtils.extractVersion()); private final ServletWebServerApplicationContext applicationContext; @@ -128,7 +128,7 @@ private void eventLoop(ServletWebServerApplicationContext context) { try { logger.debug("Submitting request to the user's web application"); - AwsProxyResponse awsResponse = AWSHttpUtils.processRequest(incomingEvent.getBody(), mvc, mapper, responseWriter); + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(incomingEvent.getBody(), mvc, mapper, responseWriter); if (logger.isDebugEnabled()) { logger.debug("Received response - body: " + awsResponse.getBody() + "; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders()); diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java similarity index 92% rename from aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java rename to aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java index e6dbd878..4f47121d 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeInitializer.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java @@ -32,9 +32,9 @@ * @author Dave Syer * @author Oleg Zhurakousky */ -public class AWSWebRuntimeInitializer implements ApplicationContextInitializer { +public class AwsSpringWebRuntimeInitializer implements ApplicationContextInitializer { - private static Log logger = LogFactory.getLog(AWSWebRuntimeInitializer.class); + private static Log logger = LogFactory.getLog(AwsSpringWebRuntimeInitializer.class); @Override public void initialize(GenericApplicationContext context) { diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 7bbd8347..47d78fca 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -61,7 +61,7 @@ public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { @Override public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { - HttpServletRequest httpServletRequest = AWSHttpUtils + HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils .generateHttpServletRequest(input, lambdaContext, this.mvc.getServletContext(), this.mapper); CountDownLatch latch = new CountDownLatch(1); AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch); diff --git a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories index a5081995..cd5c2e70 100644 --- a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories +++ b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.context.ApplicationContextInitializer=\ -com.amazonaws.serverless.proxy.spring.AWSWebRuntimeInitializer +com.amazonaws.serverless.proxy.spring.AwsSpringWebRuntimeInitializer diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java similarity index 96% rename from aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java rename to aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 61adfdce..d77322b1 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSHttpUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -30,7 +30,7 @@ import jakarta.servlet.http.HttpServletRequest; -public class AWSHttpUtilsTests { +public class AwsSpringHttpProcessingUtilsTests { private static String API_GATEWAY_EVENT = "{\n" + " \"version\": \"1.0\",\n" @@ -195,7 +195,7 @@ public static Collection data() { public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonEvent.getBytes(StandardCharsets.UTF_8)); ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AWSHttpUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); // spot check some headers assertEquals("curl/7.79.1", request.getHeader("User-Agent")); assertEquals("443", request.getHeader("X-Forwarded-Port")); @@ -207,7 +207,7 @@ public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent @ParameterizedTest public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AWSHttpUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); // spot check some headers assertEquals("curl/7.79.1", request.getHeader("User-Agent")); assertEquals("443", request.getHeader("X-Forwarded-Port")); @@ -221,7 +221,7 @@ public void validateRequestResponse(String jsonEvent) throws Exception { try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context); AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); - AwsProxyResponse awsResponse = AWSHttpUtils.processRequest(jsonEvent, mvc, mapper, responseWriter); + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(jsonEvent, mvc, mapper, responseWriter); assertEquals("hello", awsResponse.getBody()); assertEquals(200, awsResponse.getStatusCode()); } From 1bd5f7241766c715c9966c0f869fd73cbe58b649 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 13:49:13 +0100 Subject: [PATCH 0829/1214] feat: native Spring Web workloads (#335) - polishing --- .../serverless/proxy/spring/AwsSpringHttpProcessingUtils.java | 2 +- .../proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 25a9c9cd..e1bf9fe7 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -132,7 +132,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); - v2Request.getHeaders().forEach((k,v) -> httpRequest.setHeader(k, v)); + v2Request.getHeaders().forEach(httpRequest::setHeader); if (StringUtils.hasText(v2Request.getBody())) { httpRequest.setContentType("application/json"); diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index 705cc80c..7e19683c 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -63,7 +63,7 @@ public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle private volatile boolean running; - private ExecutorService executor = Executors.newSingleThreadExecutor(); + private final ExecutorService executor = Executors.newSingleThreadExecutor(); public AwsSpringWebCustomRuntimeEventLoop(ServletWebServerApplicationContext applicationContext) { this.applicationContext = applicationContext; From 227b2a7654cccf75b368872313e3f2c91f30c05f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 14:06:03 +0100 Subject: [PATCH 0830/1214] feat: native Spring Web workloads (#335) - use newer dependency versions for sample --- samples/springboot3/pet-store-native/pom.xml | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 1c33325e..6ca92120 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.0-SNAPSHOT + 3.2.2 com.amazonaws.serverless.sample @@ -31,12 +31,12 @@ com.amazonaws aws-lambda-java-events - 3.9.0 + 3.11.4 com.amazonaws aws-lambda-java-core - 1.1.0 + 1.2.3 provided @@ -119,4 +119,23 @@ + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + \ No newline at end of file From 01606c1fbcd50b918d95cdc84f0d7056a1d8b889 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 14:07:26 +0100 Subject: [PATCH 0831/1214] feat: native Spring Web workloads (#335) - removed System.out.println in favor of proper logging --- .../proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index 7e19683c..4c3484a2 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -143,9 +143,6 @@ private void eventLoop(ServletWebServerApplicationContext context) { logger.debug("Response sent: body: " + result.getBody() + "; status: " + result.getStatusCode() + "; headers: " + result.getHeaders()); } - System.out.println("==> status " + result.getStatusCode()); - System.out.println("==> body " + result.getBody()); - logger.debug("Response submitted back to the AWS Gateway"); if (logger.isInfoEnabled()) { logger.info("Result POST status: " + result); } From 4ff8c4169a935c7b660cdcf11bb3cdcc585924bd Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 16:18:15 +0100 Subject: [PATCH 0832/1214] feat: native Spring Web workloads (#335) - update sample to Amazon Linux 2023 --- .../springboot3/pet-store-native/Dockerfile | 31 +++++++------------ .../pet-store-native/template.yaml | 2 +- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index b86403b6..d885d926 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -1,25 +1,25 @@ -FROM arm64v8/amazonlinux:2 +FROM public.ecr.aws/amazonlinux/amazonlinux:2023 RUN yum -y update \ - && yum install -y tar unzip gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \ + && yum install -y unzip tar gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \ less libcurl-devel openssl openssl-devel readline-devel xz-devel \ - zlib-devel glibc-static libcxx libcxx-devel llvm-toolset-7 zlib-static \ + zlib-devel glibc-static zlib-static \ && rm -rf /var/cache/yum +# Graal VM ENV GRAAL_VERSION 21.0.2 -ENV GRAAL_FOLDERNAME graalvm-community-openjdk-${GRAAL_VERSION} -ENV ARCHITECTURE aarch64 -RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz | tar -xvz +ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-x64_bin.tar.gz +RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm -RUN rm -rf $GRAAL_FOLDERNAME +ENV JAVA_HOME /usr/lib/graalvm -# Graal maven plugin requires Maven 3.3.x -ENV MVN_VERSION 3.6.3 +# Maven +ENV MVN_VERSION 3.9.6 ENV MVN_FOLDERNAME apache-maven-${MVN_VERSION} ENV MVN_FILENAME apache-maven-${MVN_VERSION}-bin.tar.gz -RUN curl -4 -L https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${MVN_VERSION}/${MVN_FILENAME} | tar -xvz +RUN curl -4 -L https://archive.apache.org/dist/maven/maven-3/${MVN_VERSION}/binaries/${MVN_FILENAME} | tar -xvz RUN mv $MVN_FOLDERNAME /usr/lib/maven -RUN rm -rf $MVN_FOLDERNAME +RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn # Gradle ENV GRADLE_VERSION 7.4.1 @@ -28,16 +28,9 @@ ENV GRADLE_FILENAME gradle-${GRADLE_VERSION}-bin.zip RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip RUN unzip gradle-${GRADLE_VERSION}-bin.zip RUN mv $GRADLE_FOLDERNAME /usr/lib/gradle -RUN rm -rf $GRADLE_FOLDERNAME +RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle VOLUME /project WORKDIR /project -#RUN /usr/lib/graalvm/bin/gu install native-image -#RUN ln -s /usr/lib/graalvm/bin/native-image /usr/bin/native-image -RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn -RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle - -ENV JAVA_HOME /usr/lib/graalvm - WORKDIR /pet-store-native diff --git a/samples/springboot3/pet-store-native/template.yaml b/samples/springboot3/pet-store-native/template.yaml index bb6ace59..e081c771 100644 --- a/samples/springboot3/pet-store-native/template.yaml +++ b/samples/springboot3/pet-store-native/template.yaml @@ -10,7 +10,7 @@ Resources: Timeout: 15 CodeUri: ./target/pet-store-native-0.0.1-SNAPSHOT-native-zip.zip Handler: NOP - Runtime: provided.al2 + Runtime: provided.al2023 Architectures: - arm64 Events: From 9be742ab075cdee6f9ad62e3894b90c432678625 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 25 Jan 2024 16:47:17 +0100 Subject: [PATCH 0833/1214] feat: native Spring Web workloads (#335) - update README for sample --- samples/springboot3/pet-store-native/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/springboot3/pet-store-native/README.md b/samples/springboot3/pet-store-native/README.md index 07eac9c7..831353e5 100644 --- a/samples/springboot3/pet-store-native/README.md +++ b/samples/springboot3/pet-store-native/README.md @@ -7,9 +7,9 @@ You first need to build the function, then you will deploy it to AWS Lambda. ### Step 1 - Build the native image -Before starting the build, you must clone or download the code in **function-sample-aws-native**. +Before starting the build, you must clone or download the code in **pet-store-native**. -1. Change into the project directory: `samples/springboot3/function-sample-aws-serverless-web-native` +1. Change into the project directory: `samples/springboot3/pet-store-native` 2. Run the following to build a Docker container image which will be used to create the Lambda function zip file. ``` docker build -t "al2-graalvm21:native-web" . From cb178853f6e9bf0f0f4e0b0c6cd43c35e32bee0e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 Jan 2024 09:08:43 +0100 Subject: [PATCH 0834/1214] feat: native Spring Web workloads (#335) - use latest runtime version --- samples/springboot3/alt-pet-store/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/alt-pet-store/template.yml b/samples/springboot3/alt-pet-store/template.yml index 8a51c8d1..c883f085 100644 --- a/samples/springboot3/alt-pet-store/template.yml +++ b/samples/springboot3/alt-pet-store/template.yml @@ -14,7 +14,7 @@ Resources: # AutoPublishAlias: bcn FunctionName: pet-store-boot-3 Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest - Runtime: java17 + Runtime: java21 SnapStart: ApplyOn: PublishedVersions CodeUri: . From 3ef9aab69464519abce3158f4e93713540b56e24 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 Jan 2024 11:04:24 +0100 Subject: [PATCH 0835/1214] feat: native Spring Web workloads (#335) - native and non-native Handler should use same processing logic --- .../proxy/AsyncInitializationWrapper.java | 2 +- .../spring/AwsSpringHttpProcessingUtils.java | 10 +++++++--- .../AwsSpringWebCustomRuntimeEventLoop.java | 6 ++++-- .../SpringDelegatingLambdaContainerHandler.java | 16 +++------------- .../AwsSpringHttpProcessingUtilsTests.java | 4 +++- 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index f5264e5f..b6b9b037 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -47,7 +47,7 @@ public class AsyncInitializationWrapper extends InitializationWrapper { private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND); private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault( INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS))); - public static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; + private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; private CountDownLatch initializationLatch; private final long actualStartTime; diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index e1bf9fe7..d268bd2e 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -33,18 +33,22 @@ class AwsSpringHttpProcessingUtils { private static Log logger = LogFactory.getLog(AwsSpringHttpProcessingUtils.class); + private static final int LAMBDA_MAX_REQUEST_DURATION_MINUTES = 15; private AwsSpringHttpProcessingUtils() { } - public static AwsProxyResponse processRequest(String gatewayEvent, ServerlessMVC mvc, ObjectMapper mapper, AwsProxyHttpServletResponseWriter responseWriter) { - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(gatewayEvent, null, mvc.getServletContext(), mapper); + public static AwsProxyResponse processRequest(HttpServletRequest request, ServerlessMVC mvc, + AwsProxyHttpServletResponseWriter responseWriter) { CountDownLatch latch = new CountDownLatch(1); AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch); try { mvc.service(request, response); - latch.await(AsyncInitializationWrapper.LAMBDA_MAX_INIT_TIME_MS, TimeUnit.SECONDS); + boolean requestTimedOut = !latch.await(LAMBDA_MAX_REQUEST_DURATION_MINUTES, TimeUnit.MINUTES); // timeout is potentially lower as user configures it + if (requestTimedOut) { + logger.warn("request timed out after " + LAMBDA_MAX_REQUEST_DURATION_MINUTES + " minutes"); + } AwsProxyResponse awsResponse = responseWriter.writeResponse(response, null); return awsResponse; } diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index 4c3484a2..db71d56c 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -127,8 +127,10 @@ private void eventLoop(ServletWebServerApplicationContext context) { try { logger.debug("Submitting request to the user's web application"); - - AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(incomingEvent.getBody(), mvc, mapper, responseWriter); + + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( + AwsSpringHttpProcessingUtils.generateHttpServletRequest(incomingEvent.getBody(), + null, mvc.getServletContext(), mapper), mvc, responseWriter); if (logger.isDebugEnabled()) { logger.debug("Received response - body: " + awsResponse.getBody() + "; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders()); diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 47d78fca..f1a3b526 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -3,13 +3,11 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import org.springframework.cloud.function.serverless.web.FunctionClassUtils; import org.springframework.cloud.function.serverless.web.ServerlessMVC; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestStreamHandler; @@ -63,15 +61,7 @@ public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils .generateHttpServletRequest(input, lambdaContext, this.mvc.getServletContext(), this.mapper); - CountDownLatch latch = new CountDownLatch(1); - AwsHttpServletResponse httpServletResponse = new AwsHttpServletResponse(httpServletRequest, latch); - try { - this.mvc.service(httpServletRequest, httpServletResponse); - latch.await(10, TimeUnit.SECONDS); - this.mapper.writeValue(output, responseWriter.writeResponse(httpServletResponse, lambdaContext)); - } - catch (Exception e) { - throw new IllegalStateException(e); - } + AwsProxyResponse awsProxyResponse = AwsSpringHttpProcessingUtils.processRequest(httpServletRequest, mvc, responseWriter); + this.mapper.writeValue(output, awsProxyResponse); } } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index d77322b1..a04361e7 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -221,7 +221,9 @@ public void validateRequestResponse(String jsonEvent) throws Exception { try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context); AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); - AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest(jsonEvent, mvc, mapper, responseWriter); + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( + AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, + mvc.getServletContext(), mapper), mvc, responseWriter); assertEquals("hello", awsResponse.getBody()); assertEquals(200, awsResponse.getStatusCode()); } From c21a826a9b9409689586243f52e2a87b164405b0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 Jan 2024 11:24:57 +0100 Subject: [PATCH 0836/1214] feat: native Spring Web workloads (#335) - add -march=compatibility to avoid infrequent CPU features error --- samples/springboot3/pet-store-native/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 6ca92120..c02774bb 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -78,7 +78,7 @@ native-maven-plugin - --enable-url-protocols=http --enable-preview + --enable-url-protocols=http --enable-preview -march=compatibility From 1fa314ba6f020029cb81bd37cd2827f52d20684f Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sat, 27 Jan 2024 01:31:09 +0900 Subject: [PATCH 0837/1214] Refactor Dispatch Start Check for Atomicity --- .../serverless/proxy/internal/servlet/AwsAsyncContext.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java index 98e7ef8e..d64af896 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsAsyncContext.java @@ -69,12 +69,11 @@ public boolean hasOriginalRequestAndResponse() { @Override public void dispatch() { log.debug("Dispatching request"); + if (dispatched.get()) { throw new IllegalStateException("Dispatching already started"); } - if (!dispatchStarted.get()) { - dispatchStarted.set(true); - } else { + if (dispatchStarted.getAndSet(true)) { dispatched.set(true); notifyListeners(NotificationType.START_ASYNC, null); } From 16cce27e23bf55bdc153ace416cbf8f18240cb78 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 Jan 2024 18:16:20 +0100 Subject: [PATCH 0838/1214] chore: don't run dependency check everytime (NVD API limits) but using CI instead --- .../workflows/continuous-integration-workflow.yml | 13 +++++++++++++ aws-serverless-java-container-core/pom.xml | 7 ------- aws-serverless-java-container-jersey/pom.xml | 7 ------- aws-serverless-java-container-spring/pom.xml | 7 ------- aws-serverless-java-container-springboot3/pom.xml | 7 ------- 5 files changed, 13 insertions(+), 28 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index b0acd32a..cca7cfe7 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -94,3 +94,16 @@ jobs: # - uses: actions/checkout@v3 # - name: Build latest # run: ./gha_build.sh struts true true + + owasp-dependency-check: + name: Verify dependencies with OWASP checker + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 + - name: Build latest + run: mvn -q org.owasp:dependency-check-maven:check \ No newline at end of file diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 2a290f85..77417a01 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -160,13 +160,6 @@ 7 false - - - - check - - - diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 4bc7456e..926e8df7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -198,13 +198,6 @@ 7 false - - - - check - - - diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5a5ff547..776c720c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -241,13 +241,6 @@ 7 false - - - - check - - - diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 9b4d941c..42a1edf7 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -276,13 +276,6 @@ 7 false - - - - check - - - From e1acefc727741e0ae0e9c4d34ce52afd41b7265e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 26 Jan 2024 20:48:13 +0100 Subject: [PATCH 0839/1214] chore: don't run dependency check everytime (NVD API limits) but using CI instead --- .../continuous-integration-workflow.yml | 15 +-------------- .github/workflows/owasp-dependency-check.yml | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/owasp-dependency-check.yml diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index cca7cfe7..fec3f5ca 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -93,17 +93,4 @@ jobs: # steps: # - uses: actions/checkout@v3 # - name: Build latest -# run: ./gha_build.sh struts true true - - owasp-dependency-check: - name: Verify dependencies with OWASP checker - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - distribution: 'corretto' - java-version: 17 - - name: Build latest - run: mvn -q org.owasp:dependency-check-maven:check \ No newline at end of file +# run: ./gha_build.sh struts true true \ No newline at end of file diff --git a/.github/workflows/owasp-dependency-check.yml b/.github/workflows/owasp-dependency-check.yml new file mode 100644 index 00000000..fa265774 --- /dev/null +++ b/.github/workflows/owasp-dependency-check.yml @@ -0,0 +1,18 @@ +name: OWASP dependency check +on: + schedule: + - cron: "10 10 * * 3" + +jobs: + owasp-dependency-check: + name: Verify dependencies with OWASP checker + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 + - name: Build latest + run: mvn -q package org.owasp:dependency-check-maven:check \ No newline at end of file From 4533c4be0338b136687f85e234bdb3a6a62cbe23 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 30 Jan 2024 07:42:52 +0100 Subject: [PATCH 0840/1214] feat: native Spring Web workloads (#335) - use spring-cloud-function-serverless-web 4.0.6 release --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 3b3cbd2b..b6b9c749 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.0.6-SNAPSHOT + 4.0.6 com.amazonaws.serverless From 948f76c57de10d3887b93df83b446c1963ef5238 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 30 Jan 2024 08:00:09 +0100 Subject: [PATCH 0841/1214] chore(deps): use ${springboot.version} for spring-boot-starter-data-jpa --- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 96518a79..ecd0d6ab 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -194,7 +194,7 @@ org.springframework.boot spring-boot-starter-data-jpa - 3.2.1 + ${springboot.version} test @@ -326,8 +326,8 @@ org.apache.maven.plugins maven-compiler-plugin - 10 - 10 + 17 + 17 From 58b296fb49c403aacef133ffe483eff2d4c2a6e7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 30 Jan 2024 11:41:27 +0100 Subject: [PATCH 0842/1214] refactor: extract InitializableLambdaContainerHandler interface to be used by SpringDelegatingLambdaContainerHandler later on --- .../proxy/AsyncInitializationWrapper.java | 16 +++++----- .../proxy/InitializationWrapper.java | 8 ++--- .../InitializableLambdaContainerHandler.java | 31 +++++++++++++++++++ .../internal/LambdaContainerHandler.java | 3 +- 4 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/InitializableLambdaContainerHandler.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index b6b9b037..57f4e8a0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -13,7 +13,7 @@ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.InitializableLambdaContainerHandler; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.slf4j.Logger; @@ -26,10 +26,10 @@ /** * An async implementation of the InitializationWrapper interface. This initializer calls the - * {@link LambdaContainerHandler#initialize()} in a separate thread. Then uses a latch to wait for the maximum Lambda + * {@link InitializableLambdaContainerHandler#initialize()} in a separate thread. Then uses a latch to wait for the maximum Lambda * initialization time of 10 seconds, if the initialize method takes longer than 10 seconds to return, the - * {@link #start(LambdaContainerHandler)} returns control to the caller and lets the initialization thread continue in - * the background. The {@link LambdaContainerHandler#proxy(Object, Context)} automatically waits for the latch of the + * {@link #start(InitializableLambdaContainerHandler)} returns control to the caller and lets the initialization thread continue in + * the background. The {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler#proxy(Object, Context)} automatically waits for the latch of the * initializer to be released. * * The constructor of this class expects an epoch long. This is meant to be as close as possible to the time the Lambda @@ -72,7 +72,7 @@ public AsyncInitializationWrapper() { } @Override - public void start(LambdaContainerHandler handler) throws ContainerInitializationException { + public void start(InitializableLambdaContainerHandler handler) throws ContainerInitializationException { if(ASYNC_INIT_DISABLED){ log.info("Async init disabled due to \"{}\" initialization", INITIALIZATION_TYPE); super.start(handler); @@ -107,18 +107,18 @@ public long getActualStartTimeMs() { @Override public CountDownLatch getInitializationLatch() { - if(ASYNC_INIT_DISABLED){ + if (ASYNC_INIT_DISABLED){ return super.getInitializationLatch(); } return initializationLatch; } private static class AsyncInitializer implements Runnable { - private LambdaContainerHandler handler; + private final InitializableLambdaContainerHandler handler; private CountDownLatch initLatch; private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); - AsyncInitializer(CountDownLatch latch, LambdaContainerHandler h) { + AsyncInitializer(CountDownLatch latch, InitializableLambdaContainerHandler h) { initLatch = latch; handler = h; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java index f7c96f8f..a261b6cc 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationWrapper.java @@ -13,13 +13,13 @@ package com.amazonaws.serverless.proxy; import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.InitializableLambdaContainerHandler; import java.util.concurrent.CountDownLatch; /** - * This class is in charge of initializing a {@link LambdaContainerHandler}. - * In most cases, this means calling the {@link LambdaContainerHandler#initialize()} method. Some implementations may + * This class is in charge of initializing a {@link InitializableLambdaContainerHandler}. + * In most cases, this means calling the {@link InitializableLambdaContainerHandler#initialize()} method. Some implementations may * require additional initialization steps, in this case implementations should provide their own * InitializationWrapper. This library includes an async implementation of this class * {@link AsyncInitializationWrapper} for frameworks that are likely to take longer than 10 seconds to start. @@ -31,7 +31,7 @@ public class InitializationWrapper { * @param handler The container handler to be initializer * @throws ContainerInitializationException If anything goes wrong during container initialization. */ - public void start(LambdaContainerHandler handler) throws ContainerInitializationException { + public void start(InitializableLambdaContainerHandler handler) throws ContainerInitializationException { handler.initialize(); } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/InitializableLambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/InitializableLambdaContainerHandler.java new file mode 100644 index 00000000..daf4a69d --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/InitializableLambdaContainerHandler.java @@ -0,0 +1,31 @@ +/* + * Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.internal; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; + +/** + * Interface to define initialization/ cold-start related methods. + * See also the documentation for + * + * AWS Lambda Execution Environments. + */ +public interface InitializableLambdaContainerHandler { + + /** + * This method is called on the first (cold) invocation + * + * @throws ContainerInitializationException in case initialization fails + */ + void initialize() throws ContainerInitializationException; +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index f1425160..ff978456 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -45,7 +45,8 @@ * @param The request type for the wrapped Java container * @param The response or response writer type for the wrapped Java container */ -public abstract class LambdaContainerHandler { +public abstract class LambdaContainerHandler + implements InitializableLambdaContainerHandler { //------------------------------------------------------------- // Constants From 88f6e4aa07b3cecf644bb4c0d96f366f10a03377 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 30 Jan 2024 15:27:39 +0100 Subject: [PATCH 0843/1214] GH-754 Fix request parameter parsing While concentrating on REST we somehow ignored standard request parameters. This fix addresses it for both v1 and v2 requests as well as adds tests and additional endpoint to a sample to verify Resolves #754 polishing --- .../spring/AwsSpringHttpProcessingUtils.java | 22 ++++++++++++++++- ...DelegatingLambdaContainerHandlerTests.java | 24 ++++++++++++++++++- .../spring/servletapp/ServletApplication.java | 18 ++++++++++++-- samples/springboot3/alt-pet-store/README.md | 19 ++++++++++++++- .../controller/PetsController.java | 13 ++++++++++ 5 files changed, 91 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index d268bd2e..c7e507f3 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -2,7 +2,10 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.Iterator; import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -10,6 +13,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.serverless.web.ServerlessHttpServletRequest; import org.springframework.cloud.function.serverless.web.ServerlessMVC; +import org.springframework.util.CollectionUtils; import org.springframework.util.FileCopyUtils; import org.springframework.util.MultiValueMapAdapter; import org.springframework.util.StringUtils; @@ -109,6 +113,9 @@ private static HttpServletRequest generateRequest1(String request, Context lambd AwsProxyRequest v1Request = readValue(request, AwsProxyRequest.class, mapper); ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v1Request.getHttpMethod(), v1Request.getPath()); + + populateQueryStringparameters(v1Request.getQueryStringParameters(), httpRequest); + if (v1Request.getMultiValueHeaders() != null) { MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); httpRequest.setHeaders(headers); @@ -128,16 +135,21 @@ private static HttpServletRequest generateRequest1(String request, Context lambd securityWriter.writeSecurityContext(v1Request, lambdaContext)); return httpRequest; } + + @SuppressWarnings({ "rawtypes", "unchecked" }) private static HttpServletRequest generateRequest2(String request, Context lambdaContext, SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { HttpApiV2ProxyRequest v2Request = readValue(request, HttpApiV2ProxyRequest.class, mapper); + + ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); + populateQueryStringparameters(v2Request.getQueryStringParameters(), httpRequest); v2Request.getHeaders().forEach(httpRequest::setHeader); - + if (StringUtils.hasText(v2Request.getBody())) { httpRequest.setContentType("application/json"); httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); @@ -151,6 +163,14 @@ private static HttpServletRequest generateRequest2(String request, Context lambd return httpRequest; } + private static void populateQueryStringparameters(Map requestParameters, ServerlessHttpServletRequest httpRequest) { + if (!CollectionUtils.isEmpty(requestParameters)) { + for (Entry entry : requestParameters.entrySet()) { + httpRequest.setParameter(entry.getKey(), entry.getValue()); + } + } + } + private static T readValue(String json, Class clazz, ObjectMapper mapper) { try { return mapper.readValue(json, clazz); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index dabc30e2..ff1f209b 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -13,6 +13,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.cloud.function.serverless.web.ServerlessServletContext; import org.springframework.util.CollectionUtils; import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; @@ -72,12 +73,16 @@ public class SpringDelegatingLambdaContainerHandlerTests { + " },\n" + " \"queryStringParameters\": {\n" + " \"abc\": \"xyz\",\n" + + " \"name\": \"Ricky\",\n" + " \"foo\": \"baz\"\n" + " },\n" + " \"multiValueQueryStringParameters\": {\n" + " \"abc\": [\n" + " \"xyz\"\n" + " ],\n" + + " \"name\": [\n" + + " \"Ricky\"\n" + + " ],\n" + " \"foo\": [\n" + " \"bar\",\n" + " \"baz\"\n" @@ -124,7 +129,7 @@ public class SpringDelegatingLambdaContainerHandlerTests { " \"version\": \"2.0\",\n" + " \"routeKey\": \"$default\",\n" + " \"rawPath\": \"/my/path\",\n" + - " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2&name=Ricky¶meter2=value\",\n" + " \"cookies\": [\n" + " \"cookie1\",\n" + " \"cookie2\"\n" + @@ -135,6 +140,7 @@ public class SpringDelegatingLambdaContainerHandlerTests { " },\n" + " \"queryStringParameters\": {\n" + " \"parameter1\": \"value1,value2\",\n" + + " \"name\": \"Ricky\",\n" + " \"parameter2\": \"value\"\n" + " },\n" + " \"requestContext\": {\n" + @@ -202,6 +208,22 @@ public static Collection data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); } + @MethodSource("data") + @ParameterizedTest + public void validateComplesrequest(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", + "/foo/male/list/24", "{\"name\":\"bob\"}", null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + String[] respponseBody = ((String) result.get("body")).split("/"); + assertEquals("male", respponseBody[0]); + assertEquals("24", respponseBody[1]); + assertEquals("Ricky", respponseBody[2]); + } + @MethodSource("data") @ParameterizedTest public void testAsyncPost(String jsonEvent) throws Exception { diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java index 0cb001ed..9f01859a 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -1,9 +1,13 @@ package com.amazonaws.serverless.proxy.spring.servletapp; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; @SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, @@ -14,5 +18,15 @@ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class }) @Import(MessageController.class) +@RestController public class ServletApplication { + + @RequestMapping(path = "/foo/{gender}/list/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + public String complexRequest( + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name + ) { + return gender + "/" + age + "/" + name; + } } diff --git a/samples/springboot3/alt-pet-store/README.md b/samples/springboot3/alt-pet-store/README.md index d8cf8383..b91cd42f 100644 --- a/samples/springboot3/alt-pet-store/README.md +++ b/samples/springboot3/alt-pet-store/README.md @@ -36,4 +36,21 @@ PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-w --------------------------------------------------------------------------------------------------------- $ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets -``` \ No newline at end of file +``` + +You can also try a complex request passing both path and request parameters to complex endpoint such as this: + + +``` +@RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) +public String complexRequest(@RequestBody String body, + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name +) +``` +For example. + +``` +curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST https://zuhd709386.execute-api.us-east-2.amazonaws.com/foo/male/bar/25?name=Ricky +``` diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java index 680e629d..769db35f 100644 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java @@ -17,6 +17,8 @@ import com.amazonaws.serverless.sample.springboot3.model.Pet; import com.amazonaws.serverless.sample.springboot3.model.PetData; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -32,6 +34,7 @@ @RestController @EnableWebMvc public class PetsController { + @RequestMapping(path = "/pets", method = RequestMethod.POST) public Pet createPet(@RequestBody Pet newPet) { if (newPet.getName() == null || newPet.getBreed() == null) { @@ -73,5 +76,15 @@ public Pet listPets() { newPet.setName(PetData.getRandomName()); return newPet; } + + @RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + public String complexRequest(@RequestBody String body, + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name + ) { + System.out.println("Body: " + body + " - " + gender + "/" + age + "/" + name); + return gender + "/" + age + "/" + name; + } } From 9c181eccdf4613aeee16c44e327df1f5169b448e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Jan 2024 07:18:41 +0000 Subject: [PATCH 0844/1214] chore(deps-dev): bump com.h2database:h2 from 2.2.222 to 2.2.224 Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.2.222 to 2.2.224. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-2.2.222...version-2.2.224) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index ecd0d6ab..93373d31 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -226,7 +226,7 @@ com.h2database h2 - 2.2.222 + 2.2.224 test From 316c7a4094a5c066f07ca98ef24f00d6d432eb83 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 10:47:40 +0100 Subject: [PATCH 0845/1214] chore: add new samples to dependabot config --- .github/dependabot.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 81c89630..7633e763 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -25,6 +25,26 @@ updates: directory: "/samples/springboot3/pet-store" schedule: interval: "weekly" + - package-ecosystem: maven + directory: "/samples/springboot3/alt-pet-store" + schedule: + interval: "weekly" + - package-ecosystem: gradle + directory: "/samples/springboot3/alt-pet-store" + schedule: + interval: "weekly" + - package-ecosystem: maven + directory: "/samples/springboot3/graphql-pet-store" + schedule: + interval: "weekly" + - package-ecosystem: maven + directory: "/samples/springboot3/pet-store-native" + schedule: + interval: "weekly" + - package-ecosystem: gradle + directory: "/samples/springboot3/pet-store-native" + schedule: + interval: "weekly" - package-ecosystem: maven directory: "/samples/jersey/pet-store" schedule: From 5da788a70f84a14df1aace1693d5fce2f49297b0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 10:57:40 +0100 Subject: [PATCH 0846/1214] chore: modify CI build to check for backwards compatibility --- .../continuous-integration-workflow.yml | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index fec3f5ca..2718637a 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -58,12 +58,8 @@ jobs: java-version: 17 - name: Build latest run: ./gha_build.sh spring true true -# - name: Build Spring 5.0 -# run: ./gha_build.sh spring false false -Dspring.version=5.0.20.RELEASE -Dspring-security.version=5.0.19.RELEASE -Ddependency-check.skip=true -# - name: Build Spring 5.1 -# run: ./gha_build.sh spring false false -Dspring.version=5.1.20.RELEASE -Dspring-security.version=5.1.13.RELEASE -Ddependency-check.skip=true -# - name: Build Spring 5.2 -# run: ./gha_build.sh spring false false -Dspring.version=5.2.21.RELEASE -Dspring-security.version=5.2.15.RELEASE -Ddependency-check.skip=true + - name: Build with Spring 6.0.x + run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.6 -Ddependency-check.skip=true build_springboot3: name: Build and test SpringBoot 3 @@ -77,20 +73,14 @@ jobs: java-version: 17 - name: Build latest run: ./gha_build.sh springboot3 true true - # https://github.com/spring-projects/spring-boot/wiki/Supported-Versions -# - name: Build Spring Boot 2.2 -# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.2.13.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.2.8.RELEASE -Ddependency-check.skip=true -# - name: Build Spring Boot 2.3 -# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.3.12.RELEASE -Dspring.version=5.2.15.RELEASE -Dspringsecurity.version=5.3.9.RELEASE -Ddependency-check.skip=true -# - name: Build Spring Boot 2.4 -# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.4.13 -Dspring.version=5.3.13 -Dspringsecurity.version=5.4.9 -Ddependency-check.skip=true -# - name: Build Spring Boot 2.5 -# run: ./gha_build.sh springboot2 false false -Dspringboot.version=2.5.14 -Dspring.version=5.3.20 -Dspringsecurity.version=5.5.8 -Ddependency-check.skip=true + # Build with additional supported versions https://spring.io/projects/spring-boot#support + - name: Build with Spring Boot 3.1.x + run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.1.8 -Dspring.version=6.0.16 -Dspringsecurity.version=6.1.6 -Ddependency-check.skip=true -# build_struts2: -# name: Build and test Struts -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v3 -# - name: Build latest -# run: ./gha_build.sh struts true true \ No newline at end of file + build_struts2: + name: Build and test Struts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Build latest + run: ./gha_build.sh struts true true \ No newline at end of file From 638fc69e3595bb097b7e8b3b1f2a5ac7a2fa8b6f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 11:04:03 +0100 Subject: [PATCH 0847/1214] chore: modify CI build to include all samples --- gha_build.sh | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/gha_build.sh b/gha_build.sh index 036ac4be..f89c6110 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -51,10 +51,6 @@ function archetype { if [[ "$?" -ne 0 ]]; then exit 1 fi -# cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew wrapper --gradle-version 5.0 -# if [[ "$?" -ne 0 ]]; then -# exit 1 -# fi cd ${ARCHETYPE_TEST_DIR}/${PROJ_NAME} && ./gradlew -q clean build if [[ "$?" -ne 0 ]]; then exit 1 @@ -62,24 +58,21 @@ function archetype { } function sample { - # force to pet store for now. In the future we may loop over all samples - SAMPLE_FOLDER=${WORKING_DIR}/samples/$1/pet-store - cd ${SAMPLE_FOLDER} && mvn -q clean package - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - cd ${SAMPLE_FOLDER} && gradle -q wrapper - if [[ "$?" -ne 0 ]]; then - exit 1 - fi -# cd ${SAMPLE_FOLDER} && ./gradlew wrapper --gradle-version 5.0 -# if [[ "$?" -ne 0 ]]; then -# exit 1 -# fi - cd ${SAMPLE_FOLDER} && ./gradlew -q clean build - if [[ "$?" -ne 0 ]]; then - exit 1 - fi + for d in ${WORKING_DIR}/samples/$1/*/ ; do + SAMPLE_FOLDER="$d" + cd ${SAMPLE_FOLDER} && mvn -q clean package + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && gradle -q wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && ./gradlew -q clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + done } # set up the master pom otherwise we won't be able to find new dependencies From f5c679199852091daf44d37d240c10b2c498d240 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 11:28:14 +0100 Subject: [PATCH 0848/1214] chore: modify CI build to check for backwards compatibility --- .github/workflows/continuous-integration-workflow.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2718637a..c304624f 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -58,8 +58,8 @@ jobs: java-version: 17 - name: Build latest run: ./gha_build.sh spring true true - - name: Build with Spring 6.0.x - run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.6 -Ddependency-check.skip=true +# - name: Build with Spring 6.0.x +# run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.6 -Ddependency-check.skip=true build_springboot3: name: Build and test SpringBoot 3 @@ -82,5 +82,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 - name: Build latest run: ./gha_build.sh struts true true \ No newline at end of file From db50d8a688c81147916ec4be671faa7807bd9b4d Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 11:30:05 +0100 Subject: [PATCH 0849/1214] chore(deps): use Spring Cloud release BOM instead of SNAPSHOT --- samples/springboot3/pet-store-native/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index c02774bb..6d69941b 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -16,7 +16,7 @@ Sample of AWS with Spring Native 21 - 2022.0.5-SNAPSHOT + 2022.0.5 From 803230cf38ac8f122e3aae6b00e7e9d82777109f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 11:36:34 +0100 Subject: [PATCH 0850/1214] chore: use Java 17 as compilation baseline (no 21 features in use) --- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 35535e2a..ed781b9e 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -25,7 +25,7 @@ - 21 + 17 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 6d69941b..2348fb8d 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -15,7 +15,7 @@ pet-store-native Sample of AWS with Spring Native - 21 + 17 2022.0.5 From 928d826f094c93b274d52027b2a03fc733f9cfcf Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 14:32:44 +0100 Subject: [PATCH 0851/1214] chore: modify CI build to make gradle optional --- gha_build.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/gha_build.sh b/gha_build.sh index f89c6110..247e0910 100755 --- a/gha_build.sh +++ b/gha_build.sh @@ -64,13 +64,15 @@ function sample { if [[ "$?" -ne 0 ]]; then exit 1 fi - cd ${SAMPLE_FOLDER} && gradle -q wrapper - if [[ "$?" -ne 0 ]]; then - exit 1 - fi - cd ${SAMPLE_FOLDER} && ./gradlew -q clean build - if [[ "$?" -ne 0 ]]; then - exit 1 + if [ -n "$(find ${SAMPLE_FOLDER} -name '*gradle*' | head -1)" ]; then + cd ${SAMPLE_FOLDER} && gradle -q wrapper + if [[ "$?" -ne 0 ]]; then + exit 1 + fi + cd ${SAMPLE_FOLDER} && ./gradlew -q clean build + if [[ "$?" -ne 0 ]]; then + exit 1 + fi fi done } From 87076f2d802b7ec806d1c4ef8f4f2970122af3d4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 14:37:34 +0100 Subject: [PATCH 0852/1214] chore: modify CI build for Struts (not released at the moment) --- .github/workflows/continuous-integration-workflow.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index c304624f..741ef5c2 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -88,4 +88,6 @@ jobs: distribution: 'corretto' java-version: 17 - name: Build latest - run: ./gha_build.sh struts true true \ No newline at end of file + run: ./gha_build.sh struts false false +# temporarily disabled archetype and samples as Struts is not released at the moment +# run: ./gha_build.sh struts true true \ No newline at end of file From a3c4b69e68786225f8ae7e0ab12f8e1e4e3c6209 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 31 Jan 2024 14:59:20 +0100 Subject: [PATCH 0853/1214] chore: don't run dependency check everytime (NVD API limits) but using CI instead --- aws-serverless-java-container-struts/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index 0cd2a4aa..beed495f 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -195,13 +195,6 @@ 7 false - - - - check - - - From 96e8253922eb266d176197789f64e3773ffc060a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Feb 2024 06:49:17 +0100 Subject: [PATCH 0854/1214] chore(deps): update JUnit to 5.10.2, closes #759 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index ad5acbac..b23f0b90 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.10.1")) + testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index d5f7c0c7..a5214164 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.5 2.16.1 - 5.10.1 + 5.10.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1f1d1af7..d26a9630 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.10.1")) + testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 5aa0330b..48ce0a0d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.1.3 - 5.10.1 + 5.10.2 2.22.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 2f2ebee1..2eff2449 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.10.1")) + testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index f990dda8..ef49a79f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.10.1 + 5.10.2 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index c579ff71..80391377 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -43,7 +43,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") - testImplementation(platform("org.junit:junit-bom:5.10.1")) + testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M1') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 30ec31d7..91b764f0 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 7.0.0-M1 2.16.1 - 5.10.1 + 5.10.2 2.22.1 diff --git a/pom.xml b/pom.xml index 0c1dac88..74f0bbc3 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 9.0.9 2.16.1 2.0.11 - 5.10.1 + 5.10.2 5.10.0 1.3 UTF-8 From eae6ce8fa9b2d4f94cd6e1a5293ad721e8f7b45a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Feb 2024 07:00:58 +0100 Subject: [PATCH 0855/1214] chore(deps): update Struts to 7.0.0-M2 for testing --- aws-serverless-java-container-struts/pom.xml | 12 +----------- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 22 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index beed495f..d04470e6 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 7.0.0-M1 + 7.0.0-M2 @@ -38,16 +38,6 @@ org.apache.struts struts2-core ${struts.version} - - - org.apache.commons - commons-fileupload2-jakarta - - - commons-io - commons-io - - org.apache.struts diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 80391377..499ede04 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M1') { + implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M1') { + implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M1') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M2') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:7.0.0-M1') { + implementation ('org.apache.struts:struts2-core:7.0.0-M2') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M1') { + testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M2') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 91b764f0..64fe1739 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 7.0.0-M1 + 7.0.0-M2 2.16.1 5.10.2 2.22.1 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 11296662..cca8f65e 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', - 'org.apache.struts:struts2-convention-plugin:7.0.0-M1', - 'org.apache.struts:struts2-rest-plugin:7.0.0-M1', - 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M1', - 'org.apache.struts:struts2-junit-plugin:7.0.0-M1', + 'org.apache.struts:struts2-convention-plugin:7.0.0-M2', + 'org.apache.struts:struts2-rest-plugin:7.0.0-M2', + 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M2', + 'org.apache.struts:struts2-junit-plugin:7.0.0-M2', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index c9fc14f9..b23a4480 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 7.0.0-M1 + 7.0.0-M2 2.16.1 4.13.2 2.22.1 From 755752d4749b08160ea7472485f09d79e1e5eeb7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Feb 2024 07:04:14 +0100 Subject: [PATCH 0856/1214] chore(deps): update Struts to 7.0.0-M2 for testing --- aws-serverless-java-container-struts/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index d04470e6..f7a8f384 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -38,6 +38,12 @@ org.apache.struts struts2-core ${struts.version} + + + commons-io + commons-io + + org.apache.struts From 5ed73c02138194e617ac7c5ad4fb66363cfea2d0 Mon Sep 17 00:00:00 2001 From: Maximilian Schellhorn Date: Mon, 5 Feb 2024 17:09:06 +0100 Subject: [PATCH 0857/1214] GraalVM sample --- .../springboot3/pet-store-native/Dockerfile | 2 +- .../springboot3/pet-store-native/README.md | 28 ++++++------------- samples/springboot3/pet-store-native/pom.xml | 2 -- .../pet-store-native/template.yaml | 5 ++-- 4 files changed, 13 insertions(+), 24 deletions(-) diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index d885d926..8c395586 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -25,7 +25,7 @@ RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn ENV GRADLE_VERSION 7.4.1 ENV GRADLE_FOLDERNAME gradle-${GRADLE_VERSION} ENV GRADLE_FILENAME gradle-${GRADLE_VERSION}-bin.zip -RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip +RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip RUN unzip gradle-${GRADLE_VERSION}-bin.zip RUN mv $GRADLE_FOLDERNAME /usr/lib/gradle RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle diff --git a/samples/springboot3/pet-store-native/README.md b/samples/springboot3/pet-store-native/README.md index 831353e5..c890090f 100644 --- a/samples/springboot3/pet-store-native/README.md +++ b/samples/springboot3/pet-store-native/README.md @@ -1,7 +1,7 @@ In this sample, you'll build a native GraalVM image for running web workloads in AWS Lambda. -## To build the sample on macOS (Apple silicon arm64) +## To build the sample You first need to build the function, then you will deploy it to AWS Lambda. @@ -10,31 +10,21 @@ You first need to build the function, then you will deploy it to AWS Lambda. Before starting the build, you must clone or download the code in **pet-store-native**. 1. Change into the project directory: `samples/springboot3/pet-store-native` -2. Run the following to build a Docker container image which will be used to create the Lambda function zip file. +2. Run the following to build a Docker container image which will include all the necessary dependencies to build the application ``` - docker build -t "al2-graalvm21:native-web" . + docker build -t al2023-graalvm21:native-web . ``` -3. Start the container +3. Build the application within the previously created build image ``` - docker run -dit -v `pwd`:`pwd` -w `pwd` -v ~/.m2:/root/.m2 al2-graalvm21:native-web + docker run -it -v `pwd`:`pwd` -w `pwd` -v ~/.m2:/root/.m2 al2023-graalvm21:native-web ./mvnw clean -Pnative package -DskipTests ``` -4. In Docker, open the image terminal. - - > Your working directory should default to the project root. Verify by running `ls` to view the files. - -6. From inside the container, build the Lambda function: - ``` - ./mvnw clean -Pnative native:compile -DskipTests - ``` - -After the build finishes, you need to deploy the function. -You can do it manually or you can use SAM (AWS Serverless Application Model) with the included template.yaml file. -If you chose SAM simply execute the following command. +4. After the build finishes, you need to deploy the function: ``` sam deploy --guided ``` - This will deploy your application and will attach an AWS API Gateway -Once the deployment is finished you shouild see the following: + +This will deploy your application and will attach an AWS API Gateway +Once the deployment is finished you should see the following: ``` Key ServerlessWebNativeApi Description URL for application diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 2348fb8d..045c8eb9 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -69,8 +69,6 @@ -agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image/ --enable-preview - --enable-preview - diff --git a/samples/springboot3/pet-store-native/template.yaml b/samples/springboot3/pet-store-native/template.yaml index e081c771..dc05e1be 100644 --- a/samples/springboot3/pet-store-native/template.yaml +++ b/samples/springboot3/pet-store-native/template.yaml @@ -11,8 +11,9 @@ Resources: CodeUri: ./target/pet-store-native-0.0.1-SNAPSHOT-native-zip.zip Handler: NOP Runtime: provided.al2023 - Architectures: - - arm64 +# If you want to build for ARM64 uncomment the following lines +# Architectures: +# - arm64 Events: HttpApiEvent: Type: HttpApi From 6e5fa5205ae0bd5efacb35eb9daa3a84d36acf03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 06:02:39 +0000 Subject: [PATCH 0858/1214] chore(deps): bump slf4j.version from 2.0.11 to 2.0.12 Bumps `slf4j.version` from 2.0.11 to 2.0.12. Updates `org.slf4j:slf4j-api` from 2.0.11 to 2.0.12 Updates `org.slf4j:slf4j-simple` from 2.0.11 to 2.0.12 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74f0bbc3..5d409adb 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 0.7 9.0.9 2.16.1 - 2.0.11 + 2.0.12 5.10.2 5.10.0 1.3 From c35a5eb1d45588fe20b894d6b8d65ead11f1c795 Mon Sep 17 00:00:00 2001 From: deki Date: Tue, 6 Feb 2024 06:20:52 +0000 Subject: [PATCH 0859/1214] chore: release - prepare release aws-serverless-java-container-2.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 77417a01..5af14d2a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 926e8df7..befc26a3 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 776c720c..bed19c80 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 93373d31..a1b658e3 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0-SNAPSHOT + 2.0.0 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.0.0 6.1.3 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 15fd76b8..a1b21a9b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0-SNAPSHOT + 2.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index b5891f92..0b2849cb 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0-SNAPSHOT + 2.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a6cf366b..32f3e230 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0-SNAPSHOT + 2.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0 diff --git a/pom.xml b/pom.xml index 5d409adb..e5542dca 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0-SNAPSHOT + 2.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.0 From cda4585fd8125a56f978705ecaf92e610520d458 Mon Sep 17 00:00:00 2001 From: deki Date: Tue, 6 Feb 2024 06:20:54 +0000 Subject: [PATCH 0860/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5af14d2a..8f743057 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index befc26a3..4ee96cea 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index bed19c80..6154ca2e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index a1b658e3..a36c6665 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.0 + 2.1.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0 + 2.1.0-SNAPSHOT 6.1.3 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a1b21a9b..f4ae1567 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.0 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 0b2849cb..07c5e4e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.0 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.0 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 32f3e230..a1057f35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.0 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.0 + HEAD diff --git a/pom.xml b/pom.xml index e5542dca..959b6ab2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.0 + 2.1.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.0 + HEAD From f326bb2c5d01d3c6cb4811fad8643add5da97ed5 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 6 Feb 2024 10:35:40 +0100 Subject: [PATCH 0861/1214] fix: Changed Maven version range to resolve both SNAPSHOTs and released versions --- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index afda4120..dcefb27d 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - 2.0.0-SNAPSHOT + [2.0.0-SNAPSHOT,),[2.0.0-M1,) diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index ed781b9e..df71fb76 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -51,7 +51,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - 2.0.0-SNAPSHOT + [2.0.0-SNAPSHOT,),[2.0.0-M1,) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 045c8eb9..857be1b0 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -26,7 +26,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - 2.0.0-SNAPSHOT + [2.0.0-SNAPSHOT,),[2.0.0-M1,) com.amazonaws From 10ce3d85ac7416a3a94461bfe961d008b83e5d2f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 6 Feb 2024 10:51:37 +0100 Subject: [PATCH 0862/1214] chore: adjust versions after release --- aws-serverless-java-container-struts/pom.xml | 8 ++++---- aws-serverless-struts-archetype/pom.xml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index f7a8f384..ff407193 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Struts implementation Allows Java applications written for the Struts framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT @@ -23,12 +23,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 com.amazonaws.serverless aws-serverless-java-container-core - 2.0.0-SNAPSHOT + 2.0.0 tests test-jar test diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml index 0e12ca51..27c53004 100644 --- a/aws-serverless-struts-archetype/pom.xml +++ b/aws-serverless-struts-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-struts-archetype - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT maven-archetype From 2623b12b418a7102170e2d2e1452123372f1e418 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 6 Feb 2024 11:02:34 +0100 Subject: [PATCH 0863/1214] add blogpost --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 17457647..b88fb16d 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,10 @@ public class StreamLambdaHandler implements RequestStreamHandler { ## Public Examples +### Blogs + +- [Re-platforming Java applications using the updated AWS Serverless Java Container](https://aws.amazon.com/blogs/compute/re-platforming-java-applications-using-the-updated-aws-serverless-java-container/) + ### Workshops - [Java on AWS Lambda](https://catalog.workshops.aws/java-on-aws-lambda) From Serverful to Serverless Java with AWS Lambda in 2 hours From 776c7979c9200009402cb34ea07b97c55395d4ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 04:24:23 +0000 Subject: [PATCH 0864/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.3.0 to 4.8.3.1. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.3.0...spotbugs-maven-plugin-4.8.3.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 959b6ab2..3af72a5d 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.3.0 + 4.8.3.1 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index b59cc972..602b5633 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 04de7678..28709656 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.2 + 3.2.3 From 3e282bca95e1cfdb621d5cc7b094b136af41f734 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Feb 2024 09:50:53 +0100 Subject: [PATCH 0867/1214] chore(deps): Update maven-shade-plugin to 3.5.2 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index a5214164..8f01b03a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 2bcfc0d8..e5807be4 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 package diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index e444e3fa..a6184962 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7a5ed7fb..c7400aa8 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -85,7 +85,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 31865e36..e2618e87 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 package diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index ca0a9625..9ed6784f 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -49,7 +49,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 442aecdd..8857b1c0 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -63,7 +63,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 28709656..f0ae6a3e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.5.2 false From 4e83ca47c8d66cd1ceaf7d442213013941e8c75f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Feb 2024 09:51:27 +0100 Subject: [PATCH 0868/1214] chore(deps): Update Log4J to 2.23.0 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 79570e92..a79ea420 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.4', 'org.springframework:spring-context:6.1.4', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.22.1', - 'org.apache.logging.log4j:log4j-api:2.22.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.22.1', + 'org.apache.logging.log4j:log4j-core:2.23.0', + 'org.apache.logging.log4j:log4j-api:2.23.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', 'com.fasterxml.jackson.core:jackson-databind:2.16.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index e5807be4..37fd08e1 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.1.4 5.10.2 - 2.22.1 + 2.23.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 499ede04..a0cb6e80 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.16.1') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.16.1') - implementation ('org.apache.logging.log4j:log4j-core:2.22.1') - implementation ('org.apache.logging.log4j:log4j-api:2.22.1') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.22.1') + implementation ('org.apache.logging.log4j:log4j-core:2.23.0') + implementation ('org.apache.logging.log4j:log4j-api:2.23.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.23.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 64fe1739..616f9e6b 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 7.0.0-M2 2.16.1 5.10.2 - 2.22.1 + 2.23.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 6662c379..1c90ee09 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.4', 'org.springframework:spring-context:6.1.4', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.22.1', - 'org.apache.logging.log4j:log4j-api:2.22.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.22.1', + 'org.apache.logging.log4j:log4j-core:2.23.0', + 'org.apache.logging.log4j:log4j-api:2.23.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', 'com.fasterxml.jackson.core:jackson-databind:2.16.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e2618e87..d271fada 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.1.4 - 2.22.1 + 2.23.0 17 17 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index cca8f65e..8396babf 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -24,8 +24,8 @@ dependencies { 'jakarta.el:jakarta.el-api:5.0.1', 'com.fasterxml.jackson.core:jackson-databind:2.16.1', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.16.1', - 'org.apache.logging.log4j:log4j-core:2.22.1', - 'org.apache.logging.log4j:log4j-api:2.22.1', + 'org.apache.logging.log4j:log4j-core:2.23.0', + 'org.apache.logging.log4j:log4j-api:2.23.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index b23a4480..02fbd8fe 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 7.0.0-M2 2.16.1 4.13.2 - 2.22.1 + 2.23.0 From 38ce9172e75c71e0281fa1d0d63e6625016fcc96 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Feb 2024 10:03:28 +0100 Subject: [PATCH 0869/1214] chore(deps): Update Struts to 7.0.0-M3 --- aws-serverless-java-container-struts/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index ff407193..0ce204ca 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 7.0.0-M2 + 7.0.0-M3 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index a0cb6e80..05d94f00 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M2') { + implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M2') { + implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M2') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M3') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:7.0.0-M2') { + implementation ('org.apache.struts:struts2-core:7.0.0-M3') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M2') { + testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M3') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 616f9e6b..b157b160 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 7.0.0-M2 + 7.0.0-M3 2.16.1 5.10.2 2.23.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 8396babf..c0eba57e 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', - 'org.apache.struts:struts2-convention-plugin:7.0.0-M2', - 'org.apache.struts:struts2-rest-plugin:7.0.0-M2', - 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M2', - 'org.apache.struts:struts2-junit-plugin:7.0.0-M2', + 'org.apache.struts:struts2-convention-plugin:7.0.0-M3', + 'org.apache.struts:struts2-rest-plugin:7.0.0-M3', + 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M3', + 'org.apache.struts:struts2-junit-plugin:7.0.0-M3', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 02fbd8fe..9e389939 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 7.0.0-M2 + 7.0.0-M3 2.16.1 4.13.2 2.23.0 From d22f63ff32987d5c3ad5479ba639b28a7153dec6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 26 Feb 2024 10:25:22 +0100 Subject: [PATCH 0870/1214] chore: disable CI build for Struts as it is not released right now --- .../continuous-integration-workflow.yml | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 741ef5c2..dd2e7b1c 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -77,17 +77,16 @@ jobs: - name: Build with Spring Boot 3.1.x run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.1.8 -Dspring.version=6.0.16 -Dspringsecurity.version=6.1.6 -Ddependency-check.skip=true - build_struts2: - name: Build and test Struts - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - distribution: 'corretto' - java-version: 17 - - name: Build latest - run: ./gha_build.sh struts false false -# temporarily disabled archetype and samples as Struts is not released at the moment +# temporarily disabled as Struts is not released at the moment +# build_struts2: +# name: Build and test Struts +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Set up JDK 17 +# uses: actions/setup-java@v3 +# with: +# distribution: 'corretto' +# java-version: 17 +# - name: Build latest # run: ./gha_build.sh struts true true \ No newline at end of file From 04aa97fe0eb581e4ab9386603fb37c0735d45b63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 04:41:52 +0000 Subject: [PATCH 0871/1214] chore(deps): bump com.h3xstream.findsecbugs:findsecbugs-plugin Bumps [com.h3xstream.findsecbugs:findsecbugs-plugin](https://github.com/find-sec-bugs/find-sec-bugs) from 1.12.0 to 1.13.0. - [Release notes](https://github.com/find-sec-bugs/find-sec-bugs/releases) - [Changelog](https://github.com/find-sec-bugs/find-sec-bugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/find-sec-bugs/find-sec-bugs/compare/version-1.12.0...version-1.13.0) --- updated-dependencies: - dependency-name: com.h3xstream.findsecbugs:findsecbugs-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3af72a5d..a9c4a7c2 100644 --- a/pom.xml +++ b/pom.xml @@ -270,7 +270,7 @@ com.h3xstream.findsecbugs findsecbugs-plugin - 1.12.0 + 1.13.0 From acfb5fd4e5729d6ba5f8fbd7d5df81bfe44c2329 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 04:42:16 +0000 Subject: [PATCH 0872/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.10.0 to 5.11.0 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.10.0 to 5.11.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.10.0...v5.11.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3af72a5d..8cb137ad 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.16.1 2.0.12 5.10.2 - 5.10.0 + 5.11.0 1.3 UTF-8 From 333b52139ceefef145a7871959c2bb79c2152e4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 04:42:21 +0000 Subject: [PATCH 0873/1214] chore(deps-dev): bump jakarta.activation:jakarta.activation-api Bumps [jakarta.activation:jakarta.activation-api](https://github.com/jakartaee/jaf-api) from 2.1.2 to 2.1.3. - [Release notes](https://github.com/jakartaee/jaf-api/releases) - [Commits](https://github.com/jakartaee/jaf-api/compare/2.1.2...2.1.3) --- updated-dependencies: - dependency-name: jakarta.activation:jakarta.activation-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b2f1c12d..09aa41f1 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -67,7 +67,7 @@ jakarta.activation jakarta.activation-api - 2.1.2 + 2.1.3 test From b577efa56cd27ce0ecd7d6df499e0196a8a21513 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 22 Mar 2024 13:46:49 +0100 Subject: [PATCH 0874/1214] chore(deps): Update Spring dependencies (framework to 6.1.5, security to 6.2.3, boot to 3.2.4) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index ab040a11..05e2f75d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.2.2 + 6.2.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b2f1c12d..236634ec 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.1.4 - 6.2.2 + 6.1.5 + 6.2.3 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 6560ee0c..23ceec08 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.1.0-SNAPSHOT - 6.1.4 - 3.2.3 - 6.2.2 + 6.1.5 + 3.2.4 + 6.2.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index a79ea420..1c2300ba 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.4', - 'org.springframework:spring-context:6.1.4', + 'org.springframework:spring-webmvc:6.1.5', + 'org.springframework:spring-context:6.1.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.0', 'org.apache.logging.log4j:log4j-api:2.23.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 37fd08e1..2c83b024 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.4 + 6.1.5 5.10.2 2.23.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 6fe3e6df..58322b33 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.2.3', + 'org.springframework.boot:spring-boot-starter-web:3.2.4', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index a6184962..ece2d44f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.2.4 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 1c90ee09..3c5194f6 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.4', - 'org.springframework:spring-context:6.1.4', + 'org.springframework:spring-webmvc:6.1.5', + 'org.springframework:spring-context:6.1.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.0', 'org.apache.logging.log4j:log4j-api:2.23.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index d271fada..279c4d1f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.4 + 6.1.5 2.23.0 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 602b5633..746782c8 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 9ed6784f..90388e15 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.2.4 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 8857b1c0..dd28aef8 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.2.4 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index c5a6e6f7..ae5dbda1 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.2.4 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 602b5633..746782c8 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index f0ae6a3e..a4390bd9 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.3 + 3.2.4 From b39343812a00680fe6ce644a71dafbbbe4f4da65 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 22 Mar 2024 14:14:19 +0100 Subject: [PATCH 0875/1214] chore(deps): Update Jackson to 2.17.0 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index b23f0b90..d4a6549b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', + 'com.fasterxml.jackson.core:jackson-databind:2.17.0', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.5") { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 8f01b03a..be45d80a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.5 - 2.16.1 + 2.17.0 5.10.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1c2300ba..1bc4c4c0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.23.0', 'org.apache.logging.log4j:log4j-api:2.23.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', + 'com.fasterxml.jackson.core:jackson-databind:2.17.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 05d94f00..48cecba3 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.16.1') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.16.1') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.17.0') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.0') implementation ('org.apache.logging.log4j:log4j-core:2.23.0') implementation ('org.apache.logging.log4j:log4j-api:2.23.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.23.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index b157b160..e18351a6 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 7.0.0-M3 - 2.16.1 + 2.17.0 5.10.2 2.23.0 diff --git a/pom.xml b/pom.xml index cddde7bc..437e8ae3 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 9.0.9 - 2.16.1 + 2.17.0 2.0.12 5.10.2 5.11.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 475f60fa..9d9b8846 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', + 'com.fasterxml.jackson.core:jackson-databind:2.17.0', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.5") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c7400aa8..c2e91ef4 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.5 - 2.16.1 + 2.17.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 3c5194f6..1a82fd4f 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.23.0', 'org.apache.logging.log4j:log4j-api:2.23.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', + 'com.fasterxml.jackson.core:jackson-databind:2.17.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index c0eba57e..557a1d29 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', 'jakarta.el:jakarta.el-api:5.0.1', - 'com.fasterxml.jackson.core:jackson-databind:2.16.1', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.16.1', + 'com.fasterxml.jackson.core:jackson-databind:2.17.0', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.0', 'org.apache.logging.log4j:log4j-core:2.23.0', 'org.apache.logging.log4j:log4j-api:2.23.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 9e389939..f720e9c9 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 7.0.0-M3 - 2.16.1 + 2.17.0 4.13.2 2.23.0 From 96e0e7cc563a5be44799d2766b54b6fe470c01eb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 22 Mar 2024 14:15:08 +0100 Subject: [PATCH 0876/1214] chore(deps): Update maven-assembly-plugin to 3.7.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index be45d80a..f2eb920c 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -172,7 +172,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 2c83b024..1f759772 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -195,7 +195,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index ece2d44f..3947c9de 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -155,7 +155,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index e18351a6..fe83e886 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 src/main/assembly/dist.xml diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c2e91ef4..7ed1aa1f 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -150,7 +150,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 279c4d1f..46efbe5d 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -171,7 +171,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 90388e15..a2855b87 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -121,7 +121,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index dd28aef8..c566bfca 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -135,7 +135,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index a4390bd9..8bee4a39 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 zip-assembly diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index f720e9c9..f29dc226 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -148,7 +148,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.6.0 + 3.7.0 src/main/assembly/dist.xml From 0ba5586ae1b0c1f805251dff2dc36891a86f26c9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 22 Mar 2024 14:16:11 +0100 Subject: [PATCH 0877/1214] chore(deps): Update Log4J to 2.23.1 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1bc4c4c0..0a4d5d6b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.5', 'org.springframework:spring-context:6.1.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.23.0', - 'org.apache.logging.log4j:log4j-api:2.23.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', + 'org.apache.logging.log4j:log4j-core:2.23.1', + 'org.apache.logging.log4j:log4j-api:2.23.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.1', 'com.fasterxml.jackson.core:jackson-databind:2.17.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 1f759772..c40b951d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.1.5 5.10.2 - 2.23.0 + 2.23.1 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 48cecba3..f8b3469d 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.17.0') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.0') - implementation ('org.apache.logging.log4j:log4j-core:2.23.0') - implementation ('org.apache.logging.log4j:log4j-api:2.23.0') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.23.0') + implementation ('org.apache.logging.log4j:log4j-core:2.23.1') + implementation ('org.apache.logging.log4j:log4j-api:2.23.1') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.23.1') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index fe83e886..ad497931 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 7.0.0-M3 2.17.0 5.10.2 - 2.23.0 + 2.23.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 1a82fd4f..304891e8 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.5', 'org.springframework:spring-context:6.1.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.23.0', - 'org.apache.logging.log4j:log4j-api:2.23.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.0', + 'org.apache.logging.log4j:log4j-core:2.23.1', + 'org.apache.logging.log4j:log4j-api:2.23.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.1', 'com.fasterxml.jackson.core:jackson-databind:2.17.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 46efbe5d..584b9658 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.1.5 - 2.23.0 + 2.23.1 17 17 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 557a1d29..66fb4929 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -24,8 +24,8 @@ dependencies { 'jakarta.el:jakarta.el-api:5.0.1', 'com.fasterxml.jackson.core:jackson-databind:2.17.0', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.0', - 'org.apache.logging.log4j:log4j-core:2.23.0', - 'org.apache.logging.log4j:log4j-api:2.23.0', + 'org.apache.logging.log4j:log4j-core:2.23.1', + 'org.apache.logging.log4j:log4j-api:2.23.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index f29dc226..f854cd33 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 7.0.0-M3 2.17.0 4.13.2 - 2.23.0 + 2.23.1 From 10b41f5de02cf618aad688999ee92c0dcd47fdfd Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 22 Mar 2024 14:46:55 +0100 Subject: [PATCH 0878/1214] chore(deps): Update maven-assembly-plugin to 3.7.1 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- samples/struts/pet-store/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index f2eb920c..a6defc76 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -172,7 +172,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index c40b951d..a218c78d 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -195,7 +195,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 3947c9de..80bc1076 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -155,7 +155,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index ad497931..f4655f0c 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 src/main/assembly/dist.xml diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7ed1aa1f..6c7b1ed5 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -150,7 +150,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 584b9658..a0803162 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -171,7 +171,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index a2855b87..5dc89a9b 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -121,7 +121,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index c566bfca..6b78c1a8 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -135,7 +135,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 8bee4a39..5ae6787a 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -127,7 +127,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 zip-assembly diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index f854cd33..04b43c51 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -148,7 +148,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.7.0 + 3.7.1 src/main/assembly/dist.xml From c029401a65ed1ea95d3a3886756c6ecfaa3815e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 04:52:49 +0000 Subject: [PATCH 0879/1214] chore(deps): bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.12.1 to 3.13.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.12.1...maven-compiler-plugin-3.13.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 437e8ae3..622eb6b0 100644 --- a/pom.xml +++ b/pom.xml @@ -190,7 +190,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.12.1 + 3.13.0 1.8 1.8 From 5857ab43dd37f11be1c950177d147800045edb1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 04:52:55 +0000 Subject: [PATCH 0880/1214] chore(deps): bump org.apache.maven.plugins:maven-gpg-plugin Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.1.0 to 3.2.1. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.1.0...maven-gpg-plugin-3.2.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 437e8ae3..4397e6a4 100644 --- a/pom.xml +++ b/pom.xml @@ -292,7 +292,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.1.0 + 3.2.1 sign-artifacts From a3b98a749692cff04db15345a08a399380fb24b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 04:53:02 +0000 Subject: [PATCH 0881/1214] chore(deps): bump org.owasp:dependency-check-maven from 9.0.9 to 9.0.10 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 9.0.9 to 9.0.10. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v9.0.9...v9.0.10) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 437e8ae3..f095ebe4 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 9.0.9 + 9.0.10 2.17.0 2.0.12 5.10.2 From 17afb9a418f9a66b2a91e3483fa84eed626aaa2f Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 26 Mar 2024 11:52:47 +0100 Subject: [PATCH 0882/1214] GH-805 Fix web context initialization during snapstart Also updated to s-c-function-serverless-webb 4.1.1-SNAPSHOT This commit forces wait for full context initialization if context is created during snapstart creation --- aws-serverless-java-container-springboot3/pom.xml | 2 +- .../proxy/spring/SpringDelegatingLambdaContainerHandler.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 23ceec08..def9c901 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.0.6 + 4.1.1-SNAPSHOT com.amazonaws.serverless diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index f1a3b526..56ebe830 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -53,6 +53,10 @@ public SpringDelegatingLambdaContainerHandler() { public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { this.startupClasses = startupClasses; this.mvc = ServerlessMVC.INSTANCE(this.startupClasses); + if (System.getenv().containsKey("AWS_LAMBDA_INITIALIZATION_TYPE") + && System.getenv().get("AWS_LAMBDA_INITIALIZATION_TYPE").equals("snap-start")) { + mvc.waitForContext(); + } this.mapper = new ObjectMapper(); this.responseWriter = new AwsProxyHttpServletResponseWriter(); } From bae68010a8ee07e89cfe160ada60fddf5297e8c0 Mon Sep 17 00:00:00 2001 From: Jonathan Ifegunni Date: Tue, 26 Mar 2024 15:44:51 -0700 Subject: [PATCH 0883/1214] Add support for Iam Authorizer --- .../proxy/model/HttpApiV2AuthorizerMap.java | 32 ++++++- .../proxy/model/HttpApiV2IamAuthorizer.java | 68 +++++++++++++++ .../model/HttpApiV2ProxyRequestTest.java | 85 +++++++++++++++++-- 3 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2IamAuthorizer.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java index 4fff028c..2cf6d77a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java @@ -34,16 +34,21 @@ public class HttpApiV2AuthorizerMap extends HashMap { private static final String JWT_KEY = "jwt"; private static final String LAMBDA_KEY = "lambda"; + private static final String IAM_KEY = "iam"; private static final long serialVersionUID = 42L; public HttpApiV2JwtAuthorizer getJwtAuthorizer() { - return (HttpApiV2JwtAuthorizer)get(JWT_KEY); + return (HttpApiV2JwtAuthorizer) get(JWT_KEY); } public Map getLambdaAuthorizerContext() { return (Map) get(LAMBDA_KEY); } + public HttpApiV2IamAuthorizer getIamAuthorizer() { + return (HttpApiV2IamAuthorizer) get(IAM_KEY); + } + public boolean isJwt() { return containsKey(JWT_KEY); } @@ -52,10 +57,18 @@ public boolean isLambda() { return containsKey(LAMBDA_KEY); } + public boolean isIam() { + return containsKey(IAM_KEY); + } + public void putJwtAuthorizer(HttpApiV2JwtAuthorizer jwt) { put(JWT_KEY, jwt); } + public void putIamAuthorizer(HttpApiV2IamAuthorizer iam) { + put(IAM_KEY, iam); + } + public static class HttpApiV2AuthorizerDeserializer extends StdDeserializer { private static final long serialVersionUID = 42L; @@ -64,11 +77,13 @@ public HttpApiV2AuthorizerDeserializer() { } @Override - public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JsonProcessingException { HttpApiV2AuthorizerMap map = new HttpApiV2AuthorizerMap(); JsonNode node = jsonParser.getCodec().readTree(jsonParser); if (node.has(JWT_KEY)) { - HttpApiV2JwtAuthorizer authorizer = LambdaContainerHandler.getObjectMapper().treeToValue(node.get(JWT_KEY), HttpApiV2JwtAuthorizer.class); + HttpApiV2JwtAuthorizer authorizer = LambdaContainerHandler.getObjectMapper() + .treeToValue(node.get(JWT_KEY), HttpApiV2JwtAuthorizer.class); map.putJwtAuthorizer(authorizer); } if (node.has(LAMBDA_KEY)) { @@ -76,6 +91,11 @@ public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, Deserialization TypeFactory.defaultInstance().constructMapType(HashMap.class, String.class, Object.class)); map.put(LAMBDA_KEY, context); } + if (node.has(IAM_KEY)) { + HttpApiV2IamAuthorizer iam_authorizer = LambdaContainerHandler.getObjectMapper() + .treeToValue(node.get(IAM_KEY), HttpApiV2IamAuthorizer.class); + map.putIamAuthorizer(iam_authorizer); + } // we ignore other, unknown values return map; } @@ -89,7 +109,8 @@ public HttpApiV2AuthorizerSerializer() { } @Override - public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); if (httpApiV2AuthorizerMap.isJwt()) { jsonGenerator.writeObjectField(JWT_KEY, httpApiV2AuthorizerMap.getJwtAuthorizer()); @@ -97,6 +118,9 @@ public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerat if (httpApiV2AuthorizerMap.isLambda()) { jsonGenerator.writeObjectField(LAMBDA_KEY, httpApiV2AuthorizerMap.getLambdaAuthorizerContext()); } + if (httpApiV2AuthorizerMap.isIam()) { + jsonGenerator.writeObjectField(IAM_KEY, httpApiV2AuthorizerMap.get(IAM_KEY)); + } jsonGenerator.writeEndObject(); } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2IamAuthorizer.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2IamAuthorizer.java new file mode 100644 index 00000000..d2a0952e --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2IamAuthorizer.java @@ -0,0 +1,68 @@ +package com.amazonaws.serverless.proxy.model; + +public class HttpApiV2IamAuthorizer { + public String accessKey; + public String accountId; + public String callerId; + public String cognitoIdentity; + public String principalOrgId; + public String userArn; + public String userId; + + public String getAccessKey() { + return accessKey; + } + + public String getAccountId() { + return accountId; + } + + public String getCallerId() { + return callerId; + } + + public String getCognitoIdentity() { + return cognitoIdentity; + } + + public String getPrincipalOrgId() { + return principalOrgId; + } + + public String getUserArn() { + return userArn; + } + + public String getUserId() { + return userId; + } + + public void setAccessKey(String accessKey) { + this.accessKey = accessKey; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public void setCallerId(String callerId) { + this.callerId = callerId; + } + + public void setCognitoIdentity(String cognitoIdentity) { + this.cognitoIdentity = cognitoIdentity; + } + + public void setPrincipalOrgId(String principalOrgId) { + this.principalOrgId = principalOrgId; + } + + public void setUserArn(String userArn) { + this.userArn = userArn; + } + + public void setUserId(String userId) { + this.userId = userId; + } + +} \ No newline at end of file diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java index 3aa7cfdf..20ff4dff 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -129,11 +129,55 @@ public class HttpApiV2ProxyRequestTest { " \"isBase64Encoded\": false,\n" + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + " }\n"; + private static final String IAM_AUTHORIZER = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [ \"cookie1\", \"cookie2\" ],\n" + + " \"headers\": {\n" + + " \"Header1\": \"value1\",\n" + + " \"Header2\": \"value2\"\n" + + " },\n" + + " \"queryStringParameters\": { \"parameter1\": \"value1,value2\", \"parameter2\": \"value\" },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authorizer\": { \"iam\": {\n" + + " \"accessKey\": \"AKIAIOSFODNN7EXAMPLE\",\n" + + " \"accountId\": \"123456789012\",\n" + + " \"callerId\": \"AIDACKCEVSQ6C2EXAMPLE\",\n" + + " \"cognitoIdentity\": null,\n" + + " \"principalOrgId\": \"AIDACKCEVSQORGEXAMPLE\",\n" + + " \"userArn\": \"arn:aws:iam::111122223333:user/example-user\",\n" + + " \"userId\": \"AIDACOSFODNN7EXAMPLE2\"\n" + + " }" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\"stageVariable1\": \"value1\", \"stageVariable2\": \"value2\"}\n" + + " }\n"; @Test void deserialize_fromJsonString_authorizerPopulatedCorrectly() { try { - HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, + HttpApiV2ProxyRequest.class); assertTrue(req.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey("claim1")); assertEquals(2, req.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().size()); assertEquals(RequestSource.API_GATEWAY, req.getRequestSource()); @@ -146,10 +190,12 @@ void deserialize_fromJsonString_authorizerPopulatedCorrectly() { @Test void deserialize_fromJsonString_authorizerEmptyMap() { try { - HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, + HttpApiV2ProxyRequest.class); assertNotNull(req.getRequestContext().getAuthorizer()); assertFalse(req.getRequestContext().getAuthorizer().isJwt()); assertFalse(req.getRequestContext().getAuthorizer().isLambda()); + assertFalse(req.getRequestContext().getAuthorizer().isIam()); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); @@ -159,7 +205,8 @@ void deserialize_fromJsonString_authorizerEmptyMap() { @Test void deserialize_fromJsonString_lambdaAuthorizer() { try { - HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(LAMBDA_AUTHORIZER, HttpApiV2ProxyRequest.class); + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(LAMBDA_AUTHORIZER, + HttpApiV2ProxyRequest.class); assertNotNull(req.getRequestContext().getAuthorizer()); assertFalse(req.getRequestContext().getAuthorizer().isJwt()); assertTrue(req.getRequestContext().getAuthorizer().isLambda()); @@ -171,10 +218,38 @@ void deserialize_fromJsonString_lambdaAuthorizer() { } } + @Test + void deserialize_fromJsonString_iamAuthorizer() { + try { + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(IAM_AUTHORIZER, + HttpApiV2ProxyRequest.class); + assertNotNull(req.getRequestContext().getAuthorizer()); + assertFalse(req.getRequestContext().getAuthorizer().isJwt()); + assertFalse(req.getRequestContext().getAuthorizer().isLambda()); + assertTrue(req.getRequestContext().getAuthorizer().isIam()); + assertEquals("AKIAIOSFODNN7EXAMPLE", + req.getRequestContext().getAuthorizer().getIamAuthorizer().getAccessKey()); + assertEquals("123456789012", req.getRequestContext().getAuthorizer().getIamAuthorizer().getAccountId()); + assertEquals("AIDACKCEVSQ6C2EXAMPLE", + req.getRequestContext().getAuthorizer().getIamAuthorizer().getCallerId()); + assertNull(req.getRequestContext().getAuthorizer().getIamAuthorizer().getCognitoIdentity()); + assertEquals("AIDACKCEVSQORGEXAMPLE", + req.getRequestContext().getAuthorizer().getIamAuthorizer().getPrincipalOrgId()); + assertEquals("arn:aws:iam::111122223333:user/example-user", + req.getRequestContext().getAuthorizer().getIamAuthorizer().getUserArn()); + assertEquals("AIDACOSFODNN7EXAMPLE2", + req.getRequestContext().getAuthorizer().getIamAuthorizer().getUserId()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + fail("Exception while parsing request" + e.getMessage()); + } + } + @Test void deserialize_fromJsonString_isBase64EncodedPopulates() { try { - HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, HttpApiV2ProxyRequest.class); + HttpApiV2ProxyRequest req = LambdaContainerHandler.getObjectMapper().readValue(BASE_PROXY_REQUEST, + HttpApiV2ProxyRequest.class); assertFalse(req.isBase64Encoded()); req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); assertTrue(req.isBase64Encoded()); @@ -207,4 +282,4 @@ void serialize_toJsonString_authorizerPopulatesCorrectly() { fail("Exception while serializing request" + e.getMessage()); } } -} +} \ No newline at end of file From 79f2f49dbe9327de203921aeac75c330af678ffa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 04:16:00 +0000 Subject: [PATCH 0884/1214] chore(deps): bump org.owasp:dependency-check-maven from 9.0.10 to 9.1.0 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 9.0.10 to 9.1.0. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v9.0.10...v9.1.0) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e81487e..44a8ad30 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 9.0.10 + 9.1.0 2.17.0 2.0.12 5.10.2 From 1469b1dc11a86f1a6a3b0a0f21db590df300fbc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 04:16:19 +0000 Subject: [PATCH 0885/1214] chore(deps): bump org.apache.maven.plugins:maven-gpg-plugin Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.1...maven-gpg-plugin-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e81487e..13e6daf6 100644 --- a/pom.xml +++ b/pom.xml @@ -292,7 +292,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.1 + 3.2.2 sign-artifacts From 82340e139f6f23cff101960bb462a56ef7bbb036 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 4 Apr 2024 15:09:35 +0200 Subject: [PATCH 0886/1214] chore(deps): Update to spring-cloud-function-serverless-web 4.1.1 release --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index def9c901..50a4f542 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.1-SNAPSHOT + 4.1.1 com.amazonaws.serverless From 2d3174cfd300f061f9ddd0b44d317a3d90b7bd93 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 4 Apr 2024 15:20:48 +0200 Subject: [PATCH 0887/1214] fix: Reinitialization of Spring context when using SnapStart #805 --- .../proxy/AsyncInitializationWrapper.java | 14 +++----- .../proxy/InitializationTypeHelper.java | 33 +++++++++++++++++++ ...pringDelegatingLambdaContainerHandler.java | 4 +-- 3 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationTypeHelper.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java index 57f4e8a0..12e1590a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AsyncInitializationWrapper.java @@ -41,17 +41,13 @@ public class AsyncInitializationWrapper extends InitializationWrapper { private static final int DEFAULT_INIT_GRACE_TIME_MS = 150; private static final String INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME = "AWS_SERVERLESS_JAVA_CONTAINER_INIT_GRACE_TIME"; - private static final String INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME = "AWS_LAMBDA_INITIALIZATION_TYPE"; - private static final String INITIALIZATION_TYPE_ON_DEMAND = "on-demand"; - private static final String INITIALIZATION_TYPE = System.getenv().getOrDefault(INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME,INITIALIZATION_TYPE_ON_DEMAND); - private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND); private static final int INIT_GRACE_TIME_MS = Integer.parseInt(System.getenv().getOrDefault( INIT_GRACE_TIME_ENVIRONMENT_VARIABLE_NAME, Integer.toString(DEFAULT_INIT_GRACE_TIME_MS))); private static final int LAMBDA_MAX_INIT_TIME_MS = 10_000; private CountDownLatch initializationLatch; private final long actualStartTime; - private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); + private final Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); /** @@ -73,8 +69,8 @@ public AsyncInitializationWrapper() { @Override public void start(InitializableLambdaContainerHandler handler) throws ContainerInitializationException { - if(ASYNC_INIT_DISABLED){ - log.info("Async init disabled due to \"{}\" initialization", INITIALIZATION_TYPE); + if (InitializationTypeHelper.isAsyncInitializationDisabled()){ + log.info("Async init disabled due to \"{}\" initialization", InitializationTypeHelper.getInitializationType()); super.start(handler); return; } @@ -107,7 +103,7 @@ public long getActualStartTimeMs() { @Override public CountDownLatch getInitializationLatch() { - if (ASYNC_INIT_DISABLED){ + if (InitializationTypeHelper.isAsyncInitializationDisabled()){ return super.getInitializationLatch(); } return initializationLatch; @@ -116,7 +112,7 @@ public CountDownLatch getInitializationLatch() { private static class AsyncInitializer implements Runnable { private final InitializableLambdaContainerHandler handler; private CountDownLatch initLatch; - private Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); + private final Logger log = LoggerFactory.getLogger(AsyncInitializationWrapper.class); AsyncInitializer(CountDownLatch latch, InitializableLambdaContainerHandler h) { initLatch = latch; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationTypeHelper.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationTypeHelper.java new file mode 100644 index 00000000..c40c5ecc --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/InitializationTypeHelper.java @@ -0,0 +1,33 @@ +/* + * Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy; + +/** + * Utility class that helps determine the initialization type + */ +public final class InitializationTypeHelper { + + private static final String INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME = "AWS_LAMBDA_INITIALIZATION_TYPE"; + private static final String INITIALIZATION_TYPE_ON_DEMAND = "on-demand"; + private static final String INITIALIZATION_TYPE = System.getenv().getOrDefault(INITIALIZATION_TYPE_ENVIRONMENT_VARIABLE_NAME, + INITIALIZATION_TYPE_ON_DEMAND); + private static final boolean ASYNC_INIT_DISABLED = !INITIALIZATION_TYPE.equals(INITIALIZATION_TYPE_ON_DEMAND); + + public static boolean isAsyncInitializationDisabled() { + return ASYNC_INIT_DISABLED; + } + + public static String getInitializationType() { + return INITIALIZATION_TYPE; + } +} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 56ebe830..1af435c0 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.io.OutputStream; +import com.amazonaws.serverless.proxy.InitializationTypeHelper; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import org.springframework.cloud.function.serverless.web.FunctionClassUtils; import org.springframework.cloud.function.serverless.web.ServerlessMVC; @@ -53,8 +54,7 @@ public SpringDelegatingLambdaContainerHandler() { public SpringDelegatingLambdaContainerHandler(Class... startupClasses) { this.startupClasses = startupClasses; this.mvc = ServerlessMVC.INSTANCE(this.startupClasses); - if (System.getenv().containsKey("AWS_LAMBDA_INITIALIZATION_TYPE") - && System.getenv().get("AWS_LAMBDA_INITIALIZATION_TYPE").equals("snap-start")) { + if (InitializationTypeHelper.isAsyncInitializationDisabled()) { mvc.waitForContext(); } this.mapper = new ObjectMapper(); From c0551dd0f752ef05bd90fcad86e8413c7dd86ee4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:57:30 +0000 Subject: [PATCH 0888/1214] chore(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12 Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.11 to 0.8.12. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.11...v0.8.12) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52d0f19a..59a1c2f2 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ org.jacoco jacoco-maven-plugin - 0.8.11 + 0.8.12 From 07ade4bd8eaefee50e3757e6e6aa282da4ae883b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:57:33 +0000 Subject: [PATCH 0889/1214] chore(deps): bump org.apache.maven.plugins:maven-source-plugin Bumps [org.apache.maven.plugins:maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.3.0 to 3.3.1. - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.3.0...maven-source-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-source-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52d0f19a..d0a5c558 100644 --- a/pom.xml +++ b/pom.xml @@ -318,7 +318,7 @@ org.apache.maven.plugins maven-source-plugin - 3.3.0 + 3.3.1 attach-sources From 928cd123be1424dda9eaae6b898faa12ea80b8e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:57:39 +0000 Subject: [PATCH 0890/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.8.3 to 4.8.4. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.8.3...4.8.4) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52d0f19a..453be633 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.8.3 + 4.8.4 provided From 1ad9d575ba53ad322fea7a9b59e4a08ad3e54cc3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 8 Apr 2024 09:23:58 +0200 Subject: [PATCH 0891/1214] chore(deps): Update Jersey to 3.1.6 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 683ff7e7..f93cee62 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.5 + 3.1.6 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index d4a6549b..9bcd5f81 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.0', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.5") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.6") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.5") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.6") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index a6defc76..54654aee 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.5 + 3.1.6 2.17.0 5.10.2 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 9d9b8846..04755d37 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.0', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.5") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.6") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.5") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.6") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 6c7b1ed5..5bf6da30 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.5 + 3.1.6 2.17.0 From efd68be7438b99bf8071515789f6582e108dd61f Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 8 Apr 2024 08:41:37 +0000 Subject: [PATCH 0892/1214] chore: release - prepare release aws-serverless-java-container-2.0.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 05e2f75d..0e9c9e65 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f93cee62..95ae04d5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 66547022..129a280b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 50a4f542..b0192475 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0-SNAPSHOT + 2.0.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f4ae1567..186b23a2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 07c5e4e9..77bec6e3 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a1057f35..efde5bb2 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/pom.xml b/pom.xml index 24d8afe1..836490d0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0-SNAPSHOT + 2.0.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 From cec132c75e5f64b54c7c98abffd22cec69d6a36c Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 8 Apr 2024 08:41:38 +0000 Subject: [PATCH 0893/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0e9c9e65..05e2f75d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 95ae04d5..f93cee62 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 129a280b..66547022 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b0192475..50a4f542 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.1 + 2.1.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 186b23a2..f4ae1567 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 77bec6e3..07c5e4e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index efde5bb2..a1057f35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/pom.xml b/pom.xml index 836490d0..24d8afe1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.1 + 2.1.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD From aaacbc8f721fc3a0405904c5bcd0741964952fca Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 8 Apr 2024 09:06:27 +0000 Subject: [PATCH 0894/1214] chore: release - prepare release aws-serverless-java-container-2.0.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 05e2f75d..0e9c9e65 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f93cee62..95ae04d5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 66547022..129a280b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 50a4f542..b0192475 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0-SNAPSHOT + 2.0.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f4ae1567..186b23a2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 07c5e4e9..77bec6e3 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a1057f35..efde5bb2 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/pom.xml b/pom.xml index 24d8afe1..836490d0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0-SNAPSHOT + 2.0.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 From 38bbea7216e89733dc4612a74b0a7a0dc365188c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 8 Apr 2024 11:18:17 +0200 Subject: [PATCH 0895/1214] chore: Set versions back to SNAPSHOT to rerun release build This reverts commit aaacbc8f721fc3a0405904c5bcd0741964952fca. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0e9c9e65..05e2f75d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 95ae04d5..f93cee62 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 129a280b..66547022 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b0192475..50a4f542 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.1 + 2.1.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 186b23a2..f4ae1567 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 77bec6e3..07c5e4e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index efde5bb2..a1057f35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/pom.xml b/pom.xml index 836490d0..24d8afe1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.1 + 2.1.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD From df173dd113f3355769a5efd8f64ca8aad1075d88 Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 8 Apr 2024 09:25:48 +0000 Subject: [PATCH 0896/1214] chore: release - prepare release aws-serverless-java-container-2.0.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 05e2f75d..0e9c9e65 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f93cee62..95ae04d5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 66547022..129a280b 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 50a4f542..b0192475 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0-SNAPSHOT + 2.0.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.1 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f4ae1567..186b23a2 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 07c5e4e9..77bec6e3 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a1057f35..efde5bb2 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0-SNAPSHOT + 2.0.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 diff --git a/pom.xml b/pom.xml index 24d8afe1..836490d0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0-SNAPSHOT + 2.0.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.1 From 08c5069952b307bf8ac20a09b3c039d7eef94ba2 Mon Sep 17 00:00:00 2001 From: deki Date: Mon, 8 Apr 2024 09:25:50 +0000 Subject: [PATCH 0897/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0e9c9e65..05e2f75d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 95ae04d5..f93cee62 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 129a280b..66547022 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b0192475..50a4f542 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.1 + 2.1.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.1 + 2.1.0-SNAPSHOT 6.1.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.1 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 186b23a2..f4ae1567 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 77bec6e3..07c5e4e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index efde5bb2..a1057f35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.1 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.1 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD diff --git a/pom.xml b/pom.xml index 836490d0..24d8afe1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.1 + 2.1.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.1 + HEAD From b0058d1914ecb67a15f62329d35ee3ef1d5b8339 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Sun, 7 Apr 2024 22:01:27 -0700 Subject: [PATCH 0898/1214] fix remoteHost for ALB --- .../servlet/AwsProxyHttpServletRequest.java | 23 +++++++++++++++---- .../AwsProxyHttpServletRequestTest.java | 12 ++++++++++ .../testutils/AwsProxyRequestBuilder.java | 3 ++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 3e92d43d..31fc7c2c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -21,13 +21,15 @@ import com.amazonaws.serverless.proxy.model.RequestSource; import com.amazonaws.services.lambda.runtime.Context; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import jakarta.servlet.*; -import jakarta.servlet.http.*; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpUpgradeHandler; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.SecurityContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -441,6 +443,13 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { + if (Objects.nonNull(request.getRequestContext().getElb())) { + String host_header = request.getHeaders().get(HttpHeaders.HOST); + + // the host header has the form host:port, so we split the string to get the host part + return Arrays.asList(host_header.split(":")).get(0); + } + return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); } @@ -471,6 +480,12 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public int getRemotePort() { + if (Objects.nonNull(request.getRequestContext().getElb())) { + String hostHeader = request.getHeaders().get(HttpHeaders.HOST); + String port = Arrays.asList(hostHeader.split(":")).get(1); + if (Objects.nonNull(port)) + return Integer.parseInt(port); + } return 0; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 76507508..45c38843 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -651,6 +651,18 @@ void serverName_albHostHeader_returnsHostHeader() { assertEquals("testapi.us-east-1.elb.amazonaws.com", serverName); } + @Test + void getRemoteHost_albHostHeader_returnsHostHeader() { + initAwsProxyHttpServletRequestTest("ALB"); + AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET") + .alb().build(); + proxyReq.getHeaders().put(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com"); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null); + + String host = servletRequest.getRemoteHost(); + assertEquals("testapi.us-east-1.elb.amazonaws.com", host); + } + private AwsProxyRequestBuilder getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 9df66a89..40f0ae7a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -70,7 +70,8 @@ public AwsProxyRequestBuilder(AwsProxyRequest req) { public AwsProxyRequestBuilder(String path, String httpMethod) { this.request = new AwsProxyRequest(); - this.request.setMultiValueHeaders(new Headers()); // avoid NPE + this.request.setMultiValueHeaders(new Headers());// avoid NPE + this.request.setHeaders(new SingleValueHeaders()); this.request.setHttpMethod(httpMethod); this.request.setPath(path); this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>()); From e6e43077925566ec6ff3ba8ec354a49e7504f9c8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 9 Apr 2024 08:34:04 +0200 Subject: [PATCH 0899/1214] Update README.md both 1.x and 2.x are ready for use in production --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b88fb16d..9df70fdf 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Currently the following versions are maintained: -| Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | -|--------------------------|--------|-------------------------|-----------------|------------------------|----------------|---------------| -| 1.x (stable) | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | -| 2.x (under development) | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | +| Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | +|---------|--------|-------------------------|-----------------|------------------------|----------------|---------------| +| 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | +| 2.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) @@ -58,4 +58,4 @@ public class StreamLambdaHandler implements RequestStreamHandler { ### Java samples with different frameworks -- [Dagger, Micronaut, Quarkus, Spring Boot](https://github.com/aws-samples/serverless-java-frameworks-samples/) \ No newline at end of file +- [Dagger, Micronaut, Quarkus, Spring Boot](https://github.com/aws-samples/serverless-java-frameworks-samples/) From 2e33b439a9e0bc0dd072c896816b88dea2bc5d94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 04:14:45 +0000 Subject: [PATCH 0900/1214] chore(deps): bump com.amazonaws:aws-lambda-java-events Bumps [com.amazonaws:aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs) from 3.11.4 to 3.11.5. - [Commits](https://github.com/aws/aws-lambda-java-libs/commits) --- updated-dependencies: - dependency-name: com.amazonaws:aws-lambda-java-events dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store-native/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index ae5dbda1..78e609c3 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -31,7 +31,7 @@ com.amazonaws aws-lambda-java-events - 3.11.4 + 3.11.5 com.amazonaws From 4076e132cb49fd01ae4a3934fd008fad7aa5911c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 04:43:10 +0000 Subject: [PATCH 0901/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.3.1 to 4.8.4.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.3.1...spotbugs-maven-plugin-4.8.4.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24d8afe1..d1d11e87 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.3.1 + 4.8.4.0 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 746782c8..0ddec053 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.4') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index a206581b..10c186a0 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.4 + 3.2.5 From 50121959b5b296c7580a58832aaf00117bd29083 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 22 Apr 2024 10:19:57 +0200 Subject: [PATCH 0907/1214] chore(deps): Update maven-jar-plugin to 3.4.1 --- aws-serverless-java-container-core/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9d002fb7..a6278f9e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -70,7 +70,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 8c5384db..a28137a8 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -134,7 +134,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index f96559fd..20222c7b 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/pom.xml b/pom.xml index c53efed8..f7af293d 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 org.apache.maven.plugins diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 9964add6..3914eba4 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -112,7 +112,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 42499a76..b81b475a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -133,7 +133,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 1a6c3905..0da1dceb 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 15cef264..5e5fd76a 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -97,7 +97,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 10c186a0..40120a6a 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -89,7 +89,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.0 + 3.4.1 default-jar From 964a8dffdf7eb56020852d5986decefa1df0a4bf Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 23 Apr 2024 17:13:02 +0200 Subject: [PATCH 0908/1214] chore(deps): remove jakarta.el:jakarta.el-api test dependency definition --- aws-serverless-java-container-spring/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b24689e8..103991c5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -84,13 +84,6 @@ test - - jakarta.el - jakarta.el-api - 5.0.1 - test - - org.glassfish.expressly expressly From 2005a5c13c7550facaa8f6e421f98afc952263e1 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Thu, 25 Apr 2024 17:44:28 +0200 Subject: [PATCH 0909/1214] Uograde SCF to 4.1.2-SNAPSHOT --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 24c0a9c7..61ccfb0f 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.1 + 4.1.2-SNAPSHOT com.amazonaws.serverless From 290bd1043c06888410d261fc2b0c6dc7941113f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 04:43:06 +0000 Subject: [PATCH 0910/1214] chore(deps): bump commons-codec:commons-codec from 1.16.1 to 1.17.0 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.16.1 to 1.17.0. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.16.1...rel/commons-codec-1.17.0) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index f93cee62..09f9205d 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -64,7 +64,7 @@ commons-codec commons-codec - 1.16.1 + 1.17.0 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 103991c5..3c33400a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -53,7 +53,7 @@ commons-codec commons-codec - 1.16.1 + 1.17.0 test From 04a0e635e399c92ea0d22c80b8efd92e4530991b Mon Sep 17 00:00:00 2001 From: mbfreder Date: Sun, 28 Apr 2024 23:48:17 -0700 Subject: [PATCH 0911/1214] fix ArrayIndexOutOfBoundsException on getRemotePort() --- .../internal/servlet/AwsProxyHttpServletRequest.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 31fc7c2c..063f7143 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -444,10 +444,10 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { if (Objects.nonNull(request.getRequestContext().getElb())) { - String host_header = request.getHeaders().get(HttpHeaders.HOST); + String hostHeader = request.getHeaders().get(HttpHeaders.HOST); // the host header has the form host:port, so we split the string to get the host part - return Arrays.asList(host_header.split(":")).get(0); + return Arrays.asList(hostHeader.split(":")).get(0); } return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); @@ -481,10 +481,9 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public int getRemotePort() { if (Objects.nonNull(request.getRequestContext().getElb())) { - String hostHeader = request.getHeaders().get(HttpHeaders.HOST); - String port = Arrays.asList(hostHeader.split(":")).get(1); - if (Objects.nonNull(port)) - return Integer.parseInt(port); + String hostHeader = request.getHeaders().get(PORT_HEADER_NAME); + if (Objects.nonNull(hostHeader)) + return Integer.parseInt(hostHeader); } return 0; } From dbbb6611c79753815ed77f9493c42667dd6da929 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 29 Apr 2024 14:31:37 +0200 Subject: [PATCH 0912/1214] chore(deps): Update maven-shade-plugin to 3.5.3 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index a28137a8..991ff68b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 20222c7b..d93cc6cd 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 package diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 0a9f1bc6..4afcfb58 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 3914eba4..5fa5b867 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -85,7 +85,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index b81b475a..0900907a 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 package diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 0da1dceb..d5e2690d 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -49,7 +49,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 5e5fd76a..ff513322 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -63,7 +63,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 40120a6a..5d267786 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.2 + 3.5.3 false From e7afb3fb23b72709a10110fdf72c3b6d22770da3 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 29 Apr 2024 09:37:40 -0700 Subject: [PATCH 0913/1214] fix port header var naming --- .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 063f7143..9a18fc8e 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -481,9 +481,10 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public int getRemotePort() { if (Objects.nonNull(request.getRequestContext().getElb())) { - String hostHeader = request.getHeaders().get(PORT_HEADER_NAME); - if (Objects.nonNull(hostHeader)) - return Integer.parseInt(hostHeader); + String portHeader = request.getHeaders().get(PORT_HEADER_NAME); + if (Objects.nonNull(portHeader)) { + return Integer.parseInt(portHeader); + } } return 0; } From 46d96376daffc1159872d5ebad9e35c43b0df6f7 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 29 Apr 2024 23:28:33 -0700 Subject: [PATCH 0914/1214] update getRomteAddr() --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 1 + .../proxy/internal/servlet/AwsProxyHttpServletRequest.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index d17270d9..b76fd216 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -76,6 +76,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { static final String PROTOCOL_HEADER_NAME = "X-Forwarded-Proto"; static final String HOST_HEADER_NAME = "Host"; static final String PORT_HEADER_NAME = "X-Forwarded-Port"; + static final String CLIENT_IP_HEADER = "X-Forwarded-For"; //------------------------------------------------------------- diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 9a18fc8e..17d04a57 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -437,6 +437,9 @@ public String getRemoteAddr() { if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) { return "127.0.0.1"; } + if (request.getRequestContext().getElb() != null) { + return request.getHeaders().get(CLIENT_IP_HEADER); + } return request.getRequestContext().getIdentity().getSourceIp(); } From 6fcdd4c0a73baf8669091ec57715fed6fcf3ed99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 04:46:13 +0000 Subject: [PATCH 0915/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.4.0 to 4.8.5.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.4.0...spotbugs-maven-plugin-4.8.5.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89648fed..683fc40d 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.4.0 + 4.8.5.0 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 0ddec053..9a498786 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.5') { + implementation('org.springframework.boot:spring-boot-starter-web:3.2.6') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 74479a1f..2340a366 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.5 + 3.2.6 From 9d635d06f1fca980b20f6ec28826039b56b5bfb8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 27 May 2024 12:55:43 +0200 Subject: [PATCH 0925/1214] chore(deps): Update Jersey dependency to 3.1.7 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 09f9205d..757a84e7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.6 + 3.1.7 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index f0d0400c..346ad59b 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.1', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.6") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.7") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.6") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.7") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index ead8bda1..63fca831 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.6 + 3.1.7 2.17.1 5.10.2 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index d74bbf0e..086c66fc 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.1', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.6") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.7") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.6") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.7") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index b623ccc6..5348598a 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.6 + 3.1.7 2.17.1 From 0c7a6288ab46d71b276bbe11b15875dc551cac75 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 31 May 2024 08:29:34 +0200 Subject: [PATCH 0926/1214] chore(deps): Update spring-cloud-function-serverless-web to 4.1.2 --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 5a0019e5..4c669a8d 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.2-SNAPSHOT + 4.1.2 com.amazonaws.serverless From e2c90ae37dd0eae055884ca62e3b8a7406acd80d Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 31 May 2024 06:45:22 +0000 Subject: [PATCH 0927/1214] chore: release - prepare release aws-serverless-java-container-2.0.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a6278f9e..096d79a0 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 757a84e7..cf3446a5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8aa10630..7a1e41c1 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 4c669a8d..d04b91a9 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0-SNAPSHOT + 2.0.2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.0.2 6.1.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.0.2 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f4ae1567..bdd7de91 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0-SNAPSHOT + 2.0.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 07c5e4e9..39ca9e58 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0-SNAPSHOT + 2.0.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.2 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a1057f35..845f1b62 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.0.2 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0-SNAPSHOT + 2.0.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.2 diff --git a/pom.xml b/pom.xml index b1c83204..b5f3a0b0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0-SNAPSHOT + 2.0.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.0.2 From 9da0d7d3216db80cd37f5e2aea557672d682a3e7 Mon Sep 17 00:00:00 2001 From: deki Date: Fri, 31 May 2024 06:45:24 +0000 Subject: [PATCH 0928/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 096d79a0..a6278f9e 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index cf3446a5..757a84e7 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7a1e41c1..8aa10630 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index d04b91a9..4c669a8d 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.0.2 + 2.1.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.0.2 + 2.1.0-SNAPSHOT 6.1.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.0.2 + 2.1.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index bdd7de91..f4ae1567 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.0.2 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 39ca9e58..07c5e4e9 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.0.2 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.2 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 845f1b62..a1057f35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.0.2 + 2.1.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.0.2 + 2.1.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.2 + HEAD diff --git a/pom.xml b/pom.xml index b5f3a0b0..b1c83204 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.0.2 + 2.1.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.0.2 + HEAD From a4ae7b4ad5c40dbf9ed1926c10955114ecbfcb6c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 31 May 2024 10:39:24 +0200 Subject: [PATCH 0929/1214] chore(deps): Update Spring dependencies (security to 6.3.0, boot to 3.3.0) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index a6278f9e..6f2e18f4 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.2.4 + 6.3.0 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8aa10630..9fa13e6c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 6.1.8 - 6.2.4 + 6.3.0 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 4c669a8d..7abc29ee 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -16,8 +16,8 @@ 6.1.8 - 3.2.6 - 6.2.4 + 3.3.0 + 6.3.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 816ebaec..c71d8e6e 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.2.6', + 'org.springframework.boot:spring-boot-starter-web:3.3.0', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 2396c0ef..9c032f77 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 9a498786..b4d110a0 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.6') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.0') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index c2cf4da0..4c091d29 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 581b13bd..e522132e 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index d7a6fb44..826c647e 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 9a498786..b4d110a0 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.2.6') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.0') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 2340a366..7fe8681e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.0 From 2e481ce0a98e959f6cee47a56dbe9cc1d2e6a1ce Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 31 May 2024 10:42:31 +0200 Subject: [PATCH 0930/1214] chore(deps): Update Jakarta Websocket to 2.2.0 --- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 7abc29ee..4ecc79d6 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -180,14 +180,14 @@ jakarta.websocket jakarta.websocket-api - 2.1.1 + 2.2.0 test jakarta.websocket jakarta.websocket-client-api - 2.1.1 + 2.2.0 test From 038acbd84ea0589239f1555cc4d326774550d85e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 04:29:46 +0000 Subject: [PATCH 0931/1214] chore(deps): bump org.apache.maven.plugins:maven-enforcer-plugin Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.4.1 to 3.5.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.4.1...enforcer-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1c83204..c0956faa 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.4.1 + 3.5.0 enforce From 9a9ddb674cd076993460069dd7cb090b9b988870 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 04:29:51 +0000 Subject: [PATCH 0932/1214] chore(deps): bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.6.3 to 3.7.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.6.3...maven-javadoc-plugin-3.7.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1c83204..f9f2175d 100644 --- a/pom.xml +++ b/pom.xml @@ -201,7 +201,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.6.3 + 3.7.0 org.apache.maven.plugins From 95328c3e0b8dacd9e7b60cf16a2586ed70da7b20 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 4 Jun 2024 07:02:40 +0200 Subject: [PATCH 0933/1214] chore(deps): Update maven-shade-plugin to 3.6.0 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 63fca831..191ba74f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -107,7 +107,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 89035bf6..d88b5797 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -119,7 +119,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 package diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 9c032f77..f1a0d501 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 5348598a..549e8b8b 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -85,7 +85,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 6aae5db9..fbd76b97 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -95,7 +95,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 package diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 4c091d29..7d39cd9a 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -49,7 +49,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index e522132e..6e6db6ca 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -63,7 +63,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 7fe8681e..3c6c3a92 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.3 + 3.6.0 false From 7b73750b93381934b895200df7ad462362d078e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 04:25:20 +0000 Subject: [PATCH 0934/1214] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.2.5 to 3.3.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.2.5...surefire-3.3.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9c467e5..237b38f5 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.2.5 + 3.3.0 org.apache.maven.plugins From 2af97118475fbf417a427fa6493726d7f1992885 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 04:25:26 +0000 Subject: [PATCH 0935/1214] chore(deps): bump org.apache.maven.plugins:maven-release-plugin Bumps [org.apache.maven.plugins:maven-release-plugin](https://github.com/apache/maven-release) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/apache/maven-release/releases) - [Commits](https://github.com/apache/maven-release/compare/maven-release-3.0.1...maven-release-3.1.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-release-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9c467e5..4bfdb151 100644 --- a/pom.xml +++ b/pom.xml @@ -236,7 +236,7 @@ org.apache.maven.plugins maven-release-plugin - 3.0.1 + 3.1.0 serverless-java-container-release clean verify install From 9463113c314b16fcad299f2455ac68ccb5c52660 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Wed, 19 Jun 2024 06:55:59 -0700 Subject: [PATCH 0936/1214] fix: Error with version 2.0.2 when multi-value header is active in alb --- .../servlet/AwsProxyHttpServletRequest.java | 29 ++++++++++++------- .../AwsProxyHttpServletRequestTest.java | 16 +++++++++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 17d04a57..fe514e65 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -437,8 +437,10 @@ public String getRemoteAddr() { if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) { return "127.0.0.1"; } - if (request.getRequestContext().getElb() != null) { - return request.getHeaders().get(CLIENT_IP_HEADER); + if (request.getRequestSource().equals(RequestSource.ALB)) { + return Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(CLIENT_IP_HEADER) : + request.getMultiValueHeaders().getFirst(CLIENT_IP_HEADER); } return request.getRequestContext().getIdentity().getSourceIp(); } @@ -446,14 +448,16 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { - if (Objects.nonNull(request.getRequestContext().getElb())) { - String hostHeader = request.getHeaders().get(HttpHeaders.HOST); - - // the host header has the form host:port, so we split the string to get the host part - return Arrays.asList(hostHeader.split(":")).get(0); + String hostHeader; + if (request.getRequestSource().equals(RequestSource.ALB)) { + hostHeader = Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(HttpHeaders.HOST) : + request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); + } else { + hostHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); } - - return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); + // the host header has the form host:port, so we split the string to get the host part + return Arrays.asList(hostHeader.split(":")).get(0); } @@ -483,8 +487,11 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public int getRemotePort() { - if (Objects.nonNull(request.getRequestContext().getElb())) { - String portHeader = request.getHeaders().get(PORT_HEADER_NAME); + if (request.getRequestSource().equals(RequestSource.ALB)) { + String portHeader; + portHeader = Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(PORT_HEADER_NAME) : + request.getMultiValueHeaders().getFirst(PORT_HEADER_NAME); if (Objects.nonNull(portHeader)) { return Integer.parseInt(portHeader); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 45c38843..4edcf524 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -652,10 +652,11 @@ void serverName_albHostHeader_returnsHostHeader() { } @Test - void getRemoteHost_albHostHeader_returnsHostHeader() { + void getRemoteHost_albHostHeader_singleValue_returnsHostHeader() { initAwsProxyHttpServletRequestTest("ALB"); AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET") .alb().build(); + proxyReq.setMultiValueHeaders(null); proxyReq.getHeaders().put(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com"); HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null); @@ -663,6 +664,19 @@ void getRemoteHost_albHostHeader_returnsHostHeader() { assertEquals("testapi.us-east-1.elb.amazonaws.com", host); } + @Test + void getRemoteHost_albHostHeader_multiValue_returnsHostHeader() { + initAwsProxyHttpServletRequestTest("ALB"); + AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET") + .header(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com") + .alb().build(); + proxyReq.setHeaders(null); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null); + + String host = servletRequest.getRemoteHost(); + assertEquals("testapi.us-east-1.elb.amazonaws.com", host); + } + private AwsProxyRequestBuilder getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) From f98ac96e4da221d2a5d6468b8f26feb0760623c3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 20 Jun 2024 13:47:54 +0200 Subject: [PATCH 0937/1214] chore(deps): Update Spring dependencies (framework to 6.1.10, security to 6.3.1, boot to 3.3.1) --- .github/workflows/continuous-integration-workflow.yml | 7 +++++-- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 16 files changed, 25 insertions(+), 22 deletions(-) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index dbe5f05f..25228263 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - main + - 2.0.x - 1.x workflow_dispatch: @@ -59,7 +60,7 @@ jobs: - name: Build latest run: ./gha_build.sh spring true true # - name: Build with Spring 6.0.x -# run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.8 -Ddependency-check.skip=true +# run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.10 -Ddependency-check.skip=true build_springboot3: name: Build and test SpringBoot 3 @@ -75,7 +76,9 @@ jobs: run: ./gha_build.sh springboot3 true true # Build with additional supported versions https://spring.io/projects/spring-boot#support - name: Build with Spring Boot 3.1.x - run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.1.8 -Dspring.version=6.0.16 -Dspringsecurity.version=6.1.8 -Ddependency-check.skip=true + run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.1.12 -Dspring.version=6.0.21 -Dspringsecurity.version=6.1.9 -Ddependency-check.skip=true + - name: Build with Spring Boot 3.2.x + run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.2.7 -Dspring.version=6.1.10 -Dspringsecurity.version=6.2.5 -Ddependency-check.skip=true # temporarily disabled as Struts is not released at the moment # build_struts2: diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 6f2e18f4..c412ea54 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.3.0 + 6.3.1 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9fa13e6c..d82547e6 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.1.8 - 6.3.0 + 6.1.10 + 6.3.1 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 4ecc79d6..b64ebd6f 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.1.0-SNAPSHOT - 6.1.8 - 3.3.0 - 6.3.0 + 6.1.10 + 3.3.1 + 6.3.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 12d909c9..e444282e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.8', - 'org.springframework:spring-context:6.1.8', + 'org.springframework:spring-webmvc:6.1.10', + 'org.springframework:spring-context:6.1.10', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index d88b5797..e8d39e98 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.8 + 6.1.10 5.10.2 2.23.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index c71d8e6e..07387e7f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.3.0', + 'org.springframework.boot:spring-boot-starter-web:3.3.1', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index f1a0d501..263f4ef5 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 394581ea..9ef83f2d 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.8', - 'org.springframework:spring-context:6.1.8', + 'org.springframework:spring-webmvc:6.1.10', + 'org.springframework:spring-context:6.1.10', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index fbd76b97..e8a76ac6 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.8 + 6.1.10 2.23.1 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index b4d110a0..0982e130 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.0') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.1') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 7d39cd9a..c4ce5ff5 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 6e6db6ca..7f3c30ba 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 826c647e..5345e7f8 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index b4d110a0..0982e130 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.0') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.1') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 3c6c3a92..b582abb0 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.0 + 3.3.1 From 8ec710296dec04781ed44d864ea3826c100caf0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 04:51:31 +0000 Subject: [PATCH 0938/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.8.5 to 4.8.6. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.8.5...4.8.6) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 999f7479..cdd3fca1 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.8.5 + 4.8.6 provided From 9e4190b35d13c8452f062679e863d0be9578c943 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 04:51:39 +0000 Subject: [PATCH 0939/1214] chore(deps): bump org.apache.maven.plugins:maven-clean-plugin Bumps [org.apache.maven.plugins:maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.3.2 to 3.4.0. - [Release notes](https://github.com/apache/maven-clean-plugin/releases) - [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.3.2...maven-clean-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-clean-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 999f7479..203ca2be 100644 --- a/pom.xml +++ b/pom.xml @@ -211,7 +211,7 @@ org.apache.maven.plugins maven-clean-plugin - 3.3.2 + 3.4.0 org.apache.maven.plugins From b62d9860e8843a9eff8fbdbe0c420ab72166098a Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 24 Jun 2024 15:19:50 +0200 Subject: [PATCH 0940/1214] chore(deps): Update maven-jar-plugin to 3.4.2 --- aws-serverless-java-container-core/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index c412ea54..10e06b18 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -70,7 +70,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 191ba74f..936a72c9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -134,7 +134,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index e8d39e98..af417c9a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -157,7 +157,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 263f4ef5..1bd162b5 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -117,7 +117,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.4.2 default-jar diff --git a/pom.xml b/pom.xml index 203ca2be..e2ea58f7 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 org.apache.maven.plugins diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 549e8b8b..80ae54fb 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -112,7 +112,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index e8a76ac6..dcaf874b 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -133,7 +133,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index c4ce5ff5..91704d7f 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -83,7 +83,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 7f3c30ba..1a9c1397 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -97,7 +97,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index b582abb0..22caaa30 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -89,7 +89,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.4.1 + 3.4.2 default-jar From eb921c1b97999171b96685e9bd06634110eb609d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:43:16 +0000 Subject: [PATCH 0941/1214] chore(deps): bump com.amazonaws:aws-lambda-java-events Bumps [com.amazonaws:aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs) from 3.11.5 to 3.11.6. - [Commits](https://github.com/aws/aws-lambda-java-libs/commits) --- updated-dependencies: - dependency-name: com.amazonaws:aws-lambda-java-events dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store-native/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 5345e7f8..1e10f9c3 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -31,7 +31,7 @@ com.amazonaws aws-lambda-java-events - 3.11.5 + 3.11.6 com.amazonaws From a8e4801d9a6fae29f72735f69482a09f4a4714ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 05:06:38 +0000 Subject: [PATCH 0942/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.5.0 to 4.8.6.1. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.5.0...spotbugs-maven-plugin-4.8.6.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7fddf84d..3a20f686 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.5.0 + 4.8.6.1 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 3240cc4c..5fdd43e5 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,11 +14,11 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', - 'org.apache.struts:struts2-convention-plugin:7.0.0-M3', - 'org.apache.struts:struts2-rest-plugin:7.0.0-M3', - 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M3', - 'org.apache.struts:struts2-junit-plugin:7.0.0-M3', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.2', + 'org.apache.struts:struts2-convention-plugin:7.0.0-M8', + 'org.apache.struts:struts2-rest-plugin:7.0.0-M8', + 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M8', + 'org.apache.struts:struts2-junit-plugin:7.0.0-M8', + 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.3', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', 'jakarta.el:jakarta.el-api:5.0.1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 995f71e8..9c466a3a 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 7.0.0-M3 + 7.0.0-M8 2.17.2 4.13.2 2.23.1 @@ -68,7 +68,7 @@ com.jgeppert.struts2 struts2-aws-lambda-support-plugin - 1.4.2 + 1.4.3 From 78b940281dc87ae83451860609b8aa5a03587b25 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 15 Jul 2024 07:31:16 +0200 Subject: [PATCH 0957/1214] chore(deps-dev): Bumps org.apache.httpcomponents.client5:httpclient5 from 5.2.1 to 5.3.1. --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 0c8a117c..9a10c3e9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,7 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") testImplementation(platform("org.junit:junit-bom:5.10.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 1389f62f..12bbde8f 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -37,7 +37,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.2.1 + 5.3.1 test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 7599cad7..df2dda90 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,7 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") testImplementation(platform("org.junit:junit-bom:5.10.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 88e42442..2837d9c8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.2.1 + 5.3.1 test diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 2e6da08d..aac160ec 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") testImplementation(platform("org.junit:junit-bom:5.10.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index affb9e19..48ec5772 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -41,7 +41,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.2.1 + 5.3.1 test diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 26a1dd23..28a42f18 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -42,7 +42,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.2.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") testImplementation(platform("org.junit:junit-bom:5.10.3")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M8') { diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 25b256eb..1f8e981f 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.2.1 + 5.3.1 test From 85e93476ba515491e8d979b731d0888013212ab1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 05:07:38 +0000 Subject: [PATCH 0958/1214] chore(deps): bump org.owasp:dependency-check-maven from 10.0.2 to 10.0.3 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 10.0.2 to 10.0.3. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v10.0.2...v10.0.3) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 794e1680..ec5efeeb 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 10.0.2 + 10.0.3 2.17.2 2.0.13 5.10.3 From 60d84ac7b51584e50ebc1584ff93f34d813649d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 05:07:42 +0000 Subject: [PATCH 0959/1214] chore(deps-dev): bump com.h2database:h2 from 2.2.224 to 2.3.230 Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.2.224 to 2.3.230. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-2.2.224...version-2.3.230) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b64ebd6f..ad3ac15a 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -226,7 +226,7 @@ com.h2database h2 - 2.2.224 + 2.3.230 test From 76d5b655c1056966e57b85d5e7a40573bae104c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 05:07:44 +0000 Subject: [PATCH 0960/1214] chore(deps): bump commons-codec:commons-codec from 1.17.0 to 1.17.1 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.17.0 to 1.17.1. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.17.0...rel/commons-codec-1.17.1) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 757a84e7..ea428d88 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -64,7 +64,7 @@ commons-codec commons-codec - 1.17.0 + 1.17.1 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d82547e6..e94a9081 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -53,7 +53,7 @@ commons-codec commons-codec - 1.17.0 + 1.17.1 test From 11fbe3afa98453570a6cf43849a3dc8a0c876380 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 05:07:46 +0000 Subject: [PATCH 0961/1214] chore(deps): bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.7.0 to 3.8.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.7.0...maven-javadoc-plugin-3.8.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 794e1680..fe614867 100644 --- a/pom.xml +++ b/pom.xml @@ -201,7 +201,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.7.0 + 3.8.0 org.apache.maven.plugins From 2bddeae3501d9c11fa337cef2e178031699af978 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 29 Jul 2024 12:25:33 +0200 Subject: [PATCH 0962/1214] chore(deps): Update Spring dependencies (framework to 6.1.11, boot to 3.3.2) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d82547e6..10e68ab8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 6.1.10 + 6.1.11 6.3.1 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b64ebd6f..19e96815 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,8 +15,8 @@ 2.1.0-SNAPSHOT - 6.1.10 - 3.3.1 + 6.1.11 + 3.3.2 6.3.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index df2dda90..627258e7 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.10', - 'org.springframework:spring-context:6.1.10', + 'org.springframework:spring-webmvc:6.1.11', + 'org.springframework:spring-context:6.1.11', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 2837d9c8..fb7ea1d6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.10 + 6.1.11 5.10.3 2.23.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index aac160ec..b472edd1 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.3.1', + 'org.springframework.boot:spring-boot-starter-web:3.3.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 48ec5772..dbf6328b 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 931e516e..7c61f9ae 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.10', - 'org.springframework:spring-context:6.1.10', + 'org.springframework:spring-webmvc:6.1.11', + 'org.springframework:spring-context:6.1.11', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index fcc610a6..5521b4c0 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.10 + 6.1.11 2.23.1 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 0982e130..60efe6a7 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 944aac50..f4313cf7 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 45f23587..57868b53 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 2b26aa57..b939c1b9 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 0982e130..60efe6a7 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 22a97447..10546c8e 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.1 + 3.3.2 From 3800547e9d34a8b4e88cd46358c3bdef981aba1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 10:37:50 +0000 Subject: [PATCH 0963/1214] chore(deps): bump com.amazonaws:aws-lambda-java-events Bumps [com.amazonaws:aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs) from 3.12.0 to 3.13.0. - [Commits](https://github.com/aws/aws-lambda-java-libs/commits) --- updated-dependencies: - dependency-name: com.amazonaws:aws-lambda-java-events dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store-native/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index b939c1b9..22375510 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -31,7 +31,7 @@ com.amazonaws aws-lambda-java-events - 3.12.0 + 3.13.0 com.amazonaws From db0f4bc4cb3ea6f9b42ae76682f440cdeff0c9fd Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Aug 2024 07:27:55 +0200 Subject: [PATCH 0964/1214] chore: add groups to dependabot configuration --- .github/dependabot.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6dfe9ec4..0c40bd97 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,11 +8,25 @@ updates: - package-ecosystem: maven directories: - "**/*" + groups: + jersey: + patterns: + - "org.glassfish.jersey:*" + spring: + patterns: + - "org.springframework:*" schedule: interval: "weekly" open-pull-requests-limit: 20 - package-ecosystem: gradle directories: - "**/*" + groups: + jersey: + patterns: + - "org.glassfish.jersey:*" + spring: + patterns: + - "org.springframework:*" schedule: interval: "weekly" \ No newline at end of file From 42d998b39297f45b9af4af9c15c90956e5ee2cc4 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 5 Aug 2024 08:59:43 +0200 Subject: [PATCH 0965/1214] chore(deps): Update Jersey dependency to 3.1.8 --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ea428d88..bf395818 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.7 + 3.1.8 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 9a10c3e9..8df31959 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.7") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.8") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.7") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.8") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 12bbde8f..947b827d 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.7 + 3.1.8 2.17.2 5.10.3 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 21734669..db641d14 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.7") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.8") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.7") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.8") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 34b953aa..5736c49d 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.7 + 3.1.8 2.17.2 From 72bd0d2c7d0b663783a826ee27035195953fe930 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 19 Aug 2024 07:33:47 +0200 Subject: [PATCH 0966/1214] chore(deps): add more groups to dependabot.yml --- .github/dependabot.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0c40bd97..0cbe65d7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,10 +11,16 @@ updates: groups: jersey: patterns: - - "org.glassfish.jersey:*" + - "org.glassfish.jersey.*:*" spring: patterns: - "org.springframework:*" + slf4j: + patterns: + - "org.slf4j:*" + junit: + patterns: + - "org.junit:*" schedule: interval: "weekly" open-pull-requests-limit: 20 @@ -28,5 +34,8 @@ updates: spring: patterns: - "org.springframework:*" + slf4j: + patterns: + - "org.slf4j:*" schedule: interval: "weekly" \ No newline at end of file From 8d6a29d19f7d479b1c92ab37fa67765a4510950e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 19 Aug 2024 09:22:21 +0200 Subject: [PATCH 0967/1214] chore(deps): update SLF4J version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 417da692..c810299f 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 0.7 10.0.3 2.17.2 - 2.0.13 + 2.0.16 5.10.3 5.12.0 1.3 From 6a9902a01b621c5a2b9e5f18c2e9a8c8a23f58b3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 19 Aug 2024 09:26:10 +0200 Subject: [PATCH 0968/1214] chore(deps): update JUnit version to 5.11.0 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 8df31959..bed89619 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") - testImplementation(platform("org.junit:junit-bom:5.10.3")) + testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 947b827d..f2367ba2 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.8 2.17.2 - 5.10.3 + 5.11.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 627258e7..0d548391 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") - testImplementation(platform("org.junit:junit-bom:5.10.3")) + testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index fb7ea1d6..3422f4f2 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.1.11 - 5.10.3 + 5.11.0 2.23.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index b472edd1..a22582d1 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") - testImplementation(platform("org.junit:junit-bom:5.10.3")) + testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index dbf6328b..c13ba13d 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.10.3 + 5.11.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 28a42f18..8d96159a 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -43,7 +43,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") - testImplementation(platform("org.junit:junit-bom:5.10.3")) + testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M8') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 1f8e981f..5803bd2e 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 7.0.0-M8 2.17.2 - 5.10.3 + 5.11.0 2.23.1 diff --git a/pom.xml b/pom.xml index c810299f..a6ce83e9 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 10.0.3 2.17.2 2.0.16 - 5.10.3 + 5.11.0 5.12.0 1.3 UTF-8 From 67b85433f57d7f3b048436ffea8b0ccf1c3e4b76 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 20 Aug 2024 09:24:48 +0200 Subject: [PATCH 0969/1214] chore(deps): Update spring-cloud-function-serverless-web to 4.1.3 --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 7c7972c7..295dd4af 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.2 + 4.1.3 com.amazonaws.serverless From 5b29e9621f712fdcafe9e462862f6882e7d67f38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:21:37 +0000 Subject: [PATCH 0970/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.2...maven-deploy-plugin-3.1.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a6ce83e9..9aac9de6 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.2 + 3.1.3 org.apache.maven.plugins From cfc5f93ece4163f6e95fc8530274fcf5728b636d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:21:53 +0000 Subject: [PATCH 0971/1214] chore(deps-dev): bump com.h2database:h2 from 2.3.230 to 2.3.232 Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.3.230 to 2.3.232. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-2.3.230...version-2.3.232) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 295dd4af..23d590d1 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -226,7 +226,7 @@ com.h2database h2 - 2.3.230 + 2.3.232 test From 035e7ccaadbc7c9f727885d76335539496fd80af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:21:57 +0000 Subject: [PATCH 0972/1214] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.3.1...surefire-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a6ce83e9..3d65a98f 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.3.1 + 3.4.0 org.apache.maven.plugins From 1ef0ec2b266bf60d7e06dc26f6f46be1d8e90066 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:22:50 +0000 Subject: [PATCH 0973/1214] chore(deps-dev): bump com.h2database:h2 Bumps [com.h2database:h2](https://github.com/h2database/h2database) from 2.3.230 to 2.3.232. - [Release notes](https://github.com/h2database/h2database/releases) - [Commits](https://github.com/h2database/h2database/compare/version-2.3.230...version-2.3.232) --- updated-dependencies: - dependency-name: com.h2database:h2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 295dd4af..23d590d1 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -226,7 +226,7 @@ com.h2database h2 - 2.3.230 + 2.3.232 test From 0fc74307e15464afd42c6e3af8dddb600ac9bdf0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Aug 2024 09:35:44 +0200 Subject: [PATCH 0974/1214] chore(deps): Update Spring dependencies (framework to 6.1.12, security to 6.3.3, boot to 3.3.3) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 10e06b18..f3b93880 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.3.1 + 6.3.3 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index adf8d0f2..0130a93c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.1.11 - 6.3.1 + 6.1.12 + 6.3.3 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 295dd4af..b4dbf1cd 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.1.0-SNAPSHOT - 6.1.11 - 3.3.2 - 6.3.1 + 6.1.12 + 3.3.3 + 6.3.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 0d548391..daaf6142 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.11', - 'org.springframework:spring-context:6.1.11', + 'org.springframework:spring-webmvc:6.1.12', + 'org.springframework:spring-context:6.1.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 3422f4f2..759b3ad2 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.11 + 6.1.12 5.11.0 2.23.1 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index a22582d1..c14e9e84 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.3.2', + 'org.springframework.boot:spring-boot-starter-web:3.3.3', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index c13ba13d..5a869829 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 7c61f9ae..796b98c2 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.11', - 'org.springframework:spring-context:6.1.11', + 'org.springframework:spring-webmvc:6.1.12', + 'org.springframework:spring-context:6.1.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.23.1', 'org.apache.logging.log4j:log4j-api:2.23.1', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 5521b4c0..44e9aaf7 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.11 + 6.1.12 2.23.1 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 60efe6a7..444656ed 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index f4313cf7..6c27f7c3 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 57868b53..be77bc8d 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 22375510..d97fe615 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 60efe6a7..444656ed 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 10546c8e..e2832acf 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.2 + 3.3.3 From 1faca719891f083170109875ef6f0a630a817e60 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 23 Aug 2024 09:47:39 +0200 Subject: [PATCH 0975/1214] chore: add groups to dependabot configuration --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0cbe65d7..cc36223d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -21,6 +21,9 @@ updates: junit: patterns: - "org.junit:*" + maven-install-plugin: + patterns: + - "org.apache.maven.plugins:maven-install-plugin" schedule: interval: "weekly" open-pull-requests-limit: 20 From 69818ed0707454400cb71c0b7e8cb46b67b1dd4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:48:59 +0000 Subject: [PATCH 0976/1214] chore(deps): bump the maven-install-plugin group across 15 directories with 1 update Bumps the maven-install-plugin group with 1 update in the / directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-core directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-jersey directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-spring directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-springboot3 directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-struts directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-jersey-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-spring-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-springboot3-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-struts-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/jersey/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/spring/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/alt-pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/graphql-pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.2 to 3.1.3 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.2...maven-install-plugin-3.1.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index a6ce83e9..7e0034f7 100644 --- a/pom.xml +++ b/pom.xml @@ -231,7 +231,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 org.apache.maven.plugins diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 5736c49d..7bdc7ce4 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -123,7 +123,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 true diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 44e9aaf7..6cc5a2c4 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -144,7 +144,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 true diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 6c27f7c3..647c09d3 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -94,7 +94,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 true diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index be77bc8d..2650b0f1 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -108,7 +108,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 true diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index e2832acf..502620b9 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -100,7 +100,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.2 + 3.1.3 true From 72af4526d495d7da71f4837193f5e051afb48872 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 9 Sep 2024 10:17:10 +0200 Subject: [PATCH 0977/1214] chore(deps): Update Log4J dependencies to 2.24.0 --- .github/dependabot.yml | 6 ++++++ .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 9 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cc36223d..96dd4d8b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,6 +18,9 @@ updates: slf4j: patterns: - "org.slf4j:*" + log4j: + patterns: + - "org.apache.logging.log4j:*" junit: patterns: - "org.junit:*" @@ -40,5 +43,8 @@ updates: slf4j: patterns: - "org.slf4j:*" + log4j: + patterns: + - "org.apache.logging.log4j:*" schedule: interval: "weekly" \ No newline at end of file diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index daaf6142..bc675d8f 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.12', 'org.springframework:spring-context:6.1.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.23.1', - 'org.apache.logging.log4j:log4j-api:2.23.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.1', + 'org.apache.logging.log4j:log4j-core:2.24.0', + 'org.apache.logging.log4j:log4j-api:2.24.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', 'com.fasterxml.jackson.core:jackson-databind:2.17.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 759b3ad2..4860c66e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.1.12 5.11.0 - 2.23.1 + 2.24.0 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 8d96159a..64b60952 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.17.2') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.2') - implementation ('org.apache.logging.log4j:log4j-core:2.23.1') - implementation ('org.apache.logging.log4j:log4j-api:2.23.1') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.23.1') + implementation ('org.apache.logging.log4j:log4j-core:2.24.0') + implementation ('org.apache.logging.log4j:log4j-api:2.24.0') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.24.0') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 5803bd2e..5c1c2987 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 7.0.0-M8 2.17.2 5.11.0 - 2.23.1 + 2.24.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 796b98c2..2b3e01a9 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.12', 'org.springframework:spring-context:6.1.12', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.23.1', - 'org.apache.logging.log4j:log4j-api:2.23.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.23.1', + 'org.apache.logging.log4j:log4j-core:2.24.0', + 'org.apache.logging.log4j:log4j-api:2.24.0', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', 'com.fasterxml.jackson.core:jackson-databind:2.17.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 6cc5a2c4..2949da8d 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.1.12 - 2.23.1 + 2.24.0 17 17 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 5fdd43e5..56deb9a5 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -24,8 +24,8 @@ dependencies { 'jakarta.el:jakarta.el-api:5.0.1', 'com.fasterxml.jackson.core:jackson-databind:2.17.2', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.2', - 'org.apache.logging.log4j:log4j-core:2.23.1', - 'org.apache.logging.log4j:log4j-api:2.23.1', + 'org.apache.logging.log4j:log4j-core:2.24.0', + 'org.apache.logging.log4j:log4j-api:2.24.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 9c466a3a..8e3f7f13 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 7.0.0-M8 2.17.2 4.13.2 - 2.23.1 + 2.24.0 From 71eac1f27ddda37038c0973de0d9fe052b06b329 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 20 Sep 2024 15:52:09 +0200 Subject: [PATCH 0978/1214] chore(deps): Update Spring dependencies (framework to 6.1.13, boot to 3.3.4) --- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index f152c419..953e8bdb 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,8 +15,8 @@ 2.1.0-SNAPSHOT - 6.1.12 - 3.3.3 + 6.1.13 + 3.3.4 6.3.3 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index c14e9e84..47925cfc 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.3.3', + 'org.springframework.boot:spring-boot-starter-web:3.3.4', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 5a869829..042d5a50 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 444656ed..4e5bf513 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 647c09d3..28ab529c 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 2650b0f1..38440b37 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index d97fe615..e8c1fbc3 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 444656ed..4e5bf513 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 502620b9..56b0ab8a 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.3 + 3.3.4 From ed8d0b579520e59b48000970ed06e8be1b7e09ce Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 20 Sep 2024 16:04:05 +0200 Subject: [PATCH 0979/1214] chore(deps): Update Spring dependencies (framework to 6.1.13, boot to 3.3.4) --- aws-serverless-java-container-spring/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 0130a93c..d160a911 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 6.1.12 + 6.1.13 6.3.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index bc675d8f..14553158 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.12', - 'org.springframework:spring-context:6.1.12', + 'org.springframework:spring-webmvc:6.1.13', + 'org.springframework:spring-context:6.1.13', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 4860c66e..0e007227 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.12 + 6.1.13 5.11.0 2.24.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 2b3e01a9..ba627f2e 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.12', - 'org.springframework:spring-context:6.1.12', + 'org.springframework:spring-webmvc:6.1.13', + 'org.springframework:spring-context:6.1.13', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 2949da8d..9f2d29bb 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.12 + 6.1.13 2.24.0 17 17 From 6184609ac2b5ec788295ba05ea67634cc39a6bb8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 20 Sep 2024 16:08:33 +0200 Subject: [PATCH 0980/1214] chore(deps): updated some struts dependencies (although currently not released) --- aws-serverless-java-container-struts/pom.xml | 2 +- .../main/resources/archetype-resources/build.gradle | 10 +++++----- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 8 ++++---- samples/struts/pet-store/pom.xml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-struts/pom.xml b/aws-serverless-java-container-struts/pom.xml index e06abbf0..4546f472 100644 --- a/aws-serverless-java-container-struts/pom.xml +++ b/aws-serverless-java-container-struts/pom.xml @@ -15,7 +15,7 @@ - 7.0.0-M8 + 7.0.0-M9 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 64b60952..892b44d3 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,19 +18,19 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M8') { + implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M9') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M8') { + implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M9') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M8') { + implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M9') { exclude group: 'org.apache.struts', module: 'struts2-core' } implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.3') { exclude group: 'org.apache.struts', module: 'struts2-core' } - implementation ('org.apache.struts:struts2-core:7.0.0-M8') { + implementation ('org.apache.struts:struts2-core:7.0.0-M9') { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') @@ -45,7 +45,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M8') { + testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M9') { exclude group: 'org.apache.struts', module: 'struts2-core' } } diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 5c1c2987..9b7fb33a 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 7.0.0-M8 + 7.0.0-M9 2.17.2 5.11.0 2.24.0 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 56deb9a5..85eb0492 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -14,10 +14,10 @@ configurations { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', - 'org.apache.struts:struts2-convention-plugin:7.0.0-M8', - 'org.apache.struts:struts2-rest-plugin:7.0.0-M8', - 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M8', - 'org.apache.struts:struts2-junit-plugin:7.0.0-M8', + 'org.apache.struts:struts2-convention-plugin:7.0.0-M9', + 'org.apache.struts:struts2-rest-plugin:7.0.0-M9', + 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M9', + 'org.apache.struts:struts2-junit-plugin:7.0.0-M9', 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.3', 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 8e3f7f13..09a6e411 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 7.0.0-M8 + 7.0.0-M9 2.17.2 4.13.2 2.24.0 From eb25f48581b12a3f4cb06b14d6d04cb3862d389b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:12:28 +0000 Subject: [PATCH 0981/1214] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.4.0...surefire-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b282f140..25c610ae 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.4.0 + 3.5.0 org.apache.maven.plugins From 9f61d504466c8f2796c580b25c2b8f2b62953a17 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 22 Sep 2024 15:10:34 +0900 Subject: [PATCH 0982/1214] Add unit test to verify cookie behavior with Max-Age=0 --- .../servlet/AwsHttpServletResponseTest.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 6c951a4f..88d2a5e7 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -17,6 +17,7 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.util.Calendar; +import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.CountDownLatch; import java.util.regex.Matcher; @@ -36,7 +37,7 @@ public class AwsHttpServletResponseTest { private static final int MAX_AGE_VALUE = 300; private static final Pattern MAX_AGE_PATTERN = Pattern.compile("Max-Age=(-?[0-9]+)"); - private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=(.*)$"); + private static final Pattern EXPIRES_PATTERN = Pattern.compile("Expires=([^;]+)"); private static final String CONTENT_TYPE_WITH_CHARSET = "application/json; charset=UTF-8"; private static final String JAVASCRIPT_CONTENT_TYPE_WITH_CHARSET = "application/javascript; charset=UTF-8"; @@ -144,6 +145,23 @@ void cookie_addCookieWithoutMaxAge_expectNoExpires() { assertFalse(cookieHeader.contains("Expires")); } + @Test + void cookie_addCookieWithMaxAgeZero_expectExpiresInThePast() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + Cookie zeroMaxAgeCookie = new Cookie(COOKIE_NAME, COOKIE_VALUE); + zeroMaxAgeCookie.setMaxAge(0); + + resp.addCookie(zeroMaxAgeCookie); + String cookieHeader = resp.getHeader(HttpHeaders.SET_COOKIE); + + Calendar cal = getExpires(cookieHeader); + long currentTimeMillis = System.currentTimeMillis(); + + assertNotNull(cookieHeader); + assertTrue(cal.getTimeInMillis() < currentTimeMillis); + assertTrue(cookieHeader.contains(COOKIE_NAME + "=" + COOKIE_VALUE)); + } + @Test void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); @@ -352,7 +370,7 @@ private Calendar getExpires(String header) { assertTrue(ageMatcher.find()); assertTrue(ageMatcher.groupCount() >= 1); String expiresString = ageMatcher.group(1); - SimpleDateFormat sdf = new SimpleDateFormat(AwsHttpServletResponse.HEADER_DATE_PATTERN); + SimpleDateFormat sdf = new SimpleDateFormat(AwsHttpServletResponse.HEADER_DATE_PATTERN, Locale.US); Calendar cal = Calendar.getInstance(); try { cal.setTime(sdf.parse(expiresString)); From 3a720953f276b76207f099e665386c146683ec71 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 22 Sep 2024 17:15:35 +0900 Subject: [PATCH 0983/1214] Add Servlet request tests to validate RFC 6265 cookie compliance --- .../servlet/AwsHttpServletRequestTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 2bc43304..358d673a 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -26,6 +26,12 @@ public class AwsHttpServletRequestTest { .header(HttpHeaders.CONTENT_TYPE, "application/xml; charset=utf-8").build(); private static final AwsProxyRequest validCookieRequest = new AwsProxyRequestBuilder("/cookie", "GET") .header(HttpHeaders.COOKIE, "yummy_cookie=choco; tasty_cookie=strawberry").build(); + private static final AwsProxyRequest controlCharCookieRequest = new AwsProxyRequestBuilder("/cookie", "GET") + .header(HttpHeaders.COOKIE, "name=\u0007\u0009; tasty_cookie=strawberry").build(); + private static final AwsProxyRequest unicodeCookieRequest = new AwsProxyRequestBuilder("/cookie", "GET") + .header(HttpHeaders.COOKIE, "yummy_cookie=chøcø; tasty_cookie=strawberry").build(); + private static final AwsProxyRequest invalidNameCookieRequest = new AwsProxyRequestBuilder("/cookie", "GET") + .header(HttpHeaders.COOKIE, "yummy@cookie=choco; tasty_cookie=strawberry").build(); private static final AwsProxyRequest complexAcceptHeader = new AwsProxyRequestBuilder("/accept", "GET") .header(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8").build(); private static final AwsProxyRequest queryString = new AwsProxyRequestBuilder("/test", "GET") @@ -75,6 +81,39 @@ void headers_parseHeaderValue_validMultipleCookie() { assertEquals("strawberry", values.get(1).getValue()); } + @Test + void headers_parseHeaderValue_controlCharCookie() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(controlCharCookieRequest, mockContext, null, config); + Cookie[] cookies = request.getCookies(); + + // parse only valid cookies + assertEquals(1, cookies.length); + assertEquals("tasty_cookie", cookies[0].getName()); + assertEquals("strawberry", cookies[0].getValue()); + } + + @Test + void headers_parseHeaderValue_unicodeCookie() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(unicodeCookieRequest, mockContext, null, config); + Cookie[] cookies = request.getCookies(); + + // parse only valid cookies + assertEquals(1, cookies.length); + assertEquals("tasty_cookie", cookies[0].getName()); + assertEquals("strawberry", cookies[0].getValue()); + } + + @Test + void headers_parseHeaderValue_invalidNameCookie() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(invalidNameCookieRequest, mockContext, null, config); + Cookie[] cookies = request.getCookies(); + + // parse only valid cookies + assertEquals(1, cookies.length); + assertEquals("tasty_cookie", cookies[0].getName()); + assertEquals("strawberry", cookies[0].getValue()); + } + @Test void headers_parseHeaderValue_complexAccept() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(complexAcceptHeader, mockContext, null, config); From c04fd1387cf4b20207abd43225ea06ffc8973277 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sun, 22 Sep 2024 19:57:39 +0900 Subject: [PATCH 0984/1214] feat: Introduce CookieProcessor interface and refactor cookie handling - Created a `CookieProcessor` interface along with its implementation `AwsCookieProcessor` to encapsulate cookie parsing and formatting logic. - Modified `AwsHttpServletResponse` and `AwsHttpServletRequest` to use the `CookieProcessor` for all cookie-related operations. --- .../internal/servlet/AwsCookieProcessor.java | 275 ++++++++++++++++++ .../AwsHttpApiV2ProxyHttpServletRequest.java | 17 +- .../servlet/AwsHttpServletRequest.java | 15 +- .../servlet/AwsHttpServletResponse.java | 35 +-- .../internal/servlet/CookieProcessor.java | 23 ++ 5 files changed, 317 insertions(+), 48 deletions(-) create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java create mode 100644 aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/CookieProcessor.java diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java new file mode 100644 index 00000000..2a849608 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java @@ -0,0 +1,275 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import com.amazonaws.serverless.proxy.internal.SecurityUtils; +import jakarta.servlet.http.Cookie; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.DateFormat; +import java.text.FieldPosition; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Implementation of the CookieProcessor interface that provides cookie parsing and generation functionality. + */ +public class AwsCookieProcessor implements CookieProcessor { + + // Cookie attribute constants + static final String COOKIE_COMMENT_ATTR = "Comment"; + static final String COOKIE_DOMAIN_ATTR = "Domain"; + static final String COOKIE_MAX_AGE_ATTR = "Max-Age"; + static final String COOKIE_PATH_ATTR = "Path"; + static final String COOKIE_SECURE_ATTR = "Secure"; + static final String COOKIE_HTTP_ONLY_ATTR = "HttpOnly"; + static final String COOKIE_SAME_SITE_ATTR = "SameSite"; + static final String COOKIE_PARTITIONED_ATTR = "Partitioned"; + static final String EMPTY_STRING = ""; + + // BitSet to store valid token characters as defined in RFC 2616 + static final BitSet tokenValid = createTokenValidSet(); + + // BitSet to validate domain characters + static final BitSet domainValid = createDomainValidSet(); + + static final String COOKIE_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; + + // ThreadLocal to ensure thread-safe creation of DateFormat instances for each thread + static final ThreadLocal COOKIE_DATE_FORMAT = ThreadLocal.withInitial(() -> { + DateFormat df = new SimpleDateFormat(COOKIE_DATE_PATTERN, Locale.US); + df.setTimeZone(TimeZone.getTimeZone("GMT")); + return df; + }); + + static final String ANCIENT_DATE = COOKIE_DATE_FORMAT.get().format(new Date(10000)); + + static BitSet createTokenValidSet() { + BitSet tokenSet = new BitSet(128); + for (char c = '0'; c <= '9'; c++) tokenSet.set(c); + for (char c = 'a'; c <= 'z'; c++) tokenSet.set(c); + for (char c = 'A'; c <= 'Z'; c++) tokenSet.set(c); + for (char c : "!#$%&'*+-.^_`|~".toCharArray()) tokenSet.set(c); + return tokenSet; + } + + static BitSet createDomainValidSet() { + BitSet domainValid = new BitSet(128); + for (char c = '0'; c <= '9'; c++) domainValid.set(c); + for (char c = 'a'; c <= 'z'; c++) domainValid.set(c); + for (char c = 'A'; c <= 'Z'; c++) domainValid.set(c); + domainValid.set('.'); + domainValid.set('-'); + return domainValid; + } + + private final Logger log = LoggerFactory.getLogger(AwsCookieProcessor.class); + + @Override + public Cookie[] parseCookieHeader(String cookieHeader) { + // Return an empty array if the input is null or empty after trimming + if (cookieHeader == null || cookieHeader.trim().isEmpty()) { + return new Cookie[0]; + } + + // Parse cookie header and convert to Cookie array + return Arrays.stream(cookieHeader.split("\\s*;\\s*")) + .map(this::parseCookiePair) + .filter(Objects::nonNull) // Filter out invalid pairs + .toArray(Cookie[]::new); + } + + /** + * Parse a single cookie pair (name=value). + * + * @param cookiePair The cookie pair string. + * @return A valid Cookie object or null if the pair is invalid. + */ + private Cookie parseCookiePair(String cookiePair) { + String[] kv = cookiePair.split("=", 2); + + if (kv.length != 2) { + log.warn("Ignoring invalid cookie: {}", cookiePair); + return null; // Skip malformed cookie pairs + } + + String cookieName = kv[0]; + String cookieValue = kv[1]; + + // Validate name and value + if (!isToken(cookieName)){ + log.warn("Ignoring cookie with invalid name: {}={}", cookieName, cookieValue); + return null; // Skip invalid cookie names + } + + if (!isValidCookieValue(cookieValue)) { + log.warn("Ignoring cookie with invalid value: {}={}", cookieName, cookieValue); + return null; // Skip invalid cookie values + } + + // Return a new Cookie object after security processing + return new Cookie(SecurityUtils.crlf(cookieName), SecurityUtils.crlf(cookieValue)); + } + + @Override + public String generateHeader(Cookie cookie) { + StringBuffer header = new StringBuffer(); + header.append(cookie.getName()).append('='); + + String value = cookie.getValue(); + if (value != null && value.length() > 0) { + validateCookieValue(value); + header.append(value); + } + + int maxAge = cookie.getMaxAge(); + if (maxAge > -1) { + header.append("; Expires="); + if (maxAge == 0) { + header.append(ANCIENT_DATE); + } else { + COOKIE_DATE_FORMAT.get().format( + new Date(System.currentTimeMillis() + maxAge * 1000L), header, new FieldPosition(0)); + header.append("; Max-Age=").append(maxAge); + } + } + + String domain = cookie.getDomain(); + if (domain != null && !domain.isEmpty()) { + validateDomain(domain); + header.append("; Domain=").append(domain); + } + + String path = cookie.getPath(); + if (path != null && !path.isEmpty()) { + validatePath(path); + header.append("; Path=").append(path); + } + + if (cookie.getSecure()) { + header.append("; Secure"); + } + + if (cookie.isHttpOnly()) { + header.append("; HttpOnly"); + } + + String sameSite = cookie.getAttribute(COOKIE_SAME_SITE_ATTR); + if (sameSite != null) { + header.append("; SameSite=").append(sameSite); + } + + String partitioned = cookie.getAttribute(COOKIE_PARTITIONED_ATTR); + if (EMPTY_STRING.equals(partitioned)) { + header.append("; Partitioned"); + } + + addAdditionalAttributes(cookie, header); + + return header.toString(); + } + + private void addAdditionalAttributes(Cookie cookie, StringBuffer header) { + for (Map.Entry entry : cookie.getAttributes().entrySet()) { + switch (entry.getKey()) { + case COOKIE_COMMENT_ATTR: + case COOKIE_DOMAIN_ATTR: + case COOKIE_MAX_AGE_ATTR: + case COOKIE_PATH_ATTR: + case COOKIE_SECURE_ATTR: + case COOKIE_HTTP_ONLY_ATTR: + case COOKIE_SAME_SITE_ATTR: + case COOKIE_PARTITIONED_ATTR: + // Already handled attributes are ignored + break; + default: + validateAttribute(entry.getKey(), entry.getValue()); + header.append("; ").append(entry.getKey()); + if (!EMPTY_STRING.equals(entry.getValue())) { + header.append('=').append(entry.getValue()); + } + break; + } + } + } + + private void validateCookieValue(String value) { + if (!isValidCookieValue(value)) { + throw new IllegalArgumentException("Invalid cookie value: " + value); + } + } + + private void validateDomain(String domain) { + if (!isValidDomain(domain)) { + throw new IllegalArgumentException("Invalid cookie domain: " + domain); + } + } + + private void validatePath(String path) { + for (char ch : path.toCharArray()) { + if (ch < 0x20 || ch > 0x7E || ch == ';') { + throw new IllegalArgumentException("Invalid cookie path: " + path); + } + } + } + + private void validateAttribute(String name, String value) { + if (!isToken(name)) { + throw new IllegalArgumentException("Invalid cookie attribute name: " + name); + } + + for (char ch : value.toCharArray()) { + if (ch < 0x20 || ch > 0x7E || ch == ';') { + throw new IllegalArgumentException("Invalid cookie attribute value: " + ch); + } + } + } + + private boolean isValidCookieValue(String value) { + int start = 0; + int end = value.length(); + boolean quoted = end > 1 && value.charAt(0) == '"' && value.charAt(end - 1) == '"'; + + char[] chars = value.toCharArray(); + for (int i = start; i < end; i++) { + if (quoted && (i == start || i == end - 1)) { + continue; + } + char c = chars[i]; + if (!isValidCookieChar(c)) return false; + } + return true; + } + + private boolean isValidDomain(String domain) { + if (domain.isEmpty()) { + return false; + } + int prev = -1; + for (char c : domain.toCharArray()) { + if (!domainValid.get(c) || isInvalidLabelStartOrEnd(prev, c)) { + return false; + } + prev = c; + } + return prev != '.' && prev != '-'; + } + + private boolean isInvalidLabelStartOrEnd(int prev, char current) { + return (prev == '.' || prev == -1) && (current == '.' || current == '-') || + (prev == '-' && current == '.'); + } + + private boolean isToken(String s) { + if (s.isEmpty()) return false; + for (char c : s.toCharArray()) { + if (!tokenValid.get(c)) { + return false; + } + } + return true; + } + + private boolean isValidCookieChar(char c) { + return !(c < 0x21 || c > 0x7E || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f); + } +} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 6fdb31f0..537e1075 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -37,7 +37,6 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; import java.util.*; -import java.util.stream.Collectors; import java.util.stream.Stream; public class AwsHttpApiV2ProxyHttpServletRequest extends AwsHttpServletRequest { @@ -81,26 +80,14 @@ public Cookie[] getCookies() { if (headers == null || !headers.containsKey(HttpHeaders.COOKIE)) { rhc = new Cookie[0]; } else { - rhc = parseCookieHeaderValue(headers.getFirst(HttpHeaders.COOKIE)); + rhc = getCookieProcessor().parseCookieHeader(headers.getFirst(HttpHeaders.COOKIE)); } Cookie[] rc; if (request.getCookies() == null) { rc = new Cookie[0]; } else { - rc = request.getCookies().stream() - .map(c -> { - int i = c.indexOf('='); - if (i == -1) { - return null; - } else { - String k = SecurityUtils.crlf(c.substring(0, i)).trim(); - String v = SecurityUtils.crlf(c.substring(i+1)); - return new Cookie(k, v); - } - }) - .filter(c -> c != null) - .toArray(Cookie[]::new); + rc = getCookieProcessor().parseCookieHeader(String.join("; ", request.getCookies())); } return Stream.concat(Arrays.stream(rhc), Arrays.stream(rc)).toArray(Cookie[]::new); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index b76fd216..ea8ef4a1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -90,6 +90,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest { private String queryString; private Map> multipartFormParameters; private Map> urlEncodedFormParameters; + private CookieProcessor cookieProcessor; protected AwsHttpServletResponse response; protected AwsLambdaServletContainerHandler containerHandler; @@ -295,12 +296,7 @@ public void setServletContext(ServletContext context) { * @return An array of Cookie objects from the header */ protected Cookie[] parseCookieHeaderValue(String headerValue) { - List parsedHeaders = this.parseHeaderValue(headerValue, ";", ","); - - return parsedHeaders.stream() - .filter(e -> e.getKey() != null) - .map(e -> new Cookie(SecurityUtils.crlf(e.getKey()), SecurityUtils.crlf(e.getValue()))) - .toArray(Cookie[]::new); + return getCookieProcessor().parseCookieHeader(headerValue); } @@ -512,6 +508,13 @@ protected Map> getFormUrlEncodedParametersMap() { return urlEncodedFormParameters; } + protected CookieProcessor getCookieProcessor(){ + if (cookieProcessor == null) { + cookieProcessor = new AwsCookieProcessor(); + } + return cookieProcessor; + } + @Override public Collection getParts() throws IOException, ServletException { diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index f82d062a..86a72ead 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -70,6 +70,7 @@ public class AwsHttpServletResponse private CountDownLatch writersCountDownLatch; private HttpServletRequest request; private boolean isCommitted = false; + private CookieProcessor cookieProcessor; private Logger log = LoggerFactory.getLogger(AwsHttpServletResponse.class); @@ -102,33 +103,7 @@ public void addCookie(Cookie cookie) { if (request != null && request.getDispatcherType() == DispatcherType.INCLUDE && isCommitted()) { throw new IllegalStateException("Cannot add Cookies for include request when response is committed"); } - String cookieData = cookie.getName() + "=" + cookie.getValue(); - if (cookie.getPath() != null) { - cookieData += "; Path=" + cookie.getPath(); - } - if (cookie.getSecure()) { - cookieData += "; Secure"; - } - if (cookie.isHttpOnly()) { - cookieData += "; HttpOnly"; - } - if (cookie.getDomain() != null && !"".equals(cookie.getDomain().trim())) { - cookieData += "; Domain=" + cookie.getDomain(); - } - - if (cookie.getMaxAge() > 0) { - cookieData += "; Max-Age=" + cookie.getMaxAge(); - - // we always set the timezone to GMT - TimeZone gmtTimeZone = TimeZone.getTimeZone(COOKIE_DEFAULT_TIME_ZONE); - Calendar currentTimestamp = Calendar.getInstance(gmtTimeZone); - currentTimestamp.add(Calendar.SECOND, cookie.getMaxAge()); - SimpleDateFormat cookieDateFormatter = new SimpleDateFormat(HEADER_DATE_PATTERN); - cookieDateFormatter.setTimeZone(gmtTimeZone); - cookieData += "; Expires=" + cookieDateFormatter.format(currentTimestamp.getTime()); - } - - setHeader(HttpHeaders.SET_COOKIE, cookieData, false); + setHeader(HttpHeaders.SET_COOKIE, getCookieProcessor().generateHeader(cookie), false); } @@ -500,6 +475,12 @@ AwsProxyRequest getAwsProxyRequest() { return (AwsProxyRequest)request.getAttribute(API_GATEWAY_EVENT_PROPERTY); } + CookieProcessor getCookieProcessor(){ + if (cookieProcessor == null) { + cookieProcessor = new AwsCookieProcessor(); + } + return cookieProcessor; + } //------------------------------------------------------------- // Methods - Private diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/CookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/CookieProcessor.java new file mode 100644 index 00000000..c59dc806 --- /dev/null +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/CookieProcessor.java @@ -0,0 +1,23 @@ +package com.amazonaws.serverless.proxy.internal.servlet; + +import jakarta.servlet.http.Cookie; + +public interface CookieProcessor { + /** + * Parse the provided cookie header value into an array of Cookie objects. + * + * @param cookieHeader The cookie header value string to parse, e.g., "SID=31d4d96e407aad42; lang=en-US" + * @return An array of Cookie objects parsed from the cookie header value + */ + Cookie[] parseCookieHeader(String cookieHeader); + + /** + * Generate the Set-Cookie HTTP header value for the given Cookie. + * + * @param cookie The cookie for which the header will be generated + * @return The header value in a form that can be added directly to the response + */ + String generateHeader(Cookie cookie); + + +} From 22bf190bf7172adc362b9f99280f17f1df2f6fbb Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:29:06 +0900 Subject: [PATCH 0985/1214] refactor: Use `java.time` API for thread-safe cookie expiration handling - Replaced the usage of `SimpleDateFormat` with `DateTimeFormatter` to ensure thread-safe date formatting. --- .../internal/servlet/AwsCookieProcessor.java | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java index 2a849608..0293a3c6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java @@ -4,10 +4,9 @@ import jakarta.servlet.http.Cookie; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import java.text.DateFormat; -import java.text.FieldPosition; -import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -32,16 +31,9 @@ public class AwsCookieProcessor implements CookieProcessor { // BitSet to validate domain characters static final BitSet domainValid = createDomainValidSet(); - static final String COOKIE_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; - - // ThreadLocal to ensure thread-safe creation of DateFormat instances for each thread - static final ThreadLocal COOKIE_DATE_FORMAT = ThreadLocal.withInitial(() -> { - DateFormat df = new SimpleDateFormat(COOKIE_DATE_PATTERN, Locale.US); - df.setTimeZone(TimeZone.getTimeZone("GMT")); - return df; - }); + static final DateTimeFormatter COOKIE_DATE_FORMATTER = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneId.of("GMT")); - static final String ANCIENT_DATE = COOKIE_DATE_FORMAT.get().format(new Date(10000)); + static final String ANCIENT_DATE = COOKIE_DATE_FORMATTER.format(Instant.ofEpochMilli(10000)); static BitSet createTokenValidSet() { BitSet tokenSet = new BitSet(128); @@ -127,8 +119,8 @@ public String generateHeader(Cookie cookie) { if (maxAge == 0) { header.append(ANCIENT_DATE); } else { - COOKIE_DATE_FORMAT.get().format( - new Date(System.currentTimeMillis() + maxAge * 1000L), header, new FieldPosition(0)); + Instant expiresAt = Instant.now().plusSeconds(maxAge); + header.append(COOKIE_DATE_FORMATTER.format(expiresAt)); header.append("; Max-Age=").append(maxAge); } } From 4ab26c702f33528acd89957ade751524b396b88c Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Mon, 23 Sep 2024 09:31:34 +0900 Subject: [PATCH 0986/1214] refactor: Remove redundant check in cookie character validation --- .../serverless/proxy/internal/servlet/AwsCookieProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java index 0293a3c6..7be78b03 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java @@ -262,6 +262,6 @@ private boolean isToken(String s) { } private boolean isValidCookieChar(char c) { - return !(c < 0x21 || c > 0x7E || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c || c == 0x7f); + return !(c < 0x21 || c > 0x7E || c == 0x22 || c == 0x2c || c == 0x3b || c == 0x5c); } } From 5d4a2316a631df4e77899a7dcf3b75651f33eecb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 27 Sep 2024 12:22:45 +0200 Subject: [PATCH 0987/1214] chore: remove --enable-preview (fixes #1061) --- samples/springboot3/pet-store-native/Dockerfile | 2 +- samples/springboot3/pet-store-native/pom.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index 8c395586..30b77503 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -14,7 +14,7 @@ RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm ENV JAVA_HOME /usr/lib/graalvm # Maven -ENV MVN_VERSION 3.9.6 +ENV MVN_VERSION 3.9.9 ENV MVN_FOLDERNAME apache-maven-${MVN_VERSION} ENV MVN_FILENAME apache-maven-${MVN_VERSION}-bin.tar.gz RUN curl -4 -L https://archive.apache.org/dist/maven/maven-3/${MVN_VERSION}/binaries/${MVN_FILENAME} | tar -xvz diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index e8c1fbc3..fec29957 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -76,7 +76,8 @@ native-maven-plugin - --enable-url-protocols=http --enable-preview -march=compatibility + --enable-url-protocols=http + -march=compatibility From 1770ccac825810476865ae4445cdb808fe667b9c Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sat, 28 Sep 2024 03:33:17 +0900 Subject: [PATCH 0988/1214] refactor: added helper methods to simplify cookie attribute appending. --- .../internal/servlet/AwsCookieProcessor.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java index 7be78b03..133d07ed 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java @@ -17,6 +17,7 @@ public class AwsCookieProcessor implements CookieProcessor { // Cookie attribute constants static final String COOKIE_COMMENT_ATTR = "Comment"; static final String COOKIE_DOMAIN_ATTR = "Domain"; + static final String COOKIE_EXPIRES_ATTR = "Expires"; static final String COOKIE_MAX_AGE_ATTR = "Max-Age"; static final String COOKIE_PATH_ATTR = "Path"; static final String COOKIE_SECURE_ATTR = "Secure"; @@ -114,45 +115,42 @@ public String generateHeader(Cookie cookie) { } int maxAge = cookie.getMaxAge(); - if (maxAge > -1) { - header.append("; Expires="); - if (maxAge == 0) { - header.append(ANCIENT_DATE); - } else { - Instant expiresAt = Instant.now().plusSeconds(maxAge); - header.append(COOKIE_DATE_FORMATTER.format(expiresAt)); - header.append("; Max-Age=").append(maxAge); - } + if (maxAge == 0) { + appendAttribute(header, COOKIE_EXPIRES_ATTR, ANCIENT_DATE); + } else if (maxAge > 0){ + Instant expiresAt = Instant.now().plusSeconds(maxAge); + appendAttribute(header, COOKIE_EXPIRES_ATTR, COOKIE_DATE_FORMATTER.format(expiresAt)); + appendAttribute(header, COOKIE_MAX_AGE_ATTR, String.valueOf(maxAge)); } String domain = cookie.getDomain(); if (domain != null && !domain.isEmpty()) { validateDomain(domain); - header.append("; Domain=").append(domain); + appendAttribute(header, COOKIE_DOMAIN_ATTR, domain); } String path = cookie.getPath(); if (path != null && !path.isEmpty()) { validatePath(path); - header.append("; Path=").append(path); + appendAttribute(header, COOKIE_PATH_ATTR, path); } if (cookie.getSecure()) { - header.append("; Secure"); + appendAttributeWithoutValue(header, COOKIE_SECURE_ATTR); } if (cookie.isHttpOnly()) { - header.append("; HttpOnly"); + appendAttributeWithoutValue(header, COOKIE_HTTP_ONLY_ATTR); } String sameSite = cookie.getAttribute(COOKIE_SAME_SITE_ATTR); if (sameSite != null) { - header.append("; SameSite=").append(sameSite); + appendAttribute(header, COOKIE_SAME_SITE_ATTR, sameSite); } String partitioned = cookie.getAttribute(COOKIE_PARTITIONED_ATTR); if (EMPTY_STRING.equals(partitioned)) { - header.append("; Partitioned"); + appendAttributeWithoutValue(header, COOKIE_PARTITIONED_ATTR); } addAdditionalAttributes(cookie, header); @@ -160,7 +158,18 @@ public String generateHeader(Cookie cookie) { return header.toString(); } - private void addAdditionalAttributes(Cookie cookie, StringBuffer header) { + private void appendAttribute(StringBuilder header, String name, String value) { + header.append("; ").append(name); + if (!EMPTY_STRING.equals(value)) { + header.append('=').append(value); + } + } + + private void appendAttributeWithoutValue(StringBuilder header, String name) { + header.append("; ").append(name); + } + + private void addAdditionalAttributes(Cookie cookie, StringBuilder header) { for (Map.Entry entry : cookie.getAttributes().entrySet()) { switch (entry.getKey()) { case COOKIE_COMMENT_ATTR: @@ -175,10 +184,7 @@ private void addAdditionalAttributes(Cookie cookie, StringBuffer header) { break; default: validateAttribute(entry.getKey(), entry.getValue()); - header.append("; ").append(entry.getKey()); - if (!EMPTY_STRING.equals(entry.getValue())) { - header.append('=').append(entry.getValue()); - } + appendAttribute(header, entry.getKey(), entry.getValue()); break; } } From dfcc006fe63cb7ff231625c359d02e628ac5d0f9 Mon Sep 17 00:00:00 2001 From: kibeom lee <70303094+2012160085@users.noreply.github.com> Date: Sat, 28 Sep 2024 03:33:33 +0900 Subject: [PATCH 0989/1214] refactor: replaced StringBuffer with StringBuilder. --- .../serverless/proxy/internal/servlet/AwsCookieProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java index 133d07ed..36ade344 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsCookieProcessor.java @@ -105,7 +105,7 @@ private Cookie parseCookiePair(String cookiePair) { @Override public String generateHeader(Cookie cookie) { - StringBuffer header = new StringBuffer(); + StringBuilder header = new StringBuilder(); header.append(cookie.getName()).append('='); String value = cookie.getValue(); From d65d772e48e9112846b38bd1f8decca8de52762a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 04:22:26 +0000 Subject: [PATCH 0990/1214] chore(deps): bump org.apache.maven.plugins:maven-gpg-plugin Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.4 to 3.2.7. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.4...maven-gpg-plugin-3.2.7) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 25c610ae..de22a5a7 100644 --- a/pom.xml +++ b/pom.xml @@ -292,7 +292,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.4 + 3.2.7 sign-artifacts From 8fef6b5d19ef0d6e36c1fd7a81a50a9ef3b707bc Mon Sep 17 00:00:00 2001 From: Nicolas PETERS Date: Sun, 20 Oct 2024 01:43:37 +0200 Subject: [PATCH 0991/1214] #1084: decode body if base64 is enable --- .../spring/AwsSpringHttpProcessingUtils.java | 66 +++++++++++++++---- ...DelegatingLambdaContainerHandlerTests.java | 51 +++++++++----- 2 files changed, 89 insertions(+), 28 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index c7e507f3..a0b59d01 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -1,24 +1,26 @@ package com.amazonaws.serverless.proxy.spring; import java.io.InputStream; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.Iterator; +import java.nio.charset.UnsupportedCharsetException; +import java.util.Base64; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.apache.commons.io.Charsets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.serverless.web.ServerlessHttpServletRequest; import org.springframework.cloud.function.serverless.web.ServerlessMVC; +import org.springframework.http.HttpHeaders; import org.springframework.util.CollectionUtils; import org.springframework.util.FileCopyUtils; import org.springframework.util.MultiValueMapAdapter; import org.springframework.util.StringUtils; -import com.amazonaws.serverless.proxy.AsyncInitializationWrapper; import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; import com.amazonaws.serverless.proxy.RequestReader; @@ -120,10 +122,14 @@ private static HttpServletRequest generateRequest1(String request, Context lambd MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); httpRequest.setHeaders(headers); } - if (StringUtils.hasText(v1Request.getBody())) { - httpRequest.setContentType("application/json"); - httpRequest.setContent(v1Request.getBody().getBytes(StandardCharsets.UTF_8)); - } + if (StringUtils.hasText(v1Request.getBody())) { + if (v1Request.isBase64Encoded()) { + httpRequest.setContent(Base64.getMimeDecoder().decode(v1Request.getBody())); + } else { + Charset charseEncoding = parseCharacterEncoding(v1Request.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + httpRequest.setContent(v1Request.getBody().getBytes(charseEncoding)); + } + } if (v1Request.getRequestContext() != null) { httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); @@ -149,11 +155,15 @@ private static HttpServletRequest generateRequest2(String request, Context lambd populateQueryStringparameters(v2Request.getQueryStringParameters(), httpRequest); v2Request.getHeaders().forEach(httpRequest::setHeader); - - if (StringUtils.hasText(v2Request.getBody())) { - httpRequest.setContentType("application/json"); - httpRequest.setContent(v2Request.getBody().getBytes(StandardCharsets.UTF_8)); - } + + if (StringUtils.hasText(v2Request.getBody())) { + if (v2Request.isBase64Encoded()) { + httpRequest.setContent(Base64.getMimeDecoder().decode(v2Request.getBody())); + } else { + Charset charseEncoding = parseCharacterEncoding(v2Request.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + httpRequest.setContent(v2Request.getBody().getBytes(charseEncoding)); + } + } httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); httpRequest.setAttribute(RequestReader.HTTP_API_EVENT_PROPERTY, v2Request); @@ -180,4 +190,36 @@ private static T readValue(String json, Class clazz, ObjectMapper mapper) } } + static final String HEADER_KEY_VALUE_SEPARATOR = "="; + static final String HEADER_VALUE_SEPARATOR = ";"; + static final String ENCODING_VALUE_KEY = "charset"; + static protected Charset parseCharacterEncoding(String contentTypeHeader) { + // we only look at content-type because content-encoding should only be used for + // "binary" requests such as gzip/deflate. + Charset defaultCharset = StandardCharsets.UTF_8; + if (contentTypeHeader == null) { + return defaultCharset; + } + + String[] contentTypeValues = contentTypeHeader.split(HEADER_VALUE_SEPARATOR); + if (contentTypeValues.length <= 1) { + return defaultCharset; + } + + for (String contentTypeValue : contentTypeValues) { + if (contentTypeValue.trim().startsWith(ENCODING_VALUE_KEY)) { + String[] encodingValues = contentTypeValue.split(HEADER_KEY_VALUE_SEPARATOR); + if (encodingValues.length <= 1) { + return defaultCharset; + } + try { + return Charsets.toCharset(encodingValues[1]); + } catch (UnsupportedCharsetException ex) { + return defaultCharset; + } + } + } + return defaultCharset; + } + } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index 2fb85e7e..61957fe2 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -6,15 +6,11 @@ import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import com.amazonaws.serverless.exceptions.ContainerInitializationException; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.cloud.function.serverless.web.ServerlessServletContext; import org.springframework.util.CollectionUtils; import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; @@ -214,7 +210,7 @@ public static Collection data() { public void validateComplesrequest(String jsonEvent) throws Exception { initServletAppTest(); InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", - "/foo/male/list/24", "{\"name\":\"bob\"}", null)); + "/foo/male/list/24", "{\"name\":\"bob\"}", false,null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); @@ -229,7 +225,7 @@ public void validateComplesrequest(String jsonEvent) throws Exception { @ParameterizedTest public void testAsyncPost(String jsonEvent) throws Exception { initServletAppTest(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}", null)); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}",false, null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); @@ -242,7 +238,7 @@ public void testAsyncPost(String jsonEvent) throws Exception { public void testValidate400(String jsonEvent) throws Exception { initServletAppTest(); UserData ud = new UserData(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); @@ -258,7 +254,7 @@ public void testValidate200(String jsonEvent) throws Exception { ud.setFirstName("bob"); ud.setLastName("smith"); ud.setEmail("foo@bar.com"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud), null)); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); @@ -266,12 +262,31 @@ public void testValidate200(String jsonEvent) throws Exception { assertEquals("VALID", result.get("body")); } + @MethodSource("data") + @ParameterizedTest + public void testValidate200Base64(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + ud.setFirstName("bob"); + ud.setLastName("smith"); + ud.setEmail("foo@bar.com"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", + Base64.getMimeEncoder().encodeToString(mapper.writeValueAsString(ud).getBytes()),true, null)); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("body")); + } + + @MethodSource("data") @ParameterizedTest public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { initServletAppTest(); InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")), null)); + mapper.writeValueAsString(new MessageData("test message")),false, null)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); @@ -279,6 +294,8 @@ public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) t assertEquals("test message", result.get("body")); } + + @SuppressWarnings({"unchecked" }) @MethodSource("data") @ParameterizedTest @@ -289,7 +306,7 @@ void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEven headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")), headers)); + mapper.writeValueAsString(new MessageData("test message")),false, headers)); ByteArrayOutputStream output = new ByteArrayOutputStream(); handler.handleRequest(targetStream, output, null); @@ -297,19 +314,20 @@ void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEven assertEquals("test message", result.get("body")); } - private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body, Map headers) throws Exception { + private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { Map requestMap = mapper.readValue(jsonEvent, Map.class); if (requestMap.get("version").equals("2.0")) { - return generateHttpRequest2(requestMap, method, path, body, headers); + return generateHttpRequest2(requestMap, method, path, body, isBase64Encoded,headers); } - return generateHttpRequest(requestMap, method, path, body, headers); + return generateHttpRequest(requestMap, method, path, body,isBase64Encoded, headers); } @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest(Map requestMap, String method, String path, String body, Map headers) throws Exception { + private byte[] generateHttpRequest(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { requestMap.put("path", path); requestMap.put("httpMethod", method); requestMap.put("body", body); + requestMap.put("isBase64Encoded", isBase64Encoded); if (!CollectionUtils.isEmpty(headers)) { requestMap.put("headers", headers); } @@ -317,12 +335,13 @@ private byte[] generateHttpRequest(Map requestMap, String method, String path, S } @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body, Map headers) throws Exception { + private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); Map http = (Map) ((Map) map.get("requestContext")).get("http"); http.put("path", path); http.put("method", method); map.put("body", body); + map.put("isBase64Encoded", isBase64Encoded); if (!CollectionUtils.isEmpty(headers)) { map.put("headers", headers); } From 56edec9b9501b4ab0c8a97956f43d9ef8253c9a3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 21 Oct 2024 08:56:55 +0200 Subject: [PATCH 0992/1214] chore(deps): Upgrade to Apache HttpClient 5.4 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index bed89619..a00fa195 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,7 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index f2367ba2..6e7e0a80 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -37,7 +37,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3.1 + 5.4 test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 14553158..d7a2b227 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,7 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 0e007227..ba7626bd 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3.1 + 5.4 test diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 47925cfc..8226c286 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 042d5a50..78ebeb23 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -41,7 +41,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3.1 + 5.4 test diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 892b44d3..c31358b6 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -42,7 +42,7 @@ dependencies { implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") testImplementation(platform("org.junit:junit-bom:5.11.0")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M9') { diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 9b7fb33a..1c4be66e 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3.1 + 5.4 test diff --git a/pom.xml b/pom.xml index c00e4c5d..f2e5579e 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.3.1 + 5.4 test From 3a59eff9adaf87b47ec98d33537f30a38fa27a63 Mon Sep 17 00:00:00 2001 From: Nicolas PETERS Date: Tue, 22 Oct 2024 00:45:51 +0200 Subject: [PATCH 0993/1214] #1084: default content-type: application/json --- .../proxy/spring/AwsSpringHttpProcessingUtils.java | 9 ++++++++- .../SpringDelegatingLambdaContainerHandlerTests.java | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index a0b59d01..9ce8f1dc 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -123,6 +123,9 @@ private static HttpServletRequest generateRequest1(String request, Context lambd httpRequest.setHeaders(headers); } if (StringUtils.hasText(v1Request.getBody())) { + if (v1Request.getHeaders().get(HttpHeaders.CONTENT_TYPE)==null) { + httpRequest.setContentType("application/json"); + } if (v1Request.isBase64Encoded()) { httpRequest.setContent(Base64.getMimeDecoder().decode(v1Request.getBody())); } else { @@ -156,8 +159,12 @@ private static HttpServletRequest generateRequest2(String request, Context lambd v2Request.getHeaders().forEach(httpRequest::setHeader); + if (StringUtils.hasText(v2Request.getBody())) { - if (v2Request.isBase64Encoded()) { + if (v2Request.getHeaders().get(HttpHeaders.CONTENT_TYPE)==null) { + httpRequest.setContentType("application/json"); + } + if (v2Request.isBase64Encoded()) { httpRequest.setContent(Base64.getMimeDecoder().decode(v2Request.getBody())); } else { Charset charseEncoding = parseCharacterEncoding(v2Request.getHeaders().get(HttpHeaders.CONTENT_TYPE)); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index 61957fe2..f9f60e84 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -345,6 +345,7 @@ private byte[] generateHttpRequest2(Map requestMap, String method, String path, if (!CollectionUtils.isEmpty(headers)) { map.put("headers", headers); } + System.out.println(map); return mapper.writeValueAsBytes(map); } } From 712b8d8b327c3750f3a87ea7f8b1821343dcf68e Mon Sep 17 00:00:00 2001 From: mbfreder Date: Tue, 22 Oct 2024 10:49:47 -0700 Subject: [PATCH 0994/1214] remove logging of aws credentials --- .../proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java | 3 --- .../proxy/spring/AwsSpringWebRuntimeInitializer.java | 4 ---- 2 files changed, 7 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index db71d56c..c015a802 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -97,9 +97,6 @@ private void eventLoop(ServletWebServerApplicationContext context) { Environment environment = context.getEnvironment(); logger.info("Starting AWSWebRuntimeEventLoop"); - if (logger.isDebugEnabled()) { - logger.debug("AWS LAMBDA ENVIRONMENT: " + System.getenv()); - } String runtimeApi = environment.getProperty("AWS_LAMBDA_RUNTIME_API"); String eventUri = MessageFormat.format(LAMBDA_RUNTIME_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE); diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java index 4f47121d..992bc635 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java @@ -38,11 +38,7 @@ public class AwsSpringWebRuntimeInitializer implements ApplicationContextInitial @Override public void initialize(GenericApplicationContext context) { - logger.info("AWS Environment: " + System.getenv()); Environment environment = context.getEnvironment(); - if (logger.isDebugEnabled()) { - logger.debug("AWS Environment: " + System.getenv()); - } if (context instanceof ServletWebServerApplicationContext && isCustomRuntime(environment)) { if (context.getBeanFactory().getBeanNamesForType(AwsSpringWebCustomRuntimeEventLoop.class, false, false).length == 0) { From b0754f3e9d0984ff59f7734f9000e54d4f265575 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 24 Oct 2024 16:56:04 +0200 Subject: [PATCH 0995/1214] chore(deps): Update Spring dependencies (framework to 6.1.14, security to 6.3.4, boot to 3.3.5) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f3b93880..6657df96 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.3.3 + 6.3.4 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d160a911..d133bb98 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.1.13 - 6.3.3 + 6.1.14 + 6.3.4 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 953e8bdb..b06a3499 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.1.0-SNAPSHOT - 6.1.13 - 3.3.4 - 6.3.3 + 6.1.14 + 3.3.5 + 6.3.4 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index d7a2b227..7ea0c579 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.13', - 'org.springframework:spring-context:6.1.13', + 'org.springframework:spring-webmvc:6.1.14', + 'org.springframework:spring-context:6.1.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index ba7626bd..d5972162 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.1.13 + 6.1.14 5.11.0 2.24.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 8226c286..9877ece3 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.3.4', + 'org.springframework.boot:spring-boot-starter-web:3.3.5', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 78ebeb23..1d8b963d 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index ba627f2e..eedeaafb 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.1.13', - 'org.springframework:spring-context:6.1.13', + 'org.springframework:spring-webmvc:6.1.14', + 'org.springframework:spring-context:6.1.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 9f2d29bb..9634fe9f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.1.13 + 6.1.14 2.24.0 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 4e5bf513..390ada6d 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.4') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 28ab529c..1bafb479 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 38440b37..dbb984da 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index fec29957..42886dc3 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 4e5bf513..390ada6d 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.4') { + implementation('org.springframework.boot:spring-boot-starter-web:3.3.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 56b0ab8a..b259bcd2 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.5 From 45df2b0aec44c44f96ccfa5649e59ea4e0c01f90 Mon Sep 17 00:00:00 2001 From: Jay Fennelly Date: Sun, 27 Oct 2024 19:11:20 -0700 Subject: [PATCH 0996/1214] Fix AwsProxyRequestBuilder to be immutable when calling the alb() method --- .../testutils/AwsProxyRequestBuilder.java | 76 +++++---- .../testutils/AwsProxyRequestBuilderTest.java | 157 ++++++++++++++++++ 2 files changed, 199 insertions(+), 34 deletions(-) create mode 100644 aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilderTest.java diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index 40f0ae7a..4d1bea42 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -16,6 +16,7 @@ import com.amazonaws.serverless.proxy.model.*; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; import org.apache.hc.core5.http.ContentType; @@ -49,7 +50,7 @@ public class AwsProxyRequestBuilder { private AwsProxyRequest request; private MultipartEntityBuilder multipartBuilder; - + //------------------------------------------------------------- // Constructors //------------------------------------------------------------- @@ -86,22 +87,41 @@ public AwsProxyRequestBuilder(String path, String httpMethod) { this.request.getRequestContext().setIdentity(identity); } - - //------------------------------------------------------------- + //------------------------------------------------------------- // Methods - Public //------------------------------------------------------------- public AwsProxyRequestBuilder alb() { - this.request.setRequestContext(new AwsProxyRequestContext()); - this.request.getRequestContext().setElb(new AlbContext()); - this.request.getRequestContext().getElb().setTargetGroupArn( + /* + * This method sets up the requestContext to look like an ALB request and also + * re-encodes URL query params, since ALBs do not decode them. This now returns + * a new AwsProxyRequestBuilder with the new query param state, so the original + * builder maintains the original configured state and can be then be reused in + * further unit tests. For now the simplest way to accomplish a deep copy is by + * serializing to JSON then deserializing. + */ + + ObjectMapper objectMapper = new ObjectMapper(); + AwsProxyRequest albRequest = null; + try { + String json = objectMapper.writeValueAsString(this.request); + albRequest = objectMapper.readValue(json, AwsProxyRequest.class); + } catch (JsonProcessingException jpe) { + throw new RuntimeException(jpe); + } + + if (albRequest.getRequestContext() == null) { + albRequest.setRequestContext(new AwsProxyRequestContext()); + } + albRequest.getRequestContext().setElb(new AlbContext()); + albRequest.getRequestContext().getElb().setTargetGroupArn( "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-target/d6190d154bc908a5" ); // ALB does not decode query string parameters so we re-encode them all - if (request.getMultiValueQueryStringParameters() != null) { + if (albRequest.getMultiValueQueryStringParameters() != null) { MultiValuedTreeMap newQs = new MultiValuedTreeMap<>(); - for (Map.Entry> e : request.getMultiValueQueryStringParameters().entrySet()) { + for (Map.Entry> e : albRequest.getMultiValueQueryStringParameters().entrySet()) { for (String v : e.getValue()) { try { // this is a terrible hack. In our Spring tests we use the comma as a control character for lists @@ -114,9 +134,9 @@ public AwsProxyRequestBuilder alb() { } } } - request.setMultiValueQueryStringParameters(newQs); + albRequest.setMultiValueQueryStringParameters(newQs); } - return this; + return new AwsProxyRequestBuilder(albRequest); } public AwsProxyRequestBuilder stage(String stageName) { @@ -142,6 +162,9 @@ public AwsProxyRequestBuilder json() { public AwsProxyRequestBuilder form(String key, String value) { + if (key == null || value == null) { + throw new IllegalArgumentException("form() does not support null key or value"); + } if (request.getMultiValueHeaders() == null) { request.setMultiValueHeaders(new Headers()); } @@ -150,7 +173,12 @@ public AwsProxyRequestBuilder form(String key, String value) { if (body == null) { body = ""; } - body += (body.equals("")?"":"&") + key + "=" + value; + // URL-encode key and value to form expected body of a form post + try { + body += (body.equals("") ? "" : "&") + URLEncoder.encode(key, "UTF-8") + "=" + URLEncoder.encode(value, "UTF-8"); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException("Could not encode form parameter: " + key + "=" + value, ex); + } request.setBody(body); return this; } @@ -214,35 +242,15 @@ public AwsProxyRequestBuilder multiValueQueryString(MultiValuedTreeMap()); } - if (request.getRequestSource() == RequestSource.API_GATEWAY) { - this.request.getMultiValueQueryStringParameters().add(key, value); - } - // ALB does not decode parameters automatically like API Gateway. - if (request.getRequestSource() == RequestSource.ALB) { - try { - //if (URLDecoder.decode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET).equals(value)) { - // TODO: Assume we are always given an unencoded value, smarter check here to encode - // only if necessary - this.request.getMultiValueQueryStringParameters().add( - key, - URLEncoder.encode(value, ContainerConfig.DEFAULT_CONTENT_CHARSET) - ); - //} - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - - } + this.request.getMultiValueQueryStringParameters().add(key, value); return this; } - public AwsProxyRequestBuilder body(String body) { this.request.setBody(body); return this; @@ -475,11 +483,11 @@ public HttpApiV2ProxyRequest toHttpApiV2Request() { request.getMultiValueQueryStringParameters().forEach((k, v) -> { for (String s : v) { rawQueryString.append("&"); - rawQueryString.append(k); - rawQueryString.append("="); try { // same terrible hack as the alb() method. Because our spring tests use commas as control characters // we do not encode it + rawQueryString.append(URLEncoder.encode(k, "UTF-8").replaceAll("%2C", ",")); + rawQueryString.append("="); rawQueryString.append(URLEncoder.encode(s, "UTF-8").replaceAll("%2C", ",")); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilderTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilderTest.java new file mode 100644 index 00000000..6263eeaf --- /dev/null +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilderTest.java @@ -0,0 +1,157 @@ +package com.amazonaws.serverless.proxy.internal.testutils; + +import java.io.IOException; +import java.net.URLEncoder; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; + +import com.amazonaws.serverless.proxy.model.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class AwsProxyRequestBuilderTest { + + private static final String TEST_KEY = "testkey"; + private static final String TEST_VALUE = "testvalue"; + private static final String TEST_KEY_FOR_ENCODING = "test@key 1"; + private static final String TEST_VALUE_FOR_ENCODING = "test value!!"; + + + void baseConstructorAsserts(AwsProxyRequest request) { + assertEquals(0, request.getMultiValueHeaders().size()); + assertEquals(0, request.getHeaders().size()); + assertEquals(0, request.getMultiValueQueryStringParameters().size()); + assertNotNull(request.getRequestContext()); + assertNotNull(request.getRequestContext().getRequestId()); + assertNotNull(request.getRequestContext().getExtendedRequestId()); + assertEquals("test", request.getRequestContext().getStage()); + assertEquals("HTTP/1.1", request.getRequestContext().getProtocol()); + assertNotNull(request.getRequestContext().getRequestTimeEpoch()); + assertNotNull(request.getRequestContext().getIdentity()); + assertEquals("127.0.0.1", request.getRequestContext().getIdentity().getSourceIp()); + } + + @Test + void constructor_path_httpMethod() { + + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "GET"); + AwsProxyRequest request = builder.build(); + assertEquals("/path", request.getPath()); + assertEquals("GET", request.getHttpMethod()); + baseConstructorAsserts(request); + } + + @Test + void constructor_path_nullHttpMethod() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path"); + AwsProxyRequest request = builder.build(); + assertNull(request.getHttpMethod()); + assertEquals("/path", request.getPath()); + baseConstructorAsserts(request); + } + + @Test + void constructor_nullPath_nullHttpMethod() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder(); + AwsProxyRequest request = builder.build(); + assertNull(request.getHttpMethod()); + assertNull(request.getPath()); + baseConstructorAsserts(request); + } + + @Test + void form_key_value() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + builder.form(TEST_KEY, TEST_VALUE); + AwsProxyRequest request = builder.build(); + assertEquals(1, request.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).size()); + assertEquals(MediaType.APPLICATION_FORM_URLENCODED, request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); + assertNull(request.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertNotNull(request.getBody()); + assertEquals(TEST_KEY + "=" + TEST_VALUE, request.getBody()); + } + + @Test + void form_key_nullKey_nullValue() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + assertThrows(IllegalArgumentException.class, () -> builder.form(null, TEST_VALUE)); + assertThrows(IllegalArgumentException.class, () -> builder.form(TEST_KEY, null)); + assertThrows(IllegalArgumentException.class, () -> builder.form(null, null)); + } + + @Test + void form_keyEncoded_valueEncoded() throws IOException { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + builder.form(TEST_KEY_FOR_ENCODING, TEST_VALUE_FOR_ENCODING); + AwsProxyRequest request = builder.build(); + + assertEquals(1, request.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).size()); + assertEquals(MediaType.APPLICATION_FORM_URLENCODED, request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); + assertNull(request.getHeaders().get(HttpHeaders.CONTENT_TYPE)); + assertNotNull(request.getBody()); + String expected = URLEncoder.encode(TEST_KEY_FOR_ENCODING, "UTF-8") + "=" + URLEncoder.encode(TEST_VALUE_FOR_ENCODING, "UTF-8"); + assertEquals(expected, request.getBody()); + } + + @Test + void queryString_key_value() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + builder.queryString(TEST_KEY, TEST_VALUE); + AwsProxyRequest request = builder.build(); + + assertNull(request.getQueryStringParameters()); + assertEquals(1, request.getMultiValueQueryStringParameters().size()); + assertEquals(TEST_KEY, request.getMultiValueQueryStringParameters().keySet().iterator().next()); + assertEquals(TEST_VALUE, request.getMultiValueQueryStringParameters().get(TEST_KEY).get(0)); + assertEquals(TEST_VALUE, request.getMultiValueQueryStringParameters().getFirst(TEST_KEY)); + } + + @Test + void queryString_keyNotEncoded_valueNotEncoded() { + // builder should not URL encode key or value for query string + // in the case of an ALB where values should be encoded, the builder alb() method will handle it + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + builder.queryString(TEST_KEY_FOR_ENCODING, TEST_VALUE_FOR_ENCODING); + AwsProxyRequest request = builder.build(); + + assertNull(request.getQueryStringParameters()); + assertEquals(1, request.getMultiValueQueryStringParameters().size()); + assertEquals(TEST_KEY_FOR_ENCODING, request.getMultiValueQueryStringParameters().keySet().iterator().next()); + assertEquals(TEST_VALUE_FOR_ENCODING, request.getMultiValueQueryStringParameters().get(TEST_KEY_FOR_ENCODING).get(0)); + assertEquals(TEST_VALUE_FOR_ENCODING, request.getMultiValueQueryStringParameters().getFirst(TEST_KEY_FOR_ENCODING)); + } + + @Test + void queryString_alb_key_value() { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + builder.queryString(TEST_KEY, TEST_VALUE); + AwsProxyRequest request = builder.alb().build(); + + assertNull(request.getQueryStringParameters()); + assertEquals(1, request.getMultiValueQueryStringParameters().size()); + assertEquals(TEST_KEY, request.getMultiValueQueryStringParameters().keySet().iterator().next()); + assertEquals(TEST_VALUE, request.getMultiValueQueryStringParameters().get(TEST_KEY).get(0)); + assertEquals(TEST_VALUE, request.getMultiValueQueryStringParameters().getFirst(TEST_KEY)); + } + + @Test + void alb_keyEncoded_valueEncoded() throws IOException { + AwsProxyRequestBuilder builder = new AwsProxyRequestBuilder("/path", "POST"); + MultiValuedTreeMap map = new MultiValuedTreeMap<>(); + map.add(TEST_KEY_FOR_ENCODING, TEST_VALUE_FOR_ENCODING); + builder.multiValueQueryString(map); + AwsProxyRequest request = builder.alb().build(); + + String expectedKey = URLEncoder.encode(TEST_KEY_FOR_ENCODING, "UTF-8"); + String expectedValue = URLEncoder.encode(TEST_VALUE_FOR_ENCODING, "UTF-8"); + assertEquals(1, request.getMultiValueQueryStringParameters().size()); + assertEquals(expectedKey, request.getMultiValueQueryStringParameters().keySet().iterator().next()); + assertEquals(expectedValue, request.getMultiValueQueryStringParameters().get(expectedKey).get(0)); + assertEquals(expectedValue, request.getMultiValueQueryStringParameters().getFirst(expectedKey)); + assertEquals(expectedKey, request.getMultiValueQueryStringParameters().keySet().iterator().next()); + assertEquals(expectedValue, request.getMultiValueQueryStringParameters().get(expectedKey).get(0)); + assertEquals(expectedValue, request.getMultiValueQueryStringParameters().getFirst(expectedKey)); + } + +} From 3ad77463f5f0504812fe061e7fd40b62051ea694 Mon Sep 17 00:00:00 2001 From: Jay Fennelly Date: Sun, 27 Oct 2024 19:27:14 -0700 Subject: [PATCH 0997/1214] Clean up and add additional tests --- .../servlet/AwsHttpServletRequestTest.java | 101 +++++++++++++++++- .../AwsProxyHttpServletRequestTest.java | 15 ++- 2 files changed, 104 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 358d673a..44d76744 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -17,7 +17,6 @@ import java.util.Base64; import java.util.List; import java.util.Map; -import java.util.Arrays; public class AwsHttpServletRequestTest { @@ -38,8 +37,12 @@ public class AwsHttpServletRequestTest { .queryString("one", "two").queryString("three", "four").build(); private static final AwsProxyRequest queryStringNullValue = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("three", null).build(); + private static final AwsProxyRequest queryStringEmptyValue = new AwsProxyRequestBuilder("/test", "GET") + .queryString("one", "two").queryString("three", "").build(); private static final AwsProxyRequest encodedQueryString = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").build(); + private static final AwsProxyRequest encodedQueryStringAlb = new AwsProxyRequestBuilder("/test", "GET") + .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").alb().build(); private static final AwsProxyRequest multipleParams = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("one", "three").queryString("json", "{\"name\":\"faisal\"}").build(); private static final AwsProxyRequest formEncodedAndQueryString = new AwsProxyRequestBuilder("/test", "POST") @@ -200,6 +203,20 @@ void queryString_generateQueryString_nullParameterIsEmpty() { assertTrue(parsedString.endsWith("three=")); } + @Test + void queryString_generateQueryString_emptyParameterIsEmpty() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryStringEmptyValue, mockContext, null, config); + String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), true, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } + + assertTrue(parsedString.endsWith("three=")); + } + @Test void queryStringWithEncodedParams_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); @@ -216,6 +233,22 @@ void queryStringWithEncodedParams_generateQueryString_validQuery() { assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } + @Test + void queryStringWithEncodedParams_alb_generateQueryString_validQuery() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryStringAlb, mockContext, null, config); + + String parsedString = null; + try { + parsedString = request.generateQueryString(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), false, config.getUriEncoding()); + } catch (ServletException e) { + e.printStackTrace(); + fail("Could not generate query string"); + } + assertTrue(parsedString.contains("one=two")); + assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); + } + @Test void queryStringWithMultipleValues_generateQueryString_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(multipleParams, mockContext, null, config); @@ -265,6 +298,22 @@ void parameterMap_generateParameterMap_nullParameter() { assertTrue(paramMap.size() == 2); } + @Test + void parameterMap_generateParameterMap_emptyParameter() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryStringEmptyValue, mockContext, null, config); + Map paramMap = null; + try { + paramMap = request.generateParameterMap(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), config); + } catch (Exception e) { + e.printStackTrace(); + fail("Could not generate parameter map"); + } + + assertArrayEquals(new String[]{"two"}, paramMap.get("one")); + assertArrayEquals(new String[]{""}, paramMap.get("three")); + assertTrue(paramMap.size() == 2); + } + @Test void parameterMapWithEncodedParams_generateParameterMap_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryString, mockContext, null, config); @@ -319,12 +368,32 @@ void parameterMap_generateParameterMap_formEncodedAndQueryString() { } @Test - void parameterMap_generateParameterMap_differentCasing() { - AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(differentCasing, mockContext, null, config); + void parameterMap_generateParameterMap_differentCasing_caseSensitive() { + ContainerConfig caseSensitiveConfig = ContainerConfig.defaultConfig(); + caseSensitiveConfig.setQueryStringCaseSensitive(true); + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(differentCasing, mockContext, null, caseSensitiveConfig); + Map paramMap = null; + try { + paramMap = request.generateParameterMap(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), caseSensitiveConfig); + } catch (Exception e) { + e.printStackTrace(); + fail("Could not generate parameter map"); + } + assertArrayEquals(new String[] {"two", "three"}, paramMap.get("one")); + assertArrayEquals(new String[] {"four"}, paramMap.get("ONE")); + assertTrue(paramMap.size() == 2); + } + + @Test + void parameterMap_generateParameterMap_differentCasing_caseInsensitive() { + ContainerConfig caseInsensitiveConfig = ContainerConfig.defaultConfig(); + caseInsensitiveConfig.setQueryStringCaseSensitive(false); + + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(differentCasing, mockContext, null, caseInsensitiveConfig); Map paramMap = null; try { - paramMap = request.generateParameterMap(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), config); + paramMap = request.generateParameterMap(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), caseInsensitiveConfig); } catch (Exception e) { e.printStackTrace(); fail("Could not generate parameter map"); @@ -346,6 +415,17 @@ void queryParamValues_getQueryParamValues() { assertNull(result2); } + @Test + void queryParamValues_getQueryParamValues_nullValue() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(new AwsProxyRequest(), mockContext, null); + MultiValuedTreeMap map = new MultiValuedTreeMap<>(); + map.add("test", null); + String[] result1 = request.getQueryParamValues(map, "test", true); + assertArrayEquals(new String[] {null}, result1); + String[] result2 = request.getQueryParamValues(map, "TEST", true); + assertNull(result2); + } + @Test void queryParamValues_getQueryParamValues_caseInsensitive() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(new AwsProxyRequest(), mockContext, null); @@ -358,4 +438,17 @@ void queryParamValues_getQueryParamValues_caseInsensitive() { assertArrayEquals(new String[]{"test", "test2"}, result2); } + @Test + void queryParamValues_getQueryParamValues_multipleCaseInsensitive() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(new AwsProxyRequest(), mockContext, null); + + MultiValuedTreeMap map = new MultiValuedTreeMap<>(); + map.add("test", "test"); + map.add("TEST", "test2"); + String[] result1 = request.getQueryParamValues(map, "test", false); + assertArrayEquals(new String[]{"test2"}, result1); + String[] result2 = request.getQueryParamValues(map, "TEST", false); + assertArrayEquals(new String[]{"test2"}, result2); + } + } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 4edcf524..a0606649 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -34,6 +34,7 @@ public class AwsProxyHttpServletRequestTest { private static final String FORM_PARAM_NAME_VALUE = "Stef"; private static final String FORM_PARAM_TEST = "test_cookie_param"; private static final String QUERY_STRING_NAME_VALUE = "Bob"; + private static final String QUERY_STRING_NAME = "name"; private static final String REQUEST_SCHEME_HTTP = "http"; private static final String USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36"; private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; @@ -73,10 +74,9 @@ public class AwsProxyHttpServletRequestTest { } private static final AwsProxyRequestBuilder REQUEST_QUERY = new AwsProxyRequestBuilder("/hello", "POST") - .queryString(FORM_PARAM_NAME, QUERY_STRING_NAME_VALUE); + .queryString(QUERY_STRING_NAME, QUERY_STRING_NAME_VALUE); private static final AwsProxyRequestBuilder REQUEST_QUERY_EMPTY_VALUE = new AwsProxyRequestBuilder("/hello", "POST") - .queryString(FORM_PARAM_NAME, ""); - + .queryString(QUERY_STRING_NAME, ""); public void initAwsProxyHttpServletRequestTest(String type) { requestType = type; @@ -102,7 +102,7 @@ private HttpServletRequest getRequest(AwsProxyRequestBuilder req, Context lambda } } - + @MethodSource("data") @ParameterizedTest void headers_getHeader_validRequest(String type) { @@ -269,7 +269,7 @@ void queryParameters_getParameterMap_nonNull(String type) { HttpServletRequest request = getRequest(REQUEST_QUERY, null, null); assertNotNull(request); assertEquals(1, request.getParameterMap().size()); - assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(FORM_PARAM_NAME)[0]); + assertEquals(QUERY_STRING_NAME_VALUE, request.getParameterMap().get(QUERY_STRING_NAME)[0]); } @MethodSource("data") @@ -279,7 +279,7 @@ void queryParameters_getParameterMap_nonNull_EmptyParamValue(String type) { HttpServletRequest request = getRequest(REQUEST_QUERY_EMPTY_VALUE, null, null); assertNotNull(request); assertEquals(1, request.getParameterMap().size()); - assertEquals("", request.getParameterMap().get(FORM_PARAM_NAME)[0]); + assertEquals("", request.getParameterMap().get(QUERY_STRING_NAME)[0]); } @MethodSource("data") @@ -300,7 +300,7 @@ void queryParameters_getParameterNames_notNull(String type) { List parameterNames = Collections.list(request.getParameterNames()); assertNotNull(request); assertEquals(1, parameterNames.size()); - assertTrue(parameterNames.contains(FORM_PARAM_NAME)); + assertTrue(parameterNames.contains(QUERY_STRING_NAME)); } @MethodSource("data") @@ -470,7 +470,6 @@ void requestURL_getUrlWithContextPath_expectStageAsContextPath(String type) { LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(true); HttpServletRequest servletRequest = getRequest(req, null, null); String requestUrl = servletRequest.getRequestURL().toString(); - System.out.println(requestUrl); assertTrue(requestUrl.contains("/test-stage/")); LambdaContainerHandler.getContainerConfig().setUseStageAsServletContext(false); } From 7c05a6f6e63e43578b968294adda576c40329ccd Mon Sep 17 00:00:00 2001 From: Jay Fennelly Date: Sun, 27 Oct 2024 19:37:15 -0700 Subject: [PATCH 0998/1214] Allow generateParameterMap to optionally decode query params (for ALB requests) --- .../servlet/AwsHttpServletRequest.java | 68 ++++++++++++------- .../servlet/AwsHttpServletRequestTest.java | 17 +++++ 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index ea8ef4a1..84e4f96c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -584,7 +584,7 @@ private void addPart(Map> params, String fieldName, Part newP protected String[] getQueryParamValues(MultiValuedTreeMap qs, String key, boolean isCaseSensitive) { List value = getQueryParamValuesAsList(qs, key, isCaseSensitive); - if (value == null){ + if (value == null) { return null; } return value.toArray(new String[0]); @@ -607,39 +607,57 @@ protected List getQueryParamValuesAsList(MultiValuedTreeMap generateParameterMap(MultiValuedTreeMap qs, ContainerConfig config) { + return generateParameterMap(qs, config, false); + } + + protected Map generateParameterMap(MultiValuedTreeMap qs, ContainerConfig config, boolean decodeQueryParams) { Map output; Map> formEncodedParams = getFormUrlEncodedParametersMap(); if (qs == null) { // Just transform the List values to String[] - output = formEncodedParams.entrySet().stream() + return formEncodedParams.entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, (e) -> e.getValue().toArray(new String[0]))); - } else { - Map> queryStringParams; - if (config.isQueryStringCaseSensitive()) { - queryStringParams = qs; - } else { - // If it's case insensitive, we check the entire map on every parameter - queryStringParams = qs.entrySet().stream().parallel().collect( - Collectors.toMap( - Map.Entry::getKey, - e -> getQueryParamValuesAsList(qs, e.getKey(), false) - )); - } - - // Merge formEncodedParams and queryStringParams Maps - output = Stream.of(formEncodedParams, queryStringParams).flatMap(m -> m.entrySet().stream()) - .collect( - Collectors.toMap( - Map.Entry::getKey, - e -> e.getValue().toArray(new String[0]), - // If a parameter is in both Maps, we merge the list of values (and ultimately transform to String[]) - (formParam, queryParam) -> Stream.of(formParam, queryParam).flatMap(Stream::of).toArray(String[]::new) - )); - } + // decode all keys and values in map + final MultiValuedTreeMap decodedQs = new MultiValuedTreeMap(); + if (decodeQueryParams) { + for (Map.Entry> entry : qs.entrySet()) { + String k = decodeValueIfEncoded(entry.getKey()); + List v = getQueryParamValuesAsList(qs, entry.getKey(), false).stream() + .map(AwsHttpServletRequest::decodeValueIfEncoded) + .collect(Collectors.toList()); + // addAll in case map has 2 keys that are identical once decoded + decodedQs.addAll(k, v); + } + } else { + decodedQs.putAll(qs); + } + + Map> queryStringParams; + if (config.isQueryStringCaseSensitive()) { + queryStringParams = decodedQs; + } else { + // If it's case insensitive, we check the entire map on every parameter + queryStringParams = decodedQs.entrySet().stream().collect( + Collectors.toMap( + Map.Entry::getKey, + e -> getQueryParamValuesAsList(decodedQs, e.getKey(), false) + )); + } + + // Merge formEncodedParams and queryStringParams Maps + output = Stream.of(formEncodedParams, queryStringParams).flatMap(m -> m.entrySet().stream()) + .collect( + Collectors.toMap( + Map.Entry::getKey, + e -> e.getValue().toArray(new String[0]), + // If a parameter is in both Maps, we merge the list of values (and ultimately transform to String[]) + (formParam, queryParam) -> Stream.of(formParam, queryParam).flatMap(Stream::of).toArray(String[]::new) + )); + return output; } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 44d76744..179b58a1 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -331,6 +331,23 @@ void parameterMapWithEncodedParams_generateParameterMap_validQuery() { assertTrue(paramMap.size() == 2); } + @Test + void parameterMapWithEncodedParams_alb_generateParameterMap_validQuery() { + AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(encodedQueryStringAlb, mockContext, null, config); + + Map paramMap = null; + try { + paramMap = request.generateParameterMap(request.getAwsProxyRequest().getMultiValueQueryStringParameters(), config, true); + } catch (Exception e) { + e.printStackTrace(); + fail("Could not generate parameter map"); + } + + assertArrayEquals(new String[]{"two"}, paramMap.get("one")); + assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json")); + assertTrue(paramMap.size() == 2); + } + @Test void parameterMapWithMultipleValues_generateParameterMap_validQuery() { AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(multipleParams, mockContext, null, config); From 916f2a25e6c0380a0bfbe7f3a027b4e4c9a49b21 Mon Sep 17 00:00:00 2001 From: Jay Fennelly Date: Sun, 27 Oct 2024 19:39:39 -0700 Subject: [PATCH 0999/1214] Update unit tests to test decoding of query param names --- .../servlet/AwsHttpServletRequestTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java index 179b58a1..904a3550 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequestTest.java @@ -40,11 +40,11 @@ public class AwsHttpServletRequestTest { private static final AwsProxyRequest queryStringEmptyValue = new AwsProxyRequestBuilder("/test", "GET") .queryString("one", "two").queryString("three", "").build(); private static final AwsProxyRequest encodedQueryString = new AwsProxyRequestBuilder("/test", "GET") - .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").build(); + .queryString("one", "two").queryString("json value@1", "{\"name\":\"faisal\"}").build(); private static final AwsProxyRequest encodedQueryStringAlb = new AwsProxyRequestBuilder("/test", "GET") - .queryString("one", "two").queryString("json", "{\"name\":\"faisal\"}").alb().build(); + .queryString("one", "two").queryString("json value@1", "{\"name\":\"faisal\"}").alb().build(); private static final AwsProxyRequest multipleParams = new AwsProxyRequestBuilder("/test", "GET") - .queryString("one", "two").queryString("one", "three").queryString("json", "{\"name\":\"faisal\"}").build(); + .queryString("one", "two").queryString("one", "three").queryString("json value@1", "{\"name\":\"faisal\"}").build(); private static final AwsProxyRequest formEncodedAndQueryString = new AwsProxyRequestBuilder("/test", "POST") .queryString("one", "two").queryString("one", "three") .queryString("five", "six") @@ -229,7 +229,7 @@ void queryStringWithEncodedParams_generateQueryString_validQuery() { fail("Could not generate query string"); } assertTrue(parsedString.contains("one=two")); - assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("json+value%401=%7B%22name%22%3A%22faisal%22%7D")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } @@ -245,7 +245,7 @@ void queryStringWithEncodedParams_alb_generateQueryString_validQuery() { fail("Could not generate query string"); } assertTrue(parsedString.contains("one=two")); - assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("json+value%401=%7B%22name%22%3A%22faisal%22%7D")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } @@ -262,7 +262,7 @@ void queryStringWithMultipleValues_generateQueryString_validQuery() { } assertTrue(parsedString.contains("one=two")); assertTrue(parsedString.contains("one=three")); - assertTrue(parsedString.contains("json=%7B%22name%22%3A%22faisal%22%7D")); + assertTrue(parsedString.contains("json+value%401=%7B%22name%22%3A%22faisal%22%7D")); assertTrue(parsedString.contains("&") && parsedString.indexOf("&") > 0 && parsedString.indexOf("&") < parsedString.length()); } @@ -327,7 +327,7 @@ void parameterMapWithEncodedParams_generateParameterMap_validQuery() { } assertArrayEquals(new String[]{"two"}, paramMap.get("one")); - assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json")); + assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json value@1")); assertTrue(paramMap.size() == 2); } @@ -344,7 +344,7 @@ void parameterMapWithEncodedParams_alb_generateParameterMap_validQuery() { } assertArrayEquals(new String[]{"two"}, paramMap.get("one")); - assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json")); + assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json value@1")); assertTrue(paramMap.size() == 2); } @@ -360,7 +360,7 @@ void parameterMapWithMultipleValues_generateParameterMap_validQuery() { fail("Could not generate parameter map"); } assertArrayEquals(new String[]{"two", "three"}, paramMap.get("one")); - assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json")); + assertArrayEquals(new String[]{"{\"name\":\"faisal\"}"}, paramMap.get("json value@1")); assertTrue(paramMap.size() == 2); } From f68e7552398816faa6b7a3e80a9373c27882387a Mon Sep 17 00:00:00 2001 From: Jay Fennelly Date: Sun, 27 Oct 2024 19:43:13 -0700 Subject: [PATCH 1000/1214] Add handling decoding of parameters for ALB requests and decode paramter names in HTTP API requests --- .../AwsHttpApiV2ProxyHttpServletRequest.java | 4 +-- .../servlet/AwsProxyHttpServletRequest.java | 35 +++++++++++++++++-- .../AwsProxyHttpServletRequestTest.java | 4 +-- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java index 537e1075..1caf6dac 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpApiV2ProxyHttpServletRequest.java @@ -483,10 +483,10 @@ private MultiValuedTreeMap parseRawQueryString(String qs) { String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR); String key = URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding()); - String val = kv.length == 2 ? kv[1] : ""; + String val = kv.length == 2 ? AwsHttpServletRequest.decodeValueIfEncoded(kv[1]) : ""; qsMap.add(key, val); } catch (UnsupportedEncodingException e) { - log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(value), e); + log.error("Unsupported encoding in query string key-value pair: " + SecurityUtils.crlf(value), e); } } return qsMap; diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index fe514e65..c10b1ef5 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -325,8 +325,17 @@ public String getContentType() { @Override public String getParameter(String s) { + + // decode key if ALB + if (request.getRequestSource() == RequestSource.ALB) { + s = decodeValueIfEncoded(s); + } + String queryStringParameter = getFirstQueryParamValue(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()); if (queryStringParameter != null) { + if (request.getRequestSource() == RequestSource.ALB) { + queryStringParameter = decodeValueIfEncoded(queryStringParameter); + } return queryStringParameter; } @@ -345,15 +354,35 @@ public Enumeration getParameterNames() { if (request.getMultiValueQueryStringParameters() == null) { return Collections.enumeration(formParameterNames); } - return Collections.enumeration(Stream.concat(formParameterNames.stream(), - request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet())); + + Set paramNames = request.getMultiValueQueryStringParameters().keySet(); + if (request.getRequestSource() == RequestSource.ALB) { + paramNames = paramNames.stream().map(AwsProxyHttpServletRequest::decodeValueIfEncoded).collect(Collectors.toSet()); + } + + return Collections.enumeration( + Stream.concat(formParameterNames.stream(), paramNames.stream()) + .collect(Collectors.toSet())); } @Override @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params public String[] getParameterValues(String s) { + + // decode key if ALB + if (request.getRequestSource() == RequestSource.ALB) { + s = decodeValueIfEncoded(s); + } + + // TODO lots of back and forth arrays and lists here, sort it out! List values = new ArrayList<>(Arrays.asList(getQueryParamValues(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()))); + // List values = getQueryParamValuesAsList(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive()); + + // decode values if ALB + if (request.getRequestSource() == RequestSource.ALB) { + values = values.stream().map(AwsHttpServletRequest::decodeValueIfEncoded).collect(Collectors.toList()); + } values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s))); @@ -367,7 +396,7 @@ public String[] getParameterValues(String s) { @Override public Map getParameterMap() { - return generateParameterMap(request.getMultiValueQueryStringParameters(), config); + return generateParameterMap(request.getMultiValueQueryStringParameters(), config, request.getRequestSource() == RequestSource.ALB); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index a0606649..736da27b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -33,8 +33,8 @@ public class AwsProxyHttpServletRequestTest { private static final String FORM_PARAM_NAME = "name"; private static final String FORM_PARAM_NAME_VALUE = "Stef"; private static final String FORM_PARAM_TEST = "test_cookie_param"; - private static final String QUERY_STRING_NAME_VALUE = "Bob"; - private static final String QUERY_STRING_NAME = "name"; + private static final String QUERY_STRING_NAME_VALUE = "Bob B!"; + private static final String QUERY_STRING_NAME = "name$"; private static final String REQUEST_SCHEME_HTTP = "http"; private static final String USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36"; private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox"; From 0f33cd72492a28659af1a2e904e80487250e78c0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Oct 2024 11:48:17 +0100 Subject: [PATCH 1001/1214] chore(deps): Update Jersey dependency to 3.1.9 --- .github/dependabot.yml | 2 +- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 96dd4d8b..a82724c4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -36,7 +36,7 @@ updates: groups: jersey: patterns: - - "org.glassfish.jersey:*" + - "org.glassfish.jersey.*:*" spring: patterns: - "org.springframework:*" diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index bf395818..2b7ef7f1 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.8 + 3.1.9 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index a00fa195..60a6ab3a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.8") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.8") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.9") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 6e7e0a80..92a954e4 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.8 + 3.1.9 2.17.2 5.11.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index db641d14..9afa24c7 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.17.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.8") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.8") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.9") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 7bdc7ce4..8d9f5029 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.8 + 3.1.9 2.17.2 From 716267fc23ffaa5ebe1b41d29a37a53932c26e2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:49:36 +0000 Subject: [PATCH 1002/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.12.0 to 5.14.2 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.12.0 to 5.14.2. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.12.0...v5.14.2) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2e5579e..52fa7e58 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.17.2 2.0.16 5.11.0 - 5.12.0 + 5.14.2 1.3 UTF-8 From d396be6090a2fd96c3b0230dafe908f296986cf2 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Oct 2024 11:52:18 +0100 Subject: [PATCH 1003/1214] chore(deps): Update Jackson version to 2.18.0 --- .github/dependabot.yml | 6 ++++++ .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 12 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a82724c4..d82be62d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,6 +18,9 @@ updates: slf4j: patterns: - "org.slf4j:*" + jackson: + patterns: + - "com.fasterxml.jackson.*:*" log4j: patterns: - "org.apache.logging.log4j:*" @@ -46,5 +49,8 @@ updates: log4j: patterns: - "org.apache.logging.log4j:*" + jackson: + patterns: + - "com.fasterxml.jackson.*:*" schedule: interval: "weekly" \ No newline at end of file diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 60a6ab3a..e8a58a7a 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.17.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.0', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 92a954e4..0c34139c 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.9 - 2.17.2 + 2.18.0 5.11.0 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 7ea0c579..8ba66cc0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', - 'com.fasterxml.jackson.core:jackson-databind:2.17.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index c31358b6..1f67ba44 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -34,8 +34,8 @@ dependencies { exclude group: 'org.apache.logging.log4j', module: 'log4j-api' } implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.17.2') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.2') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.18.0') + implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0') implementation ('org.apache.logging.log4j:log4j-core:2.24.0') implementation ('org.apache.logging.log4j:log4j-api:2.24.0') implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.24.0') diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 1c4be66e..1ba9bef6 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 7.0.0-M9 - 2.17.2 + 2.18.0 5.11.0 2.24.0 diff --git a/pom.xml b/pom.xml index f2e5579e..82509750 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 10.0.3 - 2.17.2 + 2.18.0 2.0.16 5.11.0 5.12.0 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 9afa24c7..8be9f574 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.17.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.0', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 8d9f5029..575a2afd 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.9 - 2.17.2 + 2.18.0 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index eedeaafb..cf412a19 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', - 'com.fasterxml.jackson.core:jackson-databind:2.17.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 85eb0492..4a760c63 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -22,8 +22,8 @@ dependencies { 'org.hibernate.validator:hibernate-validator:6.1.7.Final', 'org.glassfish:jakarta.el:5.0.0-M1', 'jakarta.el:jakarta.el-api:5.0.1', - 'com.fasterxml.jackson.core:jackson-databind:2.17.2', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.0', + 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0', 'org.apache.logging.log4j:log4j-core:2.24.0', 'org.apache.logging.log4j:log4j-api:2.24.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 09a6e411..4de37279 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 7.0.0-M9 - 2.17.2 + 2.18.0 4.13.2 2.24.0 From 45e77e9d033d8db63e696f68ace154b4531f5d69 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Oct 2024 11:53:29 +0100 Subject: [PATCH 1004/1214] chore(deps): update JUnit version to 5.11.3 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index e8a58a7a..e62c9601 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") - testImplementation(platform("org.junit:junit-bom:5.11.0")) + testImplementation(platform("org.junit:junit-bom:5.11.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 0c34139c..6c855ad9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.9 2.18.0 - 5.11.0 + 5.11.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 8ba66cc0..a476155a 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") - testImplementation(platform("org.junit:junit-bom:5.11.0")) + testImplementation(platform("org.junit:junit-bom:5.11.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index d5972162..bed207b3 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.1.14 - 5.11.0 + 5.11.3 2.24.0 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 9877ece3..b29bdefd 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") - testImplementation(platform("org.junit:junit-bom:5.11.0")) + testImplementation(platform("org.junit:junit-bom:5.11.3")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 1d8b963d..ef9a6170 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.11.0 + 5.11.3 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 1f67ba44..499f170a 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -43,7 +43,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4") - testImplementation(platform("org.junit:junit-bom:5.11.0")) + testImplementation(platform("org.junit:junit-bom:5.11.3")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M9') { exclude group: 'org.apache.struts', module: 'struts2-core' diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index 1ba9bef6..b9d990c6 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 7.0.0-M9 2.18.0 - 5.11.0 + 5.11.3 2.24.0 diff --git a/pom.xml b/pom.xml index cc82de4d..7c55c34a 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 10.0.3 2.18.0 2.0.16 - 5.11.0 + 5.11.3 5.14.2 1.3 UTF-8 From 36a6c8da22cb2c724996926621e837d16e40bd48 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 28 Oct 2024 11:55:24 +0100 Subject: [PATCH 1005/1214] chore(deps): Update Log4J dependencies to 2.24.1 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- samples/struts/pet-store/build.gradle | 4 ++-- samples/struts/pet-store/pom.xml | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index a476155a..6e57dbce 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.14', 'org.springframework:spring-context:6.1.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.0', - 'org.apache.logging.log4j:log4j-api:2.24.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', + 'org.apache.logging.log4j:log4j-core:2.24.1', + 'org.apache.logging.log4j:log4j-api:2.24.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.1', 'com.fasterxml.jackson.core:jackson-databind:2.18.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index bed207b3..bc88be91 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.1.14 5.11.3 - 2.24.0 + 2.24.1 diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle index 499f170a..7960abe9 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle @@ -36,9 +36,9 @@ dependencies { implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') implementation ('com.fasterxml.jackson.core:jackson-databind:2.18.0') implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0') - implementation ('org.apache.logging.log4j:log4j-core:2.24.0') - implementation ('org.apache.logging.log4j:log4j-api:2.24.0') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.24.0') + implementation ('org.apache.logging.log4j:log4j-core:2.24.1') + implementation ('org.apache.logging.log4j:log4j-api:2.24.1') + implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.24.1') implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml index b9d990c6..a193394c 100644 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 7.0.0-M9 2.18.0 5.11.3 - 2.24.0 + 2.24.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index cf412a19..6f1503b0 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.1.14', 'org.springframework:spring-context:6.1.14', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.0', - 'org.apache.logging.log4j:log4j-api:2.24.0', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.0', + 'org.apache.logging.log4j:log4j-core:2.24.1', + 'org.apache.logging.log4j:log4j-api:2.24.1', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.1', 'com.fasterxml.jackson.core:jackson-databind:2.18.0', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 9634fe9f..9e5560e7 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.1.14 - 2.24.0 + 2.24.1 17 17 diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle index 4a760c63..fdc9601c 100644 --- a/samples/struts/pet-store/build.gradle +++ b/samples/struts/pet-store/build.gradle @@ -24,8 +24,8 @@ dependencies { 'jakarta.el:jakarta.el-api:5.0.1', 'com.fasterxml.jackson.core:jackson-databind:2.18.0', 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.0', - 'org.apache.logging.log4j:log4j-core:2.24.0', - 'org.apache.logging.log4j:log4j-api:2.24.0', + 'org.apache.logging.log4j:log4j-core:2.24.1', + 'org.apache.logging.log4j:log4j-api:2.24.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml index 4de37279..9042ea76 100644 --- a/samples/struts/pet-store/pom.xml +++ b/samples/struts/pet-store/pom.xml @@ -29,7 +29,7 @@ 7.0.0-M9 2.18.0 4.13.2 - 2.24.0 + 2.24.1 From 64b9b04eacd6686a6aaddbc3bc6b5bbc0590ab6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:55:57 +0000 Subject: [PATCH 1006/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.6.2 to 4.8.6.5. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.6.2...spotbugs-maven-plugin-4.8.6.5) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cc82de4d..159ab086 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.6.2 + 4.8.6.5 - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.1.0-SNAPSHOT - - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.1.0-SNAPSHOT - tests - test-jar - test - - - - org.apache.struts - struts2-core - ${struts.version} - - - commons-io - commons-io - - - - - org.apache.struts - struts2-json-plugin - ${struts.version} - test - - - - org.apache.struts - struts2-junit-plugin - ${struts.version} - test - - - junit - junit - - - - - - commons-codec - commons-codec - 1.17.1 - test - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - jakarta.el - jakarta.el-api - 5.0.1 - test - - - - jakarta.servlet.jsp - jakarta.servlet.jsp-api - 3.1.0 - test - - - - org.glassfish - jakarta.el - 5.0.0-M1 - test - - - - - - - org.jacoco - jacoco-maven-plugin - - ${basedir}/target/coverage-reports/jacoco-unit.exec - ${basedir}/target/coverage-reports/jacoco-unit.exec - - - - default-prepare-agent - - prepare-agent - - - - jacoco-site - package - - report - - - - jacoco-check - test - - check - - - true - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - ${jacoco.minCoverage} - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - com.github.spotbugs - spotbugs-maven-plugin - - - - analyze-compile - compile - - check - - - - - - org.owasp - dependency-check-maven - ${dependencyCheck.version} - - true - - ${project.basedir}/../owasp-suppression.xml - - 7 - false - - - - - - - - apache-pre-release - https://repository.apache.org/content/repositories/staging/ - default - - - diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java deleted file mode 100644 index 257de488..00000000 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaContainerHandler.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.struts; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpApiV2HttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.services.lambda.runtime.Context; -import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; -import jakarta.servlet.Servlet; -import jakarta.servlet.http.HttpServletRequest; -import java.util.EnumSet; -import java.util.concurrent.CountDownLatch; - -/** - * A Lambda handler to initialize the Struts filter and proxy the requests. - * - * @param request type - * @param response type - */ -public class StrutsLambdaContainerHandler extends AwsLambdaServletContainerHandler { - - private static final Logger log = LoggerFactory.getLogger(StrutsLambdaContainerHandler.class); - - public static final String HEADER_STRUTS_STATUS_CODE = "X-Struts-StatusCode"; - - private static final String TIMER_STRUTS_CONTAINER_CONSTRUCTOR = "STRUTS_CONTAINER_CONSTRUCTOR"; - private static final String TIMER_STRUTS_HANDLE_REQUEST = "STRUTS_HANDLE_REQUEST"; - private static final String TIMER_STRUTS_COLD_START_INIT = "STRUTS_COLD_START_INIT"; - private static final String STRUTS_FILTER_NAME = "StrutsFilter"; - - private boolean initialized; - - public static StrutsLambdaContainerHandler getAwsProxyHandler() { - return new StrutsLambdaContainerHandler( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler()); - } - - public static StrutsLambdaContainerHandler getHttpApiV2ProxyHandler() { - return new StrutsLambdaContainerHandler( - HttpApiV2ProxyRequest.class, - AwsProxyResponse.class, - new AwsHttpApiV2HttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(true), - new AwsHttpApiV2SecurityContextWriter(), - new AwsProxyExceptionHandler()); - } - - public StrutsLambdaContainerHandler(Class requestTypeClass, - Class responseTypeClass, - RequestReader requestReader, - ResponseWriter responseWriter, - SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler) { - - super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start(TIMER_STRUTS_CONTAINER_CONSTRUCTOR); - this.initialized = false; - Timer.stop(TIMER_STRUTS_CONTAINER_CONSTRUCTOR); - } - - @Override - protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { - return new AwsHttpServletResponse(request, latch); - } - - @Override - protected void handleRequest(HttpServletRequest httpServletRequest, - AwsHttpServletResponse httpServletResponse, - Context lambdaContext) throws Exception { - Timer.start(TIMER_STRUTS_HANDLE_REQUEST); - if (!this.initialized) { - initialize(); - } - - if (AwsHttpServletRequest.class.isAssignableFrom(httpServletRequest.getClass())) { - ((AwsHttpServletRequest)httpServletRequest).setServletContext(this.getServletContext()); - } - this.doFilter(httpServletRequest, httpServletResponse, null); - String responseStatusCode = httpServletResponse.getHeader(HEADER_STRUTS_STATUS_CODE); - if (responseStatusCode != null) { - httpServletResponse.setStatus(Integer.parseInt(responseStatusCode)); - } - Timer.stop(TIMER_STRUTS_HANDLE_REQUEST); - } - - @Override - public void initialize() throws ContainerInitializationException { - log.info("Initialize Struts Lambda Application ..."); - Timer.start(TIMER_STRUTS_COLD_START_INIT); - try { - if (this.startupHandler != null) { - this.startupHandler.onStartup(this.getServletContext()); - } - StrutsPrepareAndExecuteFilter filter = new StrutsPrepareAndExecuteFilter(); - FilterRegistration.Dynamic filterRegistration = this.getServletContext() - .addFilter(STRUTS_FILTER_NAME, filter); - filterRegistration.addMappingForUrlPatterns( - EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE, DispatcherType.FORWARD), - true, "/*"); - } catch (Exception e) { - throw new ContainerInitializationException("Could not initialize Struts container", e); - } - - this.initialized = true; - Timer.stop(TIMER_STRUTS_COLD_START_INIT); - log.info("... initialize of Struts Lambda Application completed!"); - } - - public Servlet getServlet() { - return null; - } -} diff --git a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java b/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java deleted file mode 100644 index 0e1ccfa1..00000000 --- a/aws-serverless-java-container-struts/src/main/java/com/amazonaws/serverless/proxy/struts/StrutsLambdaHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.struts; - -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * The lambda handler to handle the requests. - *

- * - * com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest - * - */ -public class StrutsLambdaHandler implements RequestStreamHandler { - - private final StrutsLambdaContainerHandler handler = StrutsLambdaContainerHandler - .getAwsProxyHandler(); - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java deleted file mode 100644 index 6d7e2a37..00000000 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/StrutsAwsProxyTest.java +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.struts; - - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.struts.echoapp.EchoAction; -import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.codec.binary.Base64; -import org.apache.struts2.junit.StrutsRestTestCase; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import jakarta.ws.rs.core.Response; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -/** - * Unit test class for the Struts2 AWS_PROXY default implementation - */ -public class StrutsAwsProxyTest extends StrutsRestTestCase { - private static final String CUSTOM_HEADER_KEY = "x-custom-header"; - private static final String CUSTOM_HEADER_VALUE = "my-custom-value"; - private static final String AUTHORIZER_PRINCIPAL_ID = "test-principal-" + UUID.randomUUID().toString(); - private static final String HTTP_METHOD_GET = "GET"; - private static final String QUERY_STRING_MODE = "mode"; - private static final String QUERY_STRING_KEY = "message"; - private static final String QUERY_STRING_ENCODED_VALUE = "Hello Struts2"; - private static final String USER_PRINCIPAL = "user1"; - private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json; charset=UTF-8"; - - - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private final StrutsLambdaContainerHandler handler = StrutsLambdaContainerHandler - .getAwsProxyHandler(); - private final StrutsLambdaContainerHandler httpApiHandler = StrutsLambdaContainerHandler - .getHttpApiV2ProxyHandler(); - private final Context lambdaContext = new MockLambdaContext(); - private String type; - - public void initStrutsAwsProxyTest(String reqType) { - type = reqType; - } - - public static Collection data() { - return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); - } - - private AwsProxyResponse executeRequest(AwsProxyRequestBuilder requestBuilder, Context lambdaContext) { - switch (type) { - case "API_GW": - return handler.proxy(requestBuilder.build(), lambdaContext); - case "ALB": - return handler.proxy(requestBuilder.alb().build(), lambdaContext); - case "HTTP_API": - return httpApiHandler.proxy(requestBuilder.toHttpApiV2Request(), lambdaContext); - default: - throw new RuntimeException("Unknown request type: " + type); - } - } - - @MethodSource("data") - @ParameterizedTest - void headers_getHeaders_echo(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "headers") - .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .json(); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - - validateMapResponseModel(output); - } - - @MethodSource("data") - @ParameterizedTest - void context_servletResponse_setCustomHeader(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) - .queryString("customHeader", "true") - .json(); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertTrue(output.getMultiValueHeaders().containsKey("XX")); - } - - @MethodSource("data") - @ParameterizedTest - void context_serverInfo_correctContext(String reqType) { - initStrutsAwsProxyTest(reqType); - assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET) - .queryString(QUERY_STRING_KEY, "Hello Struts2") - .header("Content-Type", "application/json") - .queryString("contentType", "true"); - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - - validateSingleValueModel(output, "Hello Struts2"); - } - - @MethodSource("data") - @ParameterizedTest - void queryString_uriInfo_echo(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "query-string") - .queryString(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE) - .json(); - - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - - validateMapResponseModel(output); - } - - @MethodSource("data") - @ParameterizedTest - void requestScheme_valid_expectHttps(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "scheme") - .queryString(QUERY_STRING_KEY, QUERY_STRING_ENCODED_VALUE) - .json(); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - - validateSingleValueModel(output, "https"); - } - - @MethodSource("data") - @ParameterizedTest - void authorizer_securityContext_customPrincipalSuccess(String reqType) { - initStrutsAwsProxyTest(reqType); - assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "principal") - .json() - .authorizerPrincipal(AUTHORIZER_PRINCIPAL_ID); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertEquals(CONTENT_TYPE_APPLICATION_JSON, output.getMultiValueHeaders().getFirst("Content-Type")); - - validateSingleValueModel(output, AUTHORIZER_PRINCIPAL_ID); - } - - @MethodSource("data") - @ParameterizedTest - void errors_unknownRoute_expect404(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/unknown", HTTP_METHOD_GET); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(404, output.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void error_contentType_invalidContentType(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString(QUERY_STRING_MODE, "content-type") - .header("Content-Type", "application/octet-stream") - .body("asdasdasd"); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(415, output.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void error_statusCode_methodNotAllowed(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString(QUERY_STRING_MODE, "not-allowed") - .json(); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(405, output.getStatusCode()); - } - - - @MethodSource("data") - @ParameterizedTest - void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { - initStrutsAwsProxyTest(reqType); - Map value = new HashMap<>(); - value.put(QUERY_STRING_KEY, CUSTOM_HEADER_VALUE); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", "POST") - .json() - .body(OBJECT_MAPPER.writeValueAsString(value)); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - assertNotNull(output.getBody()); - - validateSingleValueModel(output, "{\"message\":\"my-custom-value\"}"); - } - - @MethodSource("data") - @ParameterizedTest - void statusCode_responseStatusCode_customStatusCode(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "custom-status-code") - .queryString("status", "201") - .json(); - - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(201, output.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void base64_binaryResponse_base64Encoding(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET); - - AwsProxyResponse response = executeRequest(request, lambdaContext); - assertNotNull(response.getBody()); - assertTrue(Base64.isBase64(response.getBody())); - } - - @MethodSource("data") - @ParameterizedTest - void exception_mapException_mapToNotImplemented(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", "POST") - .queryString(QUERY_STRING_MODE, "not-implemented"); - - AwsProxyResponse response = executeRequest(request, lambdaContext); - assertNotNull(response.getBody()); - assertEquals("null", response.getBody()); - assertEquals(Response.Status.NOT_IMPLEMENTED.getStatusCode(), response.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void stripBasePath_route_shouldRouteCorrectly(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo", HTTP_METHOD_GET) - .json() - .queryString(QUERY_STRING_KEY, "stripped"); - handler.stripBasePath("/custompath"); - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(200, output.getStatusCode()); - validateSingleValueModel(output, "stripped"); - handler.stripBasePath(""); - } - - @MethodSource("data") - @ParameterizedTest - void stripBasePath_route_shouldReturn404(String reqType) { - initStrutsAwsProxyTest(reqType); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/custompath/echo/status-code", HTTP_METHOD_GET) - .json() - .queryString("status", "201"); - handler.stripBasePath("/custom"); - AwsProxyResponse output = executeRequest(request, lambdaContext); - assertEquals(404, output.getStatusCode()); - handler.stripBasePath(""); - } - - @MethodSource("data") - @ParameterizedTest - void securityContext_injectPrincipal_expectPrincipalName(String reqType) { - initStrutsAwsProxyTest(reqType); - assumeTrue("API_GW".equals(type)); - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo-request-info", HTTP_METHOD_GET) - .queryString(QUERY_STRING_MODE, "principal") - .authorizerPrincipal(USER_PRINCIPAL); - - AwsProxyResponse resp = executeRequest(request, lambdaContext); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, USER_PRINCIPAL); - } - - @MethodSource("data") - @ParameterizedTest - void queryParam_encoding_expectUnencodedParam(String reqType) { - initStrutsAwsProxyTest(reqType); - assumeTrue("API_GW".equals(type)); - String paramValue = "p%2Fz%2B3"; - String decodedParam = ""; - try { - decodedParam = URLDecoder.decode(paramValue, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - fail("Could not decode parameter"); - } - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, decodedParam); - - AwsProxyResponse resp = executeRequest(request, lambdaContext); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, decodedParam); - } - - @MethodSource("data") - @ParameterizedTest - void queryParam_encoding_expectEncodedParam(String reqType) { - initStrutsAwsProxyTest(reqType); - assumeTrue("API_GW".equals(type)); - String paramValue = "p%2Fz%2B3"; - AwsProxyRequestBuilder request = new AwsProxyRequestBuilder("/echo", HTTP_METHOD_GET).queryString(QUERY_STRING_KEY, paramValue); - - AwsProxyResponse resp = executeRequest(request, lambdaContext); - assertEquals(200, resp.getStatusCode()); - validateSingleValueModel(resp, paramValue); - } - - - private void validateMapResponseModel(AwsProxyResponse output) { - validateMapResponseModel(output, CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE); - } - - private void validateMapResponseModel(AwsProxyResponse output, String key, String value) { - try { - TypeReference> typeRef - = new TypeReference>() { - }; - HashMap response = OBJECT_MAPPER.readValue(output.getBody(), typeRef); - assertNotNull(response.get(key)); - assertEquals(value, response.get(key)); - } catch (IOException e) { - e.printStackTrace(); - fail("Exception while parsing response body: " + e.getMessage()); - } - } - - private void validateSingleValueModel(AwsProxyResponse output, String value) { - try { - assertNotNull(output.getBody()); - assertEquals(value, OBJECT_MAPPER.readerFor(String.class).readValue(output.getBody())); - } catch (Exception e) { - e.printStackTrace(); - fail("Exception while parsing response body: " + e.getMessage()); - } - } -} diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java deleted file mode 100644 index ad6c6318..00000000 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoAction.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.amazonaws.serverless.proxy.struts.echoapp; - -import com.opensymphony.xwork2.ActionSupport; -import org.apache.commons.io.IOUtils; -import org.apache.struts2.ServletActionContext; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; - - -public class EchoAction extends ActionSupport { - - private String message; - - public String execute() throws IOException { - HttpServletRequest request = ServletActionContext.getRequest(); - - if (message == null && requestHasBody(request)) { - message = IOUtils.toString(request.getReader()); - } - - return SUCCESS; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public void setCustomHeader(boolean customHeader) { - if (customHeader) { - HttpServletResponse response = ServletActionContext.getResponse(); - response.setHeader("XX", "FOO"); - } - } - - - public void setContentType(boolean contentType) { - if (contentType) { - HttpServletResponse response = ServletActionContext.getResponse(); - response.setContentType("application/json"); - } - } - - private boolean requestHasBody(HttpServletRequest request) throws IOException { - return ("POST".equalsIgnoreCase(request.getMethod()) || "PUT".equalsIgnoreCase(request.getMethod())) && request.getReader() != null; - } - -} diff --git a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java b/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java deleted file mode 100644 index e810f319..00000000 --- a/aws-serverless-java-container-struts/src/test/java/com/amazonaws/serverless/proxy/struts/echoapp/EchoRequestInfoAction.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.amazonaws.serverless.proxy.struts.echoapp; - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; -import com.opensymphony.xwork2.ActionSupport; -import org.apache.struts2.ServletActionContext; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - - -public class EchoRequestInfoAction extends ActionSupport { - - private String mode = "principal"; - private Object result = null; - - public String execute() { - - HttpServletRequest request = ServletActionContext.getRequest(); - AwsProxyRequestContext awsProxyRequestContext = - (AwsProxyRequestContext) request - .getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - - switch (mode) { - case "principal": - result = awsProxyRequestContext.getAuthorizer().getPrincipalId(); - break; - case "scheme": - result = request.getScheme(); - break; - case "content-type": - if (request.getContentType().contains("application/octet-stream")) { - ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE); - } - result = request.getContentType(); - break; - case "not-allowed": - ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED); - break; - case "custom-status-code": - ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_CREATED); - break; - case "not-implemented": - ServletActionContext.getResponse().setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED); - break; - case "headers": - Map headers = new HashMap<>(); - - Enumeration headerNames = request.getHeaderNames(); - while (headerNames.hasMoreElements()) { - String headerName = headerNames.nextElement(); - headers.put(headerName, request.getHeader(headerName)); - } - - result = headers; - break; - case "query-string": - Map params = new HashMap<>(); - - Enumeration parameterNames = request.getParameterNames(); - while (parameterNames.hasMoreElements()) { - String parameterName = parameterNames.nextElement(); - params.put(parameterName, request.getParameter(parameterName)); - } - - result = params; - break; - default: - throw new IllegalArgumentException("Invalid mode requested: " + mode); - } - - return SUCCESS; - } - - public Object getResult() { - return result; - } - - public void setMode(String mode) { - this.mode = mode; - } -} diff --git a/aws-serverless-java-container-struts/src/test/resources/log4j2.xml b/aws-serverless-java-container-struts/src/test/resources/log4j2.xml deleted file mode 100644 index 55ed0d21..00000000 --- a/aws-serverless-java-container-struts/src/test/resources/log4j2.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n - - - - - - - - - - - \ No newline at end of file diff --git a/aws-serverless-java-container-struts/src/test/resources/struts.xml b/aws-serverless-java-container-struts/src/test/resources/struts.xml deleted file mode 100644 index 92070be8..00000000 --- a/aws-serverless-java-container-struts/src/test/resources/struts.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - message - - - - - - - - result - - - - - - - \ No newline at end of file diff --git a/aws-serverless-struts-archetype/pom.xml b/aws-serverless-struts-archetype/pom.xml deleted file mode 100644 index 9d6cda35..00000000 --- a/aws-serverless-struts-archetype/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - 4.0.0 - - - com.amazonaws.serverless - aws-serverless-java-container - 2.1.0-SNAPSHOT - - - com.amazonaws.serverless.archetypes - aws-serverless-struts-archetype - 2.1.0-SNAPSHOT - maven-archetype - - - https://github.com/aws/serverless-java-container.git - HEAD - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - - src/main/resources - true - - archetype-resources/pom.xml - archetype-resources/README.md - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.0.1 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.3.1 - - \ - - - - org.apache.maven.plugins - maven-archetype-plugin - 3.0.1 - - - - integration-test - - - - - - - - diff --git a/aws-serverless-struts-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-struts-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index ad8b8624..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - src/main/java - - **/*.java - - - - src/test/java - - **/*.java - - - - src/main/resources - - **/*.properties - **/*.xml - - - - src/main/assembly - - **/*.xml - - - - - - template.yml - README.md - build.gradle - - - - \ No newline at end of file diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md deleted file mode 100644 index 311c40ae..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/README.md +++ /dev/null @@ -1,99 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). - -The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. - -The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). - -#[[##]]# Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -#[[##]]# Building the project -You can use the SAM CLI to quickly build the project -```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false -$ cd \${artifactId} -$ sam build -Building resource '\${resourceName}Function' -Running JavaGradleWorkflow:GradleBuild -Running JavaGradleWorkflow:CopyArtifacts - -Build Succeeded - -Built Artifacts : .aws-sam/build -Built Template : .aws-sam/build/template.yaml - -Commands you can use next -========================= -[*] Invoke Function: sam local invoke -[*] Deploy: sam deploy --guided -``` - -#[[##]]# Testing locally with the SAM CLI - -From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. - -```bash -$ sam local start-api - -... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] -... -``` - -Using a new shell, you can send a test ping request to your API: - -```bash -$ curl -s http://127.0.0.1:3000/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` - -#[[##]]# Deploying to AWS -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... -------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------- -\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets -------------------------------------------------------------------------------------------------------------- -``` - -Copy the `OutputValue` into a browser or use curl to test your first request: - -```bash -$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle deleted file mode 100644 index 4ff9dfc3..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/build.gradle +++ /dev/null @@ -1,65 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() -} - -configurations { - implementation { - exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' - } -} - -dependencies { - - implementation ('com.amazonaws.serverless:aws-serverless-java-container-struts:[1.0,)') { - exclude group: 'org.apache.struts', module: 'struts2-core' - exclude group: 'org.apache.logging.log4j', module: 'log4j-api' - exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' - } - implementation ('org.apache.struts:struts2-convention-plugin:7.0.0-M9') { - exclude group: 'org.apache.struts', module: 'struts2-core' - } - implementation ('org.apache.struts:struts2-rest-plugin:7.0.0-M9') { - exclude group: 'org.apache.struts', module: 'struts2-core' - } - implementation ('org.apache.struts:struts2-bean-validation-plugin:7.0.0-M9') { - exclude group: 'org.apache.struts', module: 'struts2-core' - } - implementation ('com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.3') { - exclude group: 'org.apache.struts', module: 'struts2-core' - } - implementation ('org.apache.struts:struts2-core:7.0.0-M9') { - exclude group: 'org.apache.logging.log4j', module: 'log4j-api' - } - implementation ('org.hibernate.validator:hibernate-validator:6.1.7.Final') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.18.1') - implementation ('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.1') - implementation ('org.apache.logging.log4j:log4j-core:2.24.1') - implementation ('org.apache.logging.log4j:log4j-api:2.24.1') - implementation ('org.apache.logging.log4j:log4j-slf4j-impl:2.24.1') - implementation ('com.amazonaws:aws-lambda-java-log4j2:1.6.0') - - testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") - testImplementation(platform("org.junit:junit-bom:5.11.3")) - testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation('org.apache.struts:struts2-junit-plugin:7.0.0-M9') { - exclude group: 'org.apache.struts', module: 'struts2-core' - } -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) - } -} - -test { - useJUnitPlatform() -} - -build.dependsOn buildZip diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index f64194a5..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - 4.0.0 - - \${groupId} - \${artifactId} - \${version} - jar - - Serverless Struts API - https://github.com/aws/serverless-java-container - - - 1.8 - 1.8 - 7.0.0-M9 - 2.18.1 - 5.11.3 - 2.24.1 - - - - - com.amazonaws.serverless - aws-serverless-java-container-struts - ${project.version} - - - com.amazonaws.serverless - aws-serverless-java-container-core - ${project.version} - tests - test-jar - test - - - org.apache.httpcomponents.client5 - httpclient5 - 5.4.1 - test - - - - org.apache.struts - struts2-convention-plugin - \${struts.version} - - - - org.apache.struts - struts2-rest-plugin - \${struts.version} - - - - org.apache.struts - struts2-bean-validation-plugin - \${struts.version} - - - - org.apache.struts - struts2-junit-plugin - \${struts.version} - test - - - - - com.jgeppert.struts2 - struts2-aws-lambda-support-plugin - 1.4.3 - - - - - org.hibernate.validator - hibernate-validator - 6.1.7.Final - - - - com.fasterxml.jackson.core - jackson-core - \${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - \${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - \${jackson.version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - \${jackson.version} - - - - org.apache.logging.log4j - log4j-core - \${log4j.version} - - - - org.apache.logging.log4j - log4j-api - \${log4j.version} - - - - com.amazonaws - aws-lambda-java-log4j2 - 1.6.0 - - - - jakarta.el - jakarta.el-api - 5.0.1 - test - - - org.glassfish - jakarta.el - 5.0.0-M1 - test - - - - org.junit.jupiter - junit-jupiter - test - - - - - - - org.junit - junit-bom - ${junit.version} - import - pom - - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - src/main/assembly/dist.xml - - - - - lambda - package - - single - - - - - - - - - - apache-pre-release - https://repository.apache.org/content/repositories/staging/ - default - - - diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml deleted file mode 100644 index 0466b85c..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/assembly/dist.xml +++ /dev/null @@ -1,31 +0,0 @@ - - lambda - - zip - - false - - - lib - false - - - - - ${basedir}/src/main/resources - - - * - - - - ${project.build.directory}/classes - - - **/*.class - - - - \ No newline at end of file diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java deleted file mode 100644 index f3763f4d..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/java/actions/PingController.java +++ /dev/null @@ -1,70 +0,0 @@ -package ${groupId}.actions; - - -import com.opensymphony.xwork2.ModelDriven; -import org.apache.struts2.rest.DefaultHttpHeaders; -import org.apache.struts2.rest.HttpHeaders; -import org.apache.struts2.rest.RestActionSupport; - - -import java.util.Collection; -import java.util.UUID; - - -public class PingController extends RestActionSupport implements ModelDriven { - - private String model = new String(); - private String id; - private Collection list = null; - - - // GET /ping/1 - public HttpHeaders show() { - return new DefaultHttpHeaders("show"); - } - - // GET /ping - public HttpHeaders index() { - this.model = "Hello, World!"; - return new DefaultHttpHeaders("index") - .disableCaching(); - } - - // POST /ping - public HttpHeaders create() { - this.model = UUID.randomUUID().toString(); - return new DefaultHttpHeaders("success") - .setLocationId(model); - - } - - // PUT /ping/1 - public String update() { - //TODO: UPDATE LOGIC - return SUCCESS; - } - - // DELETE /ping/1 - public String destroy() { - //TODO: DELETE LOGIC - return SUCCESS; - } - - public void setId(String id) { - if (id != null) { - this.model = "New model instance"; - } - this.id = id; - } - - public Object getModel() { - if (list != null) { - return list; - } else { - if (model == null) { - model = "Pong"; - } - return model; - } - } -} diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties deleted file mode 100644 index 070e632f..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Reduce logging level to make sure the application works with SAM local -# https://github.com/aws/serverless-java-container/issues/134 -logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml deleted file mode 100644 index 55ed0d21..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/log4j2.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n - - - - - - - - - - - \ No newline at end of file diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml deleted file mode 100644 index f6975ffd..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/main/resources/struts.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java deleted file mode 100644 index 87586777..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import jakarta.ws.rs.HttpMethod; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.*; - -public class StreamLambdaHandlerTest { - - private static StrutsLambdaHandler handler; - private static Context lambdaContext; - - @BeforeAll - public static void setUp() { - handler = new StrutsLambdaHandler(); - lambdaContext = new MockLambdaContext(); - } - - @Test - public void ping_streamRequest_respondsWithHello() { - InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); - - assertFalse(response.isBase64Encoded()); - - assertTrue(response.getBody().contains("Hello, World!")); - - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); - } - - @Test - public void invalidResource_streamRequest_responds404() { - InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); - } - - private void handle(InputStream is, ByteArrayOutputStream os) { - try { - handler.handleRequest(is, os, lambdaContext); - } catch (IOException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { - try { - return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { - e.printStackTrace(); - fail("Error while parsing response: " + e.getMessage()); - } - return null; - } -} diff --git a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml deleted file mode 100644 index fe446ded..00000000 --- a/aws-serverless-struts-archetype/src/main/resources/archetype-resources/template.yml +++ /dev/null @@ -1,52 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -#macro(regionVar) - AWS::Region -#end -#set($awsRegion = "#regionVar()") -#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Apache Struts API - ${groupId}::${artifactId} -Globals: - Api: - EndpointConfiguration: REGIONAL - -Resources: - ${resourceName}Function: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest - Runtime: java11 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Events: - ProxyResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - ${resourceName}Api: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' - Export: - Name: ${resourceName}Api diff --git a/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties deleted file mode 100644 index 80acd0f4..00000000 --- a/aws-serverless-struts-archetype/src/test/resources/projects/base/archetype.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=test.service -artifactId=struts-archetype-test -version=1.0-SNAPSHOT diff --git a/aws-serverless-struts-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-struts-archetype/src/test/resources/projects/base/goal.txt deleted file mode 100644 index 597acc76..00000000 --- a/aws-serverless-struts-archetype/src/test/resources/projects/base/goal.txt +++ /dev/null @@ -1 +0,0 @@ -package \ No newline at end of file diff --git a/samples/struts/pet-store/README.md b/samples/struts/pet-store/README.md deleted file mode 100644 index bc5c047a..00000000 --- a/samples/struts/pet-store/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Serverless Struts example -A basic pet store written with the [Apache Struts framework](https://struts.apache.org). The `StrutsLambdaHandler` object provided by the `aws-serverless-java-container-struts` is the main entry point for Lambda. - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ mvn package && sam build -``` - -### Test Local - -``` -$ sam local invoke -e test-event.json -``` - -### Deploy Sample Application - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -Outputs ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -Key StrutsPetStoreApi -Description URL for application -Value https://xxxxxxxxxx.execute-api..amazonaws.com/pets ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -``` -## Test - -### JSON Request: -``` -$ curl https://xxxxxxxxxx.execute-api..amazonaws.com/pets.json -``` - -### XML Request -``` -$ curl https://xxxxxxxxxx.execute-api..amazonaws.com/pets.xml -``` \ No newline at end of file diff --git a/samples/struts/pet-store/build.gradle b/samples/struts/pet-store/build.gradle deleted file mode 100644 index ecc765cb..00000000 --- a/samples/struts/pet-store/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() -} - -configurations { - implementation { - exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' - } -} - -dependencies { - implementation ( - 'com.amazonaws.serverless:aws-serverless-java-container-struts:[2.0-SNAPSHOT,)', - 'org.apache.struts:struts2-convention-plugin:7.0.0-M9', - 'org.apache.struts:struts2-rest-plugin:7.0.0-M9', - 'org.apache.struts:struts2-bean-validation-plugin:7.0.0-M9', - 'org.apache.struts:struts2-junit-plugin:7.0.0-M9', - 'com.jgeppert.struts2:struts2-aws-lambda-support-plugin:1.4.3', - 'org.hibernate.validator:hibernate-validator:6.1.7.Final', - 'org.glassfish:jakarta.el:5.0.0-M1', - 'jakarta.el:jakarta.el-api:5.0.1', - 'com.fasterxml.jackson.core:jackson-databind:2.18.1', - 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.18.1', - 'org.apache.logging.log4j:log4j-core:2.24.1', - 'org.apache.logging.log4j:log4j-api:2.24.1', - 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', - ) -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) - } -} - -build.dependsOn buildZip diff --git a/samples/struts/pet-store/pom.xml b/samples/struts/pet-store/pom.xml deleted file mode 100644 index 49c035d4..00000000 --- a/samples/struts/pet-store/pom.xml +++ /dev/null @@ -1,177 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - serverless-struts-example - 2.0-SNAPSHOT - Struts example for the aws-serverless-java-container library - Simple pet store written with the Apache Struts framework - https://aws.amazon.com/lambda/ - - - https://github.com/aws/serverless-java-container.git - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - 1.8 - 1.8 - 7.0.0-M9 - 2.18.1 - 4.13.2 - 2.24.1 - - - - - com.amazonaws.serverless - aws-serverless-java-container-struts - [2.0.0-SNAPSHOT,) - - - - org.apache.struts - struts2-convention-plugin - ${struts.version} - - - - org.apache.struts - struts2-rest-plugin - ${struts.version} - - - - org.apache.struts - struts2-bean-validation-plugin - ${struts.version} - - - - org.apache.struts - struts2-junit-plugin - ${struts.version} - test - - - - - com.jgeppert.struts2 - struts2-aws-lambda-support-plugin - 1.4.3 - - - - - org.hibernate.validator - hibernate-validator - 6.1.7.Final - - - org.glassfish - jakarta.el - 5.0.0-M1 - - - jakarta.el - jakarta.el-api - 5.0.1 - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${jackson.version} - - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - - - - org.apache.logging.log4j - log4j-api - ${log4j.version} - - - - com.amazonaws - aws-lambda-java-log4j2 - 1.6.0 - - - - junit - junit - ${junit.version} - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - src/main/assembly/dist.xml - - - - - lambda - package - - single - - - - - - - - - - apache-pre-release - https://repository.apache.org/content/repositories/staging/ - default - - - diff --git a/samples/struts/pet-store/src/main/assembly/dist.xml b/samples/struts/pet-store/src/main/assembly/dist.xml deleted file mode 100644 index 029ec01c..00000000 --- a/samples/struts/pet-store/src/main/assembly/dist.xml +++ /dev/null @@ -1,31 +0,0 @@ - - lambda - - zip - - false - - - lib - false - - - - - ${basedir}/src/main/resources - / - - * - - - - ${project.build.directory}/classes - / - - **/*.class - - - - \ No newline at end of file diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java deleted file mode 100644 index bc2ad8bb..00000000 --- a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/actions/PetsController.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.struts.actions; - -import com.amazonaws.serverless.sample.struts.model.Pet; -import com.amazonaws.serverless.sample.struts.model.PetData; -import com.opensymphony.xwork2.ModelDriven; -import org.apache.struts2.rest.DefaultHttpHeaders; -import org.apache.struts2.rest.HttpHeaders; -import org.apache.struts2.rest.RestActionSupport; - -import java.util.Collection; -import java.util.UUID; -import java.util.stream.Collectors; - - -public class PetsController extends RestActionSupport implements ModelDriven { - - private Pet model = new Pet(); - private String id; - private Collection list = null; - - // GET /pets/1 - public HttpHeaders show() { - return new DefaultHttpHeaders("show"); - } - - // GET /pets - public HttpHeaders index() { - list = PetData.getNames() - .stream() - .map(petName -> new Pet( - UUID.randomUUID() - .toString(), PetData.getRandomBreed(), petName, PetData.getRandomDoB())) - .collect(Collectors.toList()); - return new DefaultHttpHeaders("index") - .disableCaching(); - } - - // POST /pets - public HttpHeaders create() { - if (model.getName() == null || model.getBreed() == null) { - return null; - } - - Pet dbPet = model; - dbPet.setId(UUID.randomUUID().toString()); - return new DefaultHttpHeaders("success") - .setLocationId(model.getId()); - - } - - // PUT /pets/1 - public String update() { - //TODO: UPDATE LOGIC - return SUCCESS; - } - - // DELETE /petsr/1 - public String destroy() { - //TODO: DELETE LOGIC - return SUCCESS; - } - - public void setId(String id) { - if (id != null) { - this.model = new Pet(id, PetData.getRandomBreed(), PetData.getRandomName(), PetData.getRandomDoB()); - } - this.id = id; - } - - public Object getModel() { - if (list != null) { - return list; - } else { - if (model == null) { - model = new Pet(); - } - return model; - } - } -} diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java deleted file mode 100644 index c9d420ca..00000000 --- a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/Pet.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.struts.model; - -import org.hibernate.validator.constraints.NotBlank; - -import java.util.Date; - -public class Pet { - - private String id; - private String breed; - - @NotBlank - private String name; - private Date dateOfBirth; - - public Pet() { - } - - public Pet(String id, String breed, String name, Date dateOfBirth) { - this.id = id; - this.breed = breed; - this.name = name; - this.dateOfBirth = dateOfBirth; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java b/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java deleted file mode 100644 index 84be64ea..00000000 --- a/samples/struts/pet-store/src/main/java/com/amazonaws/serverless/sample/struts/model/PetData.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.struts.model; - -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/struts/pet-store/src/main/resources/log4j2.xml b/samples/struts/pet-store/src/main/resources/log4j2.xml deleted file mode 100644 index 55ed0d21..00000000 --- a/samples/struts/pet-store/src/main/resources/log4j2.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n - - - - - - - - - - - \ No newline at end of file diff --git a/samples/struts/pet-store/src/main/resources/struts.xml b/samples/struts/pet-store/src/main/resources/struts.xml deleted file mode 100644 index 3f6724e5..00000000 --- a/samples/struts/pet-store/src/main/resources/struts.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/struts/pet-store/template.yml b/samples/struts/pet-store/template.yml deleted file mode 100644 index 85870c6b..00000000 --- a/samples/struts/pet-store/template.yml +++ /dev/null @@ -1,32 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with Apache Struts based on the aws-serverless-java-container library - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.proxy.struts.StrutsLambdaHandler::handleRequest - Runtime: java11 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - StrutsPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: StrutsPetStoreApi diff --git a/samples/struts/pet-store/test-event.json b/samples/struts/pet-store/test-event.json deleted file mode 100644 index 5860f3e8..00000000 --- a/samples/struts/pet-store/test-event.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "body": "eyJ0ZXN0IjoiYm9keSJ9", - "resource": "/{proxy+}", - "path": "/pets.json", - "httpMethod": "GET", - "isBase64Encoded": true, - "queryStringParameters": { - "foo": "bar" - }, - "multiValueQueryStringParameters": { - "foo": [ - "bar" - ] - }, - "pathParameters": { - "proxy": "/path/to/resource" - }, - "stageVariables": { - "baz": "qux" - }, - "headers": { - "Accept": "application/json", - "Accept-Encoding": "gzip, deflate, sdch", - "Accept-Language": "en-US,en;q=0.8", - "Cache-Control": "max-age=0", - "CloudFront-Forwarded-Proto": "https", - "CloudFront-Is-Desktop-Viewer": "true", - "CloudFront-Is-Mobile-Viewer": "false", - "CloudFront-Is-SmartTV-Viewer": "false", - "CloudFront-Is-Tablet-Viewer": "false", - "CloudFront-Viewer-Country": "US", - "Host": "1234567890.execute-api.us-east-1.amazonaws.com", - "Upgrade-Insecure-Requests": "1", - "User-Agent": "Custom User Agent String", - "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", - "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", - "X-Forwarded-For": "127.0.0.1, 127.0.0.2", - "X-Forwarded-Port": "443", - "X-Forwarded-Proto": "https" - }, - "multiValueHeaders": { - "Accept": [ - "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" - ], - "Accept-Encoding": [ - "gzip, deflate, sdch" - ], - "Accept-Language": [ - "en-US,en;q=0.8" - ], - "Cache-Control": [ - "max-age=0" - ], - "CloudFront-Forwarded-Proto": [ - "https" - ], - "CloudFront-Is-Desktop-Viewer": [ - "true" - ], - "CloudFront-Is-Mobile-Viewer": [ - "false" - ], - "CloudFront-Is-SmartTV-Viewer": [ - "false" - ], - "CloudFront-Is-Tablet-Viewer": [ - "false" - ], - "CloudFront-Viewer-Country": [ - "US" - ], - "Host": [ - "0123456789.execute-api.us-east-1.amazonaws.com" - ], - "Upgrade-Insecure-Requests": [ - "1" - ], - "User-Agent": [ - "Custom User Agent String" - ], - "Via": [ - "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)" - ], - "X-Amz-Cf-Id": [ - "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==" - ], - "X-Forwarded-For": [ - "127.0.0.1, 127.0.0.2" - ], - "X-Forwarded-Port": [ - "443" - ], - "X-Forwarded-Proto": [ - "https" - ] - }, - "requestContext": { - "accountId": "123456789012", - "resourceId": "123456", - "stage": "prod", - "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", - "requestTime": "09/Apr/2015:12:34:56 +0000", - "requestTimeEpoch": 1428582896000, - "identity": { - "cognitoIdentityPoolId": null, - "accountId": null, - "cognitoIdentityId": null, - "caller": null, - "accessKey": null, - "sourceIp": "127.0.0.1", - "cognitoAuthenticationType": null, - "cognitoAuthenticationProvider": null, - "userArn": null, - "userAgent": "Custom User Agent String", - "user": null - }, - "path": "/pets.json", - "resourcePath": "/{proxy+}", - "httpMethod": "GET", - "apiId": "1234567890", - "protocol": "HTTP/1.1" - } -} \ No newline at end of file From 96cb50c6262fd9cad963f4cf149b89c7bb10199f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:13:40 +0000 Subject: [PATCH 1014/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.6.5 to 4.8.6.6. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.6.5...spotbugs-maven-plugin-4.8.6.6) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 028ed2af..eb28838b 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.6.5 + 4.8.6.6 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 390ada6d..7bcd50e4 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.3.5') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.0') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 9a70dfb4..32b92a5f 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.5 + 3.4.0 From 1785eb57c7d72f6c1b8468f2e3ad13ddb8298589 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Nov 2024 08:39:32 +0100 Subject: [PATCH 1022/1214] bring back parallel() processing --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index e7df944f..f6a06b7c 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -641,7 +641,7 @@ protected Map generateParameterMap(MultiValuedTreeMap getQueryParamValuesAsList(decodedQs, e.getKey(), false) From 199c7571ddb155e5352eec78e1bbb897f032cb84 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Nov 2024 11:39:34 +0100 Subject: [PATCH 1023/1214] proper use of StringBuilder --- .../com/amazonaws/serverless/proxy/model/AwsProxyRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java index 53ad758f..eeaaf4a6 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/AwsProxyRequest.java @@ -66,7 +66,7 @@ public String getQueryString() { for (String val : this.getMultiValueQueryStringParameters().get(key)) { String separator = params.length() == 0 ? "?" : "&"; - params.append(separator + key + "=" + val); + params.append(separator).append(key).append("=").append(val); } } From ff19be271435b6492a35c09a6d6251acd8759a27 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Nov 2024 11:42:58 +0100 Subject: [PATCH 1024/1214] chore(deps): Update Log4J dependencies to 2.24.2 --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 6 +++--- samples/spring/pet-store/pom.xml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 59871151..80b9addb 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.2.0', 'org.springframework:spring-context:6.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.1', - 'org.apache.logging.log4j:log4j-api:2.24.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.1', + 'org.apache.logging.log4j:log4j-core:2.24.2', + 'org.apache.logging.log4j:log4j-api:2.24.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', 'com.fasterxml.jackson.core:jackson-databind:2.18.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 6a6625c1..42ccf9d4 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -18,7 +18,7 @@ 1.8 6.2.0 5.11.3 - 2.24.1 + 2.24.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 0c7d1c3b..6d30a38e 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.2.0', 'org.springframework:spring-context:6.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.1', - 'org.apache.logging.log4j:log4j-api:2.24.1', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.1', + 'org.apache.logging.log4j:log4j-core:2.24.2', + 'org.apache.logging.log4j:log4j-api:2.24.2', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', 'com.fasterxml.jackson.core:jackson-databind:2.18.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 5716a8be..12a35b31 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.2.0 - 2.24.1 + 2.24.2 17 17 From 25628982712725780527f4a1505f146db699d395 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Nov 2024 11:59:03 +0100 Subject: [PATCH 1025/1214] chore(deps): Update maven-archetype-plugin and archetype-packaging to 3.3.1 (#563) --- aws-serverless-jersey-archetype/pom.xml | 4 ++-- aws-serverless-spring-archetype/pom.xml | 4 ++-- aws-serverless-springboot3-archetype/pom.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f4ae1567..70284c5f 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.2.1 + 3.3.1 @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.3.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 07c5e4e9..952a5573 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.2.1 + 3.3.1 @@ -66,7 +66,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.3.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index a1057f35..3a1cc15d 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.2.1 + 3.3.1 @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.0.1 + 3.3.1 From 2146847c72a5e1ea8aafe8fb8adae6756cf7a29c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 27 Nov 2024 12:15:49 +0100 Subject: [PATCH 1026/1214] chore(deps): add crac dependency to native sample --- samples/springboot3/pet-store-native/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 692844bb..4eec02b6 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -28,6 +28,12 @@ aws-serverless-java-container-springboot3 [2.0.0-SNAPSHOT,),[2.0.0-M1,) + + + org.crac + crac + runtime + com.amazonaws aws-lambda-java-events From 9ad5d1d121698426c06b1da45c186d6948b470df Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 27 Nov 2024 11:24:08 +0000 Subject: [PATCH 1027/1214] chore: release - prepare release aws-serverless-java-container-2.1.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5c110d93..f3a1e709 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 2b7ef7f1..501229ec 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d11e479e..b64304b5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 167ca843..9390bd8e 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0-SNAPSHOT + 2.1.0 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0-SNAPSHOT + 2.1.0 6.2.0 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0-SNAPSHOT + 2.1.0 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 70284c5f..d9ce8dbc 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0-SNAPSHOT + 2.1.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 952a5573..6348f086 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0-SNAPSHOT + 2.1.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.0 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 3a1cc15d..fdba7e03 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0-SNAPSHOT + 2.1.0 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0-SNAPSHOT + 2.1.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.0 diff --git a/pom.xml b/pom.xml index eb28838b..e9bdb687 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0-SNAPSHOT + 2.1.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.0 From 9a497be7542beec2c7bccada559ecff2a12e0faa Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 27 Nov 2024 11:24:09 +0000 Subject: [PATCH 1028/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f3a1e709..f119dc71 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 501229ec..fdb4cf24 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index b64304b5..ab9491d7 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 9390bd8e..49fa7c70 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.0 + 2.2.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.0 + 2.2.0-SNAPSHOT 6.2.0 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.0 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index d9ce8dbc..412459c4 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.0 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 6348f086..8b95c533 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.0 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.0 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index fdba7e03..89469c2e 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.0 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.0 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.0 + HEAD diff --git a/pom.xml b/pom.xml index e9bdb687..35597514 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.0 + 2.2.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.0 + HEAD From e53972bec738e346e6be1ace73c92f2e3699888f Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 28 Nov 2024 11:11:39 +0100 Subject: [PATCH 1029/1214] chore(deps): Update Jackson version to 2.18.2 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 77b045d5..5d2a3a40 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.1', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index e4f6a320..176ef8a4 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.9 - 2.18.1 + 2.18.2 5.11.3 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 80b9addb..9c572b8f 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.2', 'org.apache.logging.log4j:log4j-api:2.24.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', - 'com.fasterxml.jackson.core:jackson-databind:2.18.1', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/pom.xml b/pom.xml index 35597514..e79e0d1e 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 11.1.0 - 2.18.1 + 2.18.2 2.0.16 5.11.3 5.14.2 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index a00d52d5..4c54ac14 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.1', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c77ff074..c7bbe2f0 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.9 - 2.18.1 + 2.18.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 6d30a38e..55876e26 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.2', 'org.apache.logging.log4j:log4j-api:2.24.2', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', - 'com.fasterxml.jackson.core:jackson-databind:2.18.1', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } From ef37379e7e07d5a18c5d1358cabb689e3b82719c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 04:23:42 +0000 Subject: [PATCH 1030/1214] chore(deps): bump org.owasp:dependency-check-maven from 11.1.0 to 11.1.1 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 11.1.0 to 11.1.1. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v11.1.0...v11.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e79e0d1e..8d65ff10 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 11.1.0 + 11.1.1 2.18.2 2.0.16 5.11.3 From 3c06b49403a1cf7d242d70d28bcb9ba92ee1e965 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 04:23:52 +0000 Subject: [PATCH 1031/1214] chore(deps): bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.11.1 to 3.11.2. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.11.1...maven-javadoc-plugin-3.11.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e79e0d1e..41b1a50b 100644 --- a/pom.xml +++ b/pom.xml @@ -201,7 +201,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.11.1 + 3.11.2 org.apache.maven.plugins From 93788406831f98ad28429c3b0b03afcfe6b30bc0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 9 Dec 2024 17:15:09 +0100 Subject: [PATCH 1032/1214] remove parallel() processing as per discussion in https://github.com/aws/serverless-java-container/pull/1089#discussion_r1861054196 This reverts commit 1785eb57c7d72f6c1b8468f2e3ad13ddb8298589. --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 6b5c9020..c169a1f0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -597,7 +597,7 @@ protected Map generateParameterMap(MultiValuedTreeMap getQueryParamValuesAsList(decodedQs, e.getKey(), false) From 75c309cb788b9a2119f6300e70e4863845efe7ec Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 12 Dec 2024 08:55:23 +0100 Subject: [PATCH 1033/1214] docs: add note for building sample on ARM (#1209) --- samples/springboot3/pet-store-native/Dockerfile | 3 ++- samples/springboot3/pet-store-native/README.md | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index 30b77503..4fb614e3 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -8,7 +8,8 @@ RUN yum -y update \ # Graal VM ENV GRAAL_VERSION 21.0.2 -ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-x64_bin.tar.gz +ENV ARCHITECTURE x64 +ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm ENV JAVA_HOME /usr/lib/graalvm diff --git a/samples/springboot3/pet-store-native/README.md b/samples/springboot3/pet-store-native/README.md index c890090f..571d5619 100644 --- a/samples/springboot3/pet-store-native/README.md +++ b/samples/springboot3/pet-store-native/README.md @@ -5,6 +5,10 @@ In this sample, you'll build a native GraalVM image for running web workloads in You first need to build the function, then you will deploy it to AWS Lambda. +Please note that the sample is for `x86` architectures. In case you want to build and run it on ARM, e.g. Apple Mac M1, M2, ... +you must change the according line in the `Dockerfile` to `ENV ARCHITECTURE aarch64`. +In addition, uncomment the `arm64` Architectures section in `template.yml`. + ### Step 1 - Build the native image Before starting the build, you must clone or download the code in **pet-store-native**. From e16206258d8842b8f2430ac00c522b68b32e037a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 04:56:19 +0000 Subject: [PATCH 1034/1214] chore(deps): bump the log4j group across 2 directories with 3 updates Bumps the log4j group with 3 updates in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: org.apache.logging.log4j:log4j-core, org.apache.logging.log4j:log4j-api and org.apache.logging.log4j:log4j-slf4j-impl. Bumps the log4j group with 3 updates in the /samples/spring/pet-store directory: org.apache.logging.log4j:log4j-core, org.apache.logging.log4j:log4j-api and org.apache.logging.log4j:log4j-slf4j-impl. Updates `org.apache.logging.log4j:log4j-core` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-api` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-core` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-api` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.24.2 to 2.24.3 --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-slf4j-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-slf4j-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 6 +++--- samples/spring/pet-store/build.gradle | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 9c572b8f..4b4df05e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.2.0', 'org.springframework:spring-context:6.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.2', - 'org.apache.logging.log4j:log4j-api:2.24.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', + 'org.apache.logging.log4j:log4j-core:2.24.3', + 'org.apache.logging.log4j:log4j-api:2.24.3', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', 'com.fasterxml.jackson.core:jackson-databind:2.18.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 55876e26..e983e49b 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -10,9 +10,9 @@ dependencies { 'org.springframework:spring-webmvc:6.2.0', 'org.springframework:spring-context:6.2.0', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', - 'org.apache.logging.log4j:log4j-core:2.24.2', - 'org.apache.logging.log4j:log4j-api:2.24.2', - 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.2', + 'org.apache.logging.log4j:log4j-core:2.24.3', + 'org.apache.logging.log4j:log4j-api:2.24.3', + 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', 'com.fasterxml.jackson.core:jackson-databind:2.18.2', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) From 9ee726ace123f063769cc881c5a084582d4ab0ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 04:57:07 +0000 Subject: [PATCH 1035/1214] chore(deps): bump the log4j group across 1 directory with 3 updates Bumps the log4j group with 3 updates in the /samples/spring/pet-store directory: org.apache.logging.log4j:log4j-core, org.apache.logging.log4j:log4j-api and org.apache.logging.log4j:log4j-slf4j-impl. Updates `org.apache.logging.log4j:log4j-core` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-api` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-api` from 2.24.2 to 2.24.3 Updates `org.apache.logging.log4j:log4j-slf4j-impl` from 2.24.2 to 2.24.3 --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-slf4j-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j - dependency-name: org.apache.logging.log4j:log4j-slf4j-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: log4j ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 12a35b31..409db0cc 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -25,7 +25,7 @@ 6.2.0 - 2.24.2 + 2.24.3 17 17 From 74d6c5b45f0bb426afcdab21d84142025eb69182 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 04:57:25 +0000 Subject: [PATCH 1036/1214] chore(deps): bump org.hibernate.validator:hibernate-validator Bumps [org.hibernate.validator:hibernate-validator](https://github.com/hibernate/hibernate-validator) from 8.0.1.Final to 8.0.2.Final. - [Changelog](https://github.com/hibernate/hibernate-validator/blob/8.0.2.Final/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-validator/compare/8.0.1.Final...8.0.2.Final) --- updated-dependencies: - dependency-name: org.hibernate.validator:hibernate-validator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ab9491d7..26c2f3d9 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -75,7 +75,7 @@ org.hibernate.validator hibernate-validator - 8.0.1.Final + 8.0.2.Final test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 49fa7c70..0b29ccd2 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -160,7 +160,7 @@ org.hibernate.validator hibernate-validator - 8.0.1.Final + 8.0.2.Final test From 75fc1853a5b71017381584681a52df468d2afb4e Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 18 Dec 2024 15:02:39 +0100 Subject: [PATCH 1037/1214] fix: not need to override Spring Cloud version --- samples/springboot3/pet-store-native/pom.xml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 4eec02b6..2a0f1af4 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -16,7 +16,6 @@ Sample of AWS with Spring Native 17 - 2023.0.2 @@ -52,18 +51,7 @@ test - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - + native From 53a747d9743d0f4b69f06eb32e1ad3bdcc002342 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Thu, 19 Dec 2024 15:35:55 +0100 Subject: [PATCH 1038/1214] chore(deps): Update Spring dependencies (framework to 6.2.1, security to 6.4.2, boot to 3.4.1) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f119dc71..07d60f84 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.4.1 + 6.4.2 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ab9491d7..5211db83 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.2.0 - 6.4.1 + 6.2.1 + 6.4.2 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 49fa7c70..57ece9fd 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.2.0-SNAPSHOT - 6.2.0 - 3.4.0 - 6.4.1 + 6.2.1 + 3.4.1 + 6.4.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 4b4df05e..3a931de2 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.0', - 'org.springframework:spring-context:6.2.0', + 'org.springframework:spring-webmvc:6.2.1', + 'org.springframework:spring-context:6.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 42ccf9d4..173971be 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.2.0 + 6.2.1 5.11.3 2.24.2 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index be57490c..0ca76c76 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.4.0', + 'org.springframework.boot:spring-boot-starter-web:3.4.1', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 3489ad86..bdcfecb4 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index e983e49b..58bb8011 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.0', - 'org.springframework:spring-context:6.2.0', + 'org.springframework:spring-webmvc:6.2.1', + 'org.springframework:spring-context:6.2.1', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 409db0cc..1ded708f 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.2.0 + 6.2.1 2.24.3 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 7bcd50e4..f2d61db6 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.0') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.1') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 70fb3820..1d15765f 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 070314fd..c798d8fc 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 2a0f1af4..dc3ba9d7 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 7bcd50e4..f2d61db6 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.0') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.1') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 32b92a5f..89f58539 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.0 + 3.4.1 From bd0ae08aa7b43f67a6869d9058fa8659c9ca8db3 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 20 Dec 2024 11:22:28 +0100 Subject: [PATCH 1039/1214] fix: content type for v1 payload should be retrieved from multi value headers (#1193) --- .../serverless/proxy/spring/AwsSpringHttpProcessingUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 01074f86..2f547a32 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -126,7 +126,7 @@ private static HttpServletRequest generateRequest1(String request, Context lambd } populateContentAndContentType( v1Request.getBody(), - v1Request.getHeaders().get(HttpHeaders.CONTENT_TYPE), + v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE), v1Request.isBase64Encoded(), httpRequest ); From ecfd942ed57c5fdce69b4049f0ef6b8ac6493aa0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 23 Dec 2024 09:55:05 +0100 Subject: [PATCH 1040/1214] chore(deps): update JUnit version to 5.11.4 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 5d2a3a40..c4f8d7e5 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") - testImplementation(platform("org.junit:junit-bom:5.11.3")) + testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 176ef8a4..a0c2b062 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.9 2.18.2 - 5.11.3 + 5.11.4 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3a931de2..0969e8c6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") - testImplementation(platform("org.junit:junit-bom:5.11.3")) + testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 173971be..13116df0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.2.1 - 5.11.3 + 5.11.4 2.24.2 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 0ca76c76..cdca16bc 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") - testImplementation(platform("org.junit:junit-bom:5.11.3")) + testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index bdcfecb4..8bea6e66 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.11.3 + 5.11.4 diff --git a/pom.xml b/pom.xml index 6d053b3d..ecfd9814 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 11.1.1 2.18.2 2.0.16 - 5.11.3 + 5.11.4 5.14.2 1.3 UTF-8 From 8edd50c80191655eec55cb32ee5fe837ffe05f4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 05:14:56 +0000 Subject: [PATCH 1041/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.14.2 to 5.15.2 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.14.2 to 5.15.2. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.14.2...v5.15.2) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ecfd9814..0458270d 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.18.2 2.0.16 5.11.4 - 5.14.2 + 5.15.2 1.3 UTF-8 From 7c7e81b1da25375d081f2d2d3534cd8dc1a962b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 07:54:39 +0000 Subject: [PATCH 1042/1214] chore(deps): bump commons-codec:commons-codec from 1.17.1 to 1.17.2 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.17.1 to 1.17.2. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.17.1...rel/commons-codec-1.17.2) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index fdb4cf24..16699e91 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -64,7 +64,7 @@ commons-codec commons-codec - 1.17.1 + 1.17.2 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 5fa18323..7749e53d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -53,7 +53,7 @@ commons-codec commons-codec - 1.17.1 + 1.17.2 test From 159a96444666a5780c7babd2c62bcea0fa5fa050 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 8 Jan 2025 08:28:10 +0000 Subject: [PATCH 1043/1214] chore: release - prepare release aws-serverless-java-container-2.1.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 07d60f84..7c604bd2 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 16699e91..c4ce0dc5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7749e53d..410061c5 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 61fdc896..f86e0612 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.2.0-SNAPSHOT + 2.1.1 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.1 6.2.1 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.1 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 412459c4..c6e3ae9c 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.2.0-SNAPSHOT + 2.1.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 8b95c533..e896d226 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.2.0-SNAPSHOT + 2.1.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.1 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 89469c2e..fa148537 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.1 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.2.0-SNAPSHOT + 2.1.1 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.1 diff --git a/pom.xml b/pom.xml index 0458270d..4f29c41f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.2.0-SNAPSHOT + 2.1.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.1 From 02fb39371fa02d0442c94c2627c90ef8f12cdfc2 Mon Sep 17 00:00:00 2001 From: deki Date: Wed, 8 Jan 2025 08:28:12 +0000 Subject: [PATCH 1044/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 7c604bd2..07d60f84 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index c4ce0dc5..16699e91 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 410061c5..7749e53d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index f86e0612..61fdc896 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.1 + 2.2.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.1 + 2.2.0-SNAPSHOT 6.2.1 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.1 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c6e3ae9c..412459c4 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.1 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index e896d226..8b95c533 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.1 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.1 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index fa148537..89469c2e 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.1 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.1 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.1 + HEAD diff --git a/pom.xml b/pom.xml index 4f29c41f..0458270d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.1 + 2.2.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.1 + HEAD From 7785e356b2fb69b49fcf333735c65fb2f33757a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 04:22:31 +0000 Subject: [PATCH 1045/1214] chore(deps): bump org.owasp:dependency-check-maven from 11.1.1 to 12.0.0 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 11.1.1 to 12.0.0. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v11.1.1...v12.0.0) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0458270d..d054ca5d 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 11.1.1 + 12.0.0 2.18.2 2.0.16 5.11.4 From 00de575129935ff5cb593fea83687ed213157abd Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Mon, 13 Jan 2025 19:31:53 +0100 Subject: [PATCH 1046/1214] Updated Spring Cloud Function version --- samples/springboot3/alt-pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 1d15765f..f2c7359c 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - [2.0.0-SNAPSHOT,),[2.0.0-M1,) + [2.2.0-SNAPSHOT,),[2.2.0-M1,) From 9c7ef12dfe7a28430c66b2bb368ee3c782269bd6 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 14 Jan 2025 07:30:13 +0200 Subject: [PATCH 1047/1214] chore(deps): Update Jersey version to 3.1.10 (closes #1233, #1234) --- aws-serverless-java-container-jersey/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/jersey/pet-store/build.gradle | 4 ++-- samples/jersey/pet-store/pom.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 16699e91..c14b1e1e 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -16,7 +16,7 @@ - 3.1.9 + 3.1.10 diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index c4f8d7e5..29ef10b0 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.18.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.9") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.10") { exclude group: 'javax.inject', module: "javax.inject" } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index a0c2b062..2d9b4536 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -15,7 +15,7 @@ 1.8 1.8 - 3.1.9 + 3.1.10 2.18.2 5.11.4 diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 4c54ac14..ca4af2f8 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -11,13 +11,13 @@ dependencies { 'com.fasterxml.jackson.core:jackson-databind:2.18.2', ) - implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.9") { + implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { exclude group: 'com.fasterxml.jackson.core', module: "jackson-annotations" exclude group: 'com.fasterxml.jackson.core', module: "jackson-databind" exclude group: 'com.fasterxml.jackson.core', module: "jackson-core" } - implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.9") { + implementation("org.glassfish.jersey.inject:jersey-hk2:3.1.10") { exclude group: 'javax.inject', module: "javax.inject" } } diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index c7bbe2f0..2482864f 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -26,7 +26,7 @@ 1.8 1.8 - 3.1.9 + 3.1.10 2.18.2 From 6fa29cdf8b1ec9c98af3a454f0a5c388027e38f5 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 14 Jan 2025 08:20:30 +0100 Subject: [PATCH 1048/1214] Updated Spring Cloud Function version --- aws-serverless-java-container-springboot3/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 61fdc896..34a628c1 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -25,7 +25,7 @@ org.springframework.cloud spring-cloud-function-serverless-web - 4.1.4 + 4.1.5 com.amazonaws.serverless diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index f2c7359c..cf9a16f6 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -37,7 +37,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - [2.2.0-SNAPSHOT,),[2.2.0-M1,) + [2.2.0-SNAPSHOT,),[2.1.1,) From 28232b45fb8a887e2c0ebdcc5329405f7716a705 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 04:38:29 +0000 Subject: [PATCH 1049/1214] chore(deps): bump org.owasp:dependency-check-maven from 12.0.0 to 12.0.1 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 12.0.0 to 12.0.1. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v12.0.0...v12.0.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d054ca5d..36aa0ebb 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.0.0 + 12.0.1 2.18.2 2.0.16 5.11.4 From 2e27797065a10ea6003d338a0d4ef644c9916a7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 04:38:36 +0000 Subject: [PATCH 1050/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.8.6 to 4.9.0. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.8.6...4.9.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d054ca5d..ea89e894 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.8.6 + 4.9.0 provided From 5f02ec136b985ab44055aed9a3408b817d0537d9 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 24 Jan 2025 14:41:59 +0100 Subject: [PATCH 1051/1214] chore(deps): Update Spring dependencies (framework to 6.2.2, boot to 3.4.2) --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 7749e53d..c11dd3ee 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 6.2.1 + 6.2.2 6.4.2 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 34a628c1..222126ad 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,8 +15,8 @@ 2.2.0-SNAPSHOT - 6.2.1 - 3.4.1 + 6.2.2 + 3.4.2 6.4.2 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 0969e8c6..da8ea168 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.1', - 'org.springframework:spring-context:6.2.1', + 'org.springframework:spring-webmvc:6.2.2', + 'org.springframework:spring-context:6.2.2', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 13116df0..0320ee04 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.2.1 + 6.2.2 5.11.4 2.24.2 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index cdca16bc..e8e334e2 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.4.1', + 'org.springframework.boot:spring-boot-starter-web:3.4.2', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 8bea6e66..d0a27428 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 58bb8011..44f81a73 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.1', - 'org.springframework:spring-context:6.2.1', + 'org.springframework:spring-webmvc:6.2.2', + 'org.springframework:spring-context:6.2.2', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 1ded708f..85dd93d3 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.2.1 + 6.2.2 2.24.3 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index f2d61db6..f8013cbc 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index cf9a16f6..e11af042 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index c798d8fc..e4c472f0 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index dc3ba9d7..d8ee426a 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index f2d61db6..f8013cbc 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.1') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.2') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 89f58539..3a1571b3 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.1 + 3.4.2 From 817664191be456f53fd92e8c0a4e4b481ecae3ac Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 29 Jan 2025 14:18:04 +0100 Subject: [PATCH 1052/1214] fix: Request Parameters not picked up for v1 payload format with multivalue headers enabled (#1256) --- .../spring/AwsSpringHttpProcessingUtils.java | 12 +++-- .../AwsSpringHttpProcessingUtilsTests.java | 47 +++++++++++++++---- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 2f547a32..abcc56b2 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -5,10 +5,12 @@ import java.nio.charset.StandardCharsets; import java.nio.charset.UnsupportedCharsetException; import java.util.Base64; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; import com.amazonaws.serverless.proxy.internal.HttpUtils; import org.apache.commons.io.Charsets; @@ -118,7 +120,11 @@ private static HttpServletRequest generateRequest1(String request, Context lambd ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v1Request.getHttpMethod(), v1Request.getPath()); - populateQueryStringparameters(v1Request.getQueryStringParameters(), httpRequest); + populateQueryStringParameters(v1Request.getQueryStringParameters(), httpRequest); + if (v1Request.getMultiValueQueryStringParameters() != null) { + MultiValueMapAdapter queryStringParameters = new MultiValueMapAdapter(v1Request.getMultiValueQueryStringParameters()); + queryStringParameters.forEach((k, v) -> httpRequest.setParameter(k, StringUtils.collectionToCommaDelimitedString(v))); + } if (v1Request.getMultiValueHeaders() != null) { MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); @@ -152,7 +158,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); - populateQueryStringparameters(v2Request.getQueryStringParameters(), httpRequest); + populateQueryStringParameters(v2Request.getQueryStringParameters(), httpRequest); v2Request.getHeaders().forEach(httpRequest::setHeader); @@ -172,7 +178,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd return httpRequest; } - private static void populateQueryStringparameters(Map requestParameters, ServerlessHttpServletRequest httpRequest) { + private static void populateQueryStringParameters(Map requestParameters, ServerlessHttpServletRequest httpRequest) { if (!CollectionUtils.isEmpty(requestParameters)) { for (Entry entry : requestParameters.entrySet()) { httpRequest.setParameter(entry.getKey(), entry.getValue()); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index a04361e7..e3c91acf 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -79,15 +79,15 @@ public class AwsSpringHttpProcessingUtilsTests { + " },\n" + " \"queryStringParameters\": {\n" + " \"abc\": \"xyz\",\n" - + " \"foo\": \"baz\"\n" + + " \"parameter1\": \"value2\"\n" + " },\n" + " \"multiValueQueryStringParameters\": {\n" + " \"abc\": [\n" + " \"xyz\"\n" + " ],\n" - + " \"foo\": [\n" - + " \"bar\",\n" - + " \"baz\"\n" + + " \"parameter1\": [\n" + + " \"value1\",\n" + + " \"value2\"\n" + " ]\n" + " },\n" + " \"requestContext\": {\n" @@ -184,10 +184,35 @@ public class AwsSpringHttpProcessingUtilsTests { " }\n" + "}"; + private static final String ALB_EVENT = "{\n" + + " \"requestContext\": {\n" + + " \"elb\": {\n" + + " \"targetGroupArn\": \"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09\"\n" + + " }\n" + + " },\n" + + " \"httpMethod\": \"POST\",\n" + + " \"path\": \"/async\",\n" + + " \"multiValueQueryStringParameters\": { \"parameter1\": [\"value1\", \"value2\"]},\n" + + " \"multiValueHeaders\": {\n" + + " \"accept\": [\"text/html,application/xhtml+xml\"],\n" + + " \"accept-language\": [\"en-US,en;q=0.8\"],\n" + + " \"content-type\": [\"text/plain\"],\n" + + " \"cookie\": [\"cookies\"],\n" + + " \"host\": [\"lambda-846800462-us-east-2.elb.amazonaws.com\"],\n" + + " \"User-Agent\": [\"curl/7.79.1\"],\n" + + " \"x-amzn-trace-id\": [\"Root=1-5bdb40ca-556d8b0c50dc66f0511bf520\"],\n" + + " \"x-forwarded-for\": [\"72.21.198.66\"],\n" + + " \"x-forwarded-port\": [\"443\"],\n" + + " \"x-forwarded-proto\": [\"https\"]\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"body\": \"request_body\"\n" + + "}"; + private final ObjectMapper mapper = new ObjectMapper(); public static Collection data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); + return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT}); } @MethodSource("data") @@ -197,10 +222,17 @@ public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent ServerlessServletContext servletContext = new ServerlessServletContext(); HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); // spot check some headers + assertRequest(request); + } + + private static void assertRequest(HttpServletRequest request) { assertEquals("curl/7.79.1", request.getHeader("User-Agent")); assertEquals("443", request.getHeader("X-Forwarded-Port")); assertEquals("POST", request.getMethod()); assertEquals("/async", request.getRequestURI()); + assertEquals("value1,value2", request.getParameter("parameter1")); + // to be fixed: assertArrayEquals(new String[]{"value1","value2"}, request.getParameterValues("parameter1")); + } @MethodSource("data") @@ -209,10 +241,7 @@ public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); // spot check some headers - assertEquals("curl/7.79.1", request.getHeader("User-Agent")); - assertEquals("443", request.getHeader("X-Forwarded-Port")); - assertEquals("POST", request.getMethod()); - assertEquals("/async", request.getRequestURI()); + assertRequest(request); } @MethodSource("data") From 28fd1c17fc83a074a3a990cbd993de3abcb178ab Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Wed, 29 Jan 2025 14:19:35 +0100 Subject: [PATCH 1053/1214] fix: Request Parameters not picked up for v1 payload format with multivalue headers enabled - removed unused imports (#1256) --- .../serverless/proxy/spring/AwsSpringHttpProcessingUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index abcc56b2..a585feb8 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -3,17 +3,13 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.charset.UnsupportedCharsetException; import java.util.Base64; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import java.util.function.BiConsumer; import com.amazonaws.serverless.proxy.internal.HttpUtils; -import org.apache.commons.io.Charsets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.function.serverless.web.ServerlessHttpServletRequest; From e7d00bcbc2652fc897844e0402b8311932c3e02e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 13:35:58 +0000 Subject: [PATCH 1054/1214] chore(deps): bump commons-codec:commons-codec from 1.17.2 to 1.18.0 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.17.2 to 1.18.0. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.17.2...rel/commons-codec-1.18.0) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-jersey/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index c14b1e1e..80e99330 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -64,7 +64,7 @@ commons-codec commons-codec - 1.17.2 + 1.18.0 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c11dd3ee..db20a7d4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -53,7 +53,7 @@ commons-codec commons-codec - 1.17.2 + 1.18.0 test From 855d31a962b57243b832447963f1aad3de9e8881 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 05:00:20 +0000 Subject: [PATCH 1055/1214] chore(deps): bump org.owasp:dependency-check-maven from 12.0.1 to 12.0.2 Bumps [org.owasp:dependency-check-maven](https://github.com/jeremylong/DependencyCheck) from 12.0.1 to 12.0.2. - [Release notes](https://github.com/jeremylong/DependencyCheck/releases) - [Changelog](https://github.com/jeremylong/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/jeremylong/DependencyCheck/compare/v12.0.1...v12.0.2) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 04760f00..346ba57e 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.0.1 + 12.0.2 2.18.2 2.0.16 5.11.4 From ae43d58535e8b01bb99cc9d5eca62643a9daf5ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2025 05:00:30 +0000 Subject: [PATCH 1056/1214] chore(deps-dev): bump jakarta.validation:jakarta.validation-api Bumps [jakarta.validation:jakarta.validation-api](https://github.com/jakartaee/validation) from 3.0.2 to 3.1.1. - [Release notes](https://github.com/jakartaee/validation/releases) - [Commits](https://github.com/jakartaee/validation/compare/3.0.2...3.1.1) --- updated-dependencies: - dependency-name: jakarta.validation:jakarta.validation-api dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 222126ad..00f356e4 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -173,7 +173,7 @@ jakarta.validation jakarta.validation-api - 3.0.2 + 3.1.1 test From 8e11c963627f054a895495205af8b56105ed90e0 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Feb 2025 06:32:32 +0100 Subject: [PATCH 1057/1214] chore(deps): update Apache HttpClient to 5.4.2 --- .github/dependabot.yml | 6 ++++++ .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 8 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d82be62d..acc835c6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -30,6 +30,9 @@ updates: maven-install-plugin: patterns: - "org.apache.maven.plugins:maven-install-plugin" + httpclient: + patterns: + - "org.apache.httpcomponents.client5:*" schedule: interval: "weekly" open-pull-requests-limit: 20 @@ -52,5 +55,8 @@ updates: jackson: patterns: - "com.fasterxml.jackson.*:*" + httpclient: + patterns: + - "org.apache.httpcomponents.client5:*" schedule: interval: "weekly" \ No newline at end of file diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 29ef10b0..7160d4a9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,7 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 2d9b4536..39db2f49 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -37,7 +37,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.4.2 test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index da8ea168..028d3a03 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,7 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 0320ee04..890221ff 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.4.2 test diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index e8e334e2..c6cb018e 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.1") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.11.4")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index d0a27428..be6b7b3f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -41,7 +41,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.4.2 test diff --git a/pom.xml b/pom.xml index 346ba57e..84296f74 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.4.2 test From 695dd06b8d0ff6d1686a2018a9c13ca524453bc8 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 4 Feb 2025 06:28:58 +0100 Subject: [PATCH 1058/1214] fix: Request Parameters not picked up for v1 payload format with multivalue headers enabled (#1256) --- .../spring/AwsSpringHttpProcessingUtils.java | 7 +++++-- .../AwsSpringHttpProcessingUtilsTests.java | 17 +++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index a585feb8..69e60334 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -119,7 +119,9 @@ private static HttpServletRequest generateRequest1(String request, Context lambd populateQueryStringParameters(v1Request.getQueryStringParameters(), httpRequest); if (v1Request.getMultiValueQueryStringParameters() != null) { MultiValueMapAdapter queryStringParameters = new MultiValueMapAdapter(v1Request.getMultiValueQueryStringParameters()); - queryStringParameters.forEach((k, v) -> httpRequest.setParameter(k, StringUtils.collectionToCommaDelimitedString(v))); + queryStringParameters.forEach((k, v) -> { + httpRequest.setParameter(k, v.toArray(new String[2])); + }); } if (v1Request.getMultiValueHeaders() != null) { @@ -155,7 +157,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); populateQueryStringParameters(v2Request.getQueryStringParameters(), httpRequest); - + v2Request.getHeaders().forEach(httpRequest::setHeader); populateContentAndContentType( @@ -177,6 +179,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd private static void populateQueryStringParameters(Map requestParameters, ServerlessHttpServletRequest httpRequest) { if (!CollectionUtils.isEmpty(requestParameters)) { for (Entry entry : requestParameters.entrySet()) { + // fix according to parseRawQueryString httpRequest.setParameter(entry.getKey(), entry.getValue()); } } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index e3c91acf..241e8680 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -1,12 +1,12 @@ package com.amazonaws.serverless.proxy.spring; -import static org.junit.jupiter.api.Assertions.assertEquals; - import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collection; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.boot.SpringApplication; @@ -30,6 +30,8 @@ import jakarta.servlet.http.HttpServletRequest; +import static org.junit.jupiter.api.Assertions.*; + public class AwsSpringHttpProcessingUtilsTests { private static String API_GATEWAY_EVENT = "{\n" @@ -221,7 +223,6 @@ public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonEvent.getBytes(StandardCharsets.UTF_8)); ServerlessServletContext servletContext = new ServerlessServletContext(); HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); - // spot check some headers assertRequest(request); } @@ -230,9 +231,13 @@ private static void assertRequest(HttpServletRequest request) { assertEquals("443", request.getHeader("X-Forwarded-Port")); assertEquals("POST", request.getMethod()); assertEquals("/async", request.getRequestURI()); - assertEquals("value1,value2", request.getParameter("parameter1")); - // to be fixed: assertArrayEquals(new String[]{"value1","value2"}, request.getParameterValues("parameter1")); - + assertNotNull(request.getServletContext()); + // parameter handling for 2.0 requests is currently not spec compliant and to be fixed in future version + // see also GitHub issue + if (!(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY) instanceof HttpApiV2ProxyRequest)) { + assertEquals("value1", request.getParameter("parameter1")); + assertArrayEquals(new String[]{"value1", "value2"}, request.getParameterValues("parameter1")); + } } @MethodSource("data") From f37fa4e84044f787957546e2d028e941c33fd7fa Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 4 Feb 2025 06:52:14 +0100 Subject: [PATCH 1059/1214] fix: Request Parameters not picked up for v1 payload format with multivalue headers enabled (#1256) --- .../proxy/spring/AwsSpringHttpProcessingUtils.java | 2 +- .../proxy/spring/AwsSpringHttpProcessingUtilsTests.java | 2 +- .../SpringDelegatingLambdaContainerHandlerTests.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 69e60334..09649b31 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -120,7 +120,7 @@ private static HttpServletRequest generateRequest1(String request, Context lambd if (v1Request.getMultiValueQueryStringParameters() != null) { MultiValueMapAdapter queryStringParameters = new MultiValueMapAdapter(v1Request.getMultiValueQueryStringParameters()); queryStringParameters.forEach((k, v) -> { - httpRequest.setParameter(k, v.toArray(new String[2])); + httpRequest.setParameter(k, v.toArray(new String[0])); }); } diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 241e8680..fa0e92e9 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -233,7 +233,7 @@ private static void assertRequest(HttpServletRequest request) { assertEquals("/async", request.getRequestURI()); assertNotNull(request.getServletContext()); // parameter handling for 2.0 requests is currently not spec compliant and to be fixed in future version - // see also GitHub issue + // see also GitHub issue https://github.com/aws/serverless-java-container/issues/1278 if (!(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY) instanceof HttpApiV2ProxyRequest)) { assertEquals("value1", request.getParameter("parameter1")); assertArrayEquals(new String[]{"value1", "value2"}, request.getParameterValues("parameter1")); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index 61957fe2..02ef21d9 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -215,10 +215,10 @@ public void validateComplesrequest(String jsonEvent) throws Exception { handler.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); assertEquals(200, result.get("statusCode")); - String[] respponseBody = ((String) result.get("body")).split("/"); - assertEquals("male", respponseBody[0]); - assertEquals("24", respponseBody[1]); - assertEquals("Ricky", respponseBody[2]); + String[] responseBody = ((String) result.get("body")).split("/"); + assertEquals("male", responseBody[0]); + assertEquals("24", responseBody[1]); + assertEquals("Ricky", responseBody[2]); } @MethodSource("data") From aa4b9725e0c45084e4f3338c00d57e1621efcdef Mon Sep 17 00:00:00 2001 From: deki Date: Tue, 4 Feb 2025 06:20:15 +0000 Subject: [PATCH 1060/1214] chore: release - prepare release aws-serverless-java-container-2.1.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 07d60f84..082b097d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 80e99330..622dd9b5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index db20a7d4..eb235e8d 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 222126ad..1b89f5f6 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.2.0-SNAPSHOT + 2.1.2 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.2 6.2.2 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.2 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 412459c4..35ad5657 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.2.0-SNAPSHOT + 2.1.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 8b95c533..06cd2e68 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.2.0-SNAPSHOT + 2.1.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.2 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 89469c2e..9b52b196 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.2 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.2.0-SNAPSHOT + 2.1.2 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.2 diff --git a/pom.xml b/pom.xml index 84296f74..167e2419 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.2.0-SNAPSHOT + 2.1.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.2 From c1e60ebe87f9fa057416e874c9d7aa286109864a Mon Sep 17 00:00:00 2001 From: deki Date: Tue, 4 Feb 2025 06:20:17 +0000 Subject: [PATCH 1061/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 082b097d..07d60f84 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 622dd9b5..80e99330 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eb235e8d..db20a7d4 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 1b89f5f6..222126ad 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.2 + 2.2.0-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.2 + 2.2.0-SNAPSHOT 6.2.2 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.2 + 2.2.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 35ad5657..412459c4 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.2 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 06cd2e68..8b95c533 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.2 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.2 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 9b52b196..89469c2e 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.2 + 2.2.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.2 + 2.2.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.2 + HEAD diff --git a/pom.xml b/pom.xml index 167e2419..84296f74 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.2 + 2.2.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.2 + HEAD From 0a53702d7f2424af902d31ff2cca615661e6139c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:53:19 +0000 Subject: [PATCH 1062/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 469f174ec61dd6ca30c9f4fda0a98ff75eeaf9b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:53:34 +0000 Subject: [PATCH 1063/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 69ebbcfe99c587978b5841c831799ea010416e87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:53:44 +0000 Subject: [PATCH 1064/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 37f196f45116edd115160f69bb39378a56f1f546 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:53:50 +0000 Subject: [PATCH 1065/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From ca4c143fe2092fb73695d13596e2add70040ca32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:53:56 +0000 Subject: [PATCH 1066/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 8591e21c20ca55f341b3af902eb995690f3c1d95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:54:16 +0000 Subject: [PATCH 1067/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 7ecbd74add0dde816b84e754862142dcc5e59c0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:54:21 +0000 Subject: [PATCH 1068/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From eb73394e79e51bdbb0bfc2ffca176a02e362f369 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:54:34 +0000 Subject: [PATCH 1069/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.0 to 4.9.1. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.0...4.9.1) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84296f74..f1a94ebd 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.0 + 4.9.1 provided From 4b5a6b43845429b391d2cb3fcb43c3802943c717 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Feb 2025 08:33:25 +0000 Subject: [PATCH 1070/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.8.6.6 to 4.9.1.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.6.6...spotbugs-maven-plugin-4.9.1.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1a94ebd..f9e17538 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.8.6.6 + 4.9.1.0 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index f8013cbc..c5a66726 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.2') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.3') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 3a1571b3..05351f0a 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.2 + 3.4.3 From f4e54098b11402b8dde384873a6b5a237e93320e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 04:53:50 +0000 Subject: [PATCH 1075/1214] chore(deps): bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..8f07c4f6 100644 --- a/pom.xml +++ b/pom.xml @@ -190,7 +190,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 1.8 1.8 From 725e470e9ce72d7276cc7aee17780c91405775bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 04:54:34 +0000 Subject: [PATCH 1076/1214] chore(deps): bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..8f07c4f6 100644 --- a/pom.xml +++ b/pom.xml @@ -190,7 +190,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 1.8 1.8 From d07d1ac5bf645c8503893bbcaed3830bd4630cf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 04:54:52 +0000 Subject: [PATCH 1077/1214] chore(deps): bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..8f07c4f6 100644 --- a/pom.xml +++ b/pom.xml @@ -190,7 +190,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 1.8 1.8 From 04b536ae6a0d59dc1ff44ad138e6576935f0fdbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 04:54:59 +0000 Subject: [PATCH 1078/1214] chore(deps): bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.13.0 to 3.14.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.13.0...maven-compiler-plugin-3.14.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..8f07c4f6 100644 --- a/pom.xml +++ b/pom.xml @@ -190,7 +190,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.13.0 + 3.14.0 1.8 1.8 From 09d80072f3ba2f2636e344b57646ef4bdaa9bc66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:35:55 +0000 Subject: [PATCH 1079/1214] chore(deps): bump the maven-install-plugin group across 13 directories with 1 update Bumps the maven-install-plugin group with 1 update in the / directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-core directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-jersey directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-spring directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-java-container-springboot3 directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-jersey-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-spring-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /aws-serverless-springboot3-archetype directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/jersey/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/spring/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/alt-pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/graphql-pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Bumps the maven-install-plugin group with 1 update in the /samples/springboot3/pet-store directory: [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin). Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.3 to 3.1.4 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.3...maven-install-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: maven-install-plugin ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..164f6315 100644 --- a/pom.xml +++ b/pom.xml @@ -231,7 +231,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 2482864f..6a66d80a 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -123,7 +123,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 true diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 29a00117..68c577bc 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -144,7 +144,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 true diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 12b7c0da..0885925c 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -94,7 +94,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 true diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index c3076388..ff0c5c0d 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -108,7 +108,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 true diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 05351f0a..4bc2a498 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -100,7 +100,7 @@ org.apache.maven.plugins maven-install-plugin - 3.1.3 + 3.1.4 true From 6b1ff33c396cec82c86cde35a8d65e2e6a685bf3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:36:15 +0000 Subject: [PATCH 1080/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 1c64bb190696017a2262c554df7397fef8ffab4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:36:25 +0000 Subject: [PATCH 1081/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 31751541c1857cc3e80a94c5232cdbc7f57e4af3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:36:29 +0000 Subject: [PATCH 1082/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 9c88ffd6726e925316dbbb430d9e1fea201526c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:36:42 +0000 Subject: [PATCH 1083/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From a07936e9e22f6e9b4e03efa79c4d96a7a4d25df2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:36:58 +0000 Subject: [PATCH 1084/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 5ee6e08ec18cb4ef12be09f20bd46fb8604abd39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:37:12 +0000 Subject: [PATCH 1085/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 2e4fd5d01c1aa6d20dabec66740da83fb1412d14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:37:20 +0000 Subject: [PATCH 1086/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 3ff85c8c964b5483c51a2c51cf11f0fef1cee1c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Mar 2025 04:37:27 +0000 Subject: [PATCH 1087/1214] chore(deps): bump org.apache.maven.plugins:maven-deploy-plugin Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.1.3 to 3.1.4. - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.3...maven-deploy-plugin-3.1.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1ccf270e..69ddcb9a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ org.apache.maven.plugins maven-deploy-plugin - 3.1.3 + 3.1.4 org.apache.maven.plugins From 512be81b8708b7a2cfa977c98ad0f57477d2b0a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 04:33:30 +0000 Subject: [PATCH 1088/1214] chore(deps): bump the jackson group across 5 directories with 2 updates Bumps the jackson group with 2 updates in the / directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) and [com.fasterxml.jackson.module:jackson-module-afterburner](https://github.com/FasterXML/jackson-modules-base). Bumps the jackson group with 2 updates in the /aws-serverless-java-container-core directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) and [com.fasterxml.jackson.module:jackson-module-afterburner](https://github.com/FasterXML/jackson-modules-base). Bumps the jackson group with 1 update in the /aws-serverless-java-container-jersey directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /aws-serverless-java-container-spring directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/jersey/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson-modules-base/commits/jackson-modules-base-2.18.3) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson-modules-base/commits/jackson-modules-base-2.18.3) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson-modules-base/commits/jackson-modules-base-2.18.3) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson-modules-base/commits/jackson-modules-base-2.18.3) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:development update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:development update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 164f6315..60596f90 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 12.1.0 - 2.18.2 + 2.18.3 2.0.16 5.11.4 5.15.2 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index 6a66d80a..dc29c9f6 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.10 - 2.18.2 + 2.18.3 From 7dbf260c5ea0dcade9f5f7d20bc2bc22b3466fb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 04:38:46 +0000 Subject: [PATCH 1089/1214] chore(deps): bump the jackson group across 4 directories with 1 update Bumps the jackson group with 1 update in the /aws-serverless-jersey-archetype/src/main/resources/archetype-resources directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/jersey/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/spring/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.2 to 2.18.3 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch dependency-group: jackson ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/spring/pet-store/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 7160d4a9..06aad315 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.3', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3cbd0d91..51d119ed 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', - 'com.fasterxml.jackson.core:jackson-databind:2.18.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.3', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index ca4af2f8..0829175e 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.3', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 00ff6ceb..9d46494f 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', - 'com.fasterxml.jackson.core:jackson-databind:2.18.2', + 'com.fasterxml.jackson.core:jackson-databind:2.18.3', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } From 21c6eda9105e30759cc2da3f485d7ce55bc1450b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:42:29 +0000 Subject: [PATCH 1090/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From 3cf3ab22df103037678193ad2387b5234c16f900 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:42:44 +0000 Subject: [PATCH 1091/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From f1003335eeedec78e1dc782e7e05ea8aeb2adf9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:42:54 +0000 Subject: [PATCH 1092/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From 81e08e6fa2038db92397eff86371c727091b9a3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:43:10 +0000 Subject: [PATCH 1093/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From 1d33b696ef8c636b2b8d50beef15898780ff36f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:43:25 +0000 Subject: [PATCH 1094/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From e1a36ad41ed9776ef7780b40e686189c1902741a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:43:45 +0000 Subject: [PATCH 1095/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From aba53c715df2ce67bda320563121e51b39bea033 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:43:56 +0000 Subject: [PATCH 1096/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From a5df3646c2dcf06280599c4b8daadc89c3606774 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:44:06 +0000 Subject: [PATCH 1097/1214] chore(deps): bump com.github.spotbugs:spotbugs-annotations Bumps [com.github.spotbugs:spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.9.1 to 4.9.3. - [Release notes](https://github.com/spotbugs/spotbugs/releases) - [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/spotbugs/spotbugs/compare/4.9.1...4.9.3) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-annotations dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 164f6315..c555a4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -140,7 +140,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.1 + 4.9.3 provided From adc07e7b9e0bfa9d02fb6e474a08454f91306e8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 04:45:20 +0000 Subject: [PATCH 1098/1214] chore(deps): bump the spring group across 2 directories with 2 updates Bumps the spring group with 2 updates in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-context](https://github.com/spring-projects/spring-framework). Bumps the spring group with 2 updates in the /samples/spring/pet-store directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-context](https://github.com/spring-projects/spring-framework). Updates `org.springframework:spring-webmvc` from 6.2.3 to 6.2.4 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.3...v6.2.4) Updates `org.springframework:spring-context` from 6.2.3 to 6.2.4 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.3...v6.2.4) Updates `org.springframework:spring-webmvc` from 6.2.3 to 6.2.4 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.3...v6.2.4) Updates `org.springframework:spring-context` from 6.2.3 to 6.2.4 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.3...v6.2.4) --- updated-dependencies: - dependency-name: org.springframework:spring-webmvc dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- samples/spring/pet-store/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3cbd0d91..81ce9186 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.3', - 'org.springframework:spring-context:6.2.3', + 'org.springframework:spring-webmvc:6.2.4', + 'org.springframework:spring-context:6.2.4', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 00ff6ceb..85e3b481 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.3', - 'org.springframework:spring-context:6.2.3', + 'org.springframework:spring-webmvc:6.2.4', + 'org.springframework:spring-context:6.2.4', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', From 41042e6d3cbf418bde2e1d29ebced43abe0d7155 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 05:09:06 +0000 Subject: [PATCH 1099/1214] chore(deps): bump com.github.spotbugs:spotbugs-maven-plugin Bumps [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.9.1.0 to 4.9.3.0. - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.9.1.0...spotbugs-maven-plugin-4.9.3.0) --- updated-dependencies: - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a0702733..1162f312 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ com.github.spotbugs spotbugs-maven-plugin - 4.9.1.0 + 4.9.3.0 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index c5a66726..59352a11 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.3') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.4') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 4bc2a498..af519947 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.3 + 3.4.4 From 6db27586020f6172849bdfc4e709888fb4267241 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 4 Apr 2025 22:02:22 +0200 Subject: [PATCH 1102/1214] chore(deps): update JUnit version to 5.12.1 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 06aad315..fa79713d 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") - testImplementation(platform("org.junit:junit-bom:5.11.4")) + testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 39db2f49..83734ac9 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 3.1.10 2.18.2 - 5.11.4 + 5.12.1 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index c7538b7c..1ca8ce47 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") - testImplementation(platform("org.junit:junit-bom:5.11.4")) + testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 7f437e7e..f8edf92e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -17,7 +17,7 @@ 1.8 1.8 6.2.5 - 5.11.4 + 5.12.1 2.24.2 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 59422bdf..b176e97f 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") - testImplementation(platform("org.junit:junit-bom:5.11.4")) + testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 6f6cb087..8e2648a9 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -21,7 +21,7 @@ 17 - 5.11.4 + 5.12.1 diff --git a/pom.xml b/pom.xml index a0702733..1a886a4d 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 12.1.0 2.18.3 2.0.16 - 5.11.4 + 5.12.1 5.15.2 1.3 UTF-8 From 0bf339d451a7c98c1ada5dcb62681af95fa63731 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 4 Apr 2025 22:03:15 +0200 Subject: [PATCH 1103/1214] chore(deps): Update Jackson version to 2.18.3 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 83734ac9..dfa81318 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.10 - 2.18.2 + 2.18.3 5.12.1 From dded06df64490c465897eaec3ed8c5c5c3ca8517 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Fri, 4 Apr 2025 22:03:35 +0200 Subject: [PATCH 1104/1214] chore(deps): Update Spring dependencies (framework to 6.2.5, security to 6.4.4, boot to 3.4.4) --- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- samples/spring/pet-store/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1ca8ce47..e708c058 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.4', - 'org.springframework:spring-context:6.2.4', + 'org.springframework:spring-webmvc:6.2.5', + 'org.springframework:spring-context:6.2.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 992bf033..0c28ff2b 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.4', - 'org.springframework:spring-context:6.2.4', + 'org.springframework:spring-webmvc:6.2.5', + 'org.springframework:spring-context:6.2.5', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', From 39425e0e1e428d28fe0bfd3a7b7a63e874130fac Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sat, 5 Apr 2025 08:32:10 +0200 Subject: [PATCH 1105/1214] chore(deps): update JUnit version to 5.12.1 (fix Gradle build) --- .../src/main/resources/archetype-resources/build.gradle | 1 + .../src/main/resources/archetype-resources/build.gradle | 1 + .../src/main/resources/archetype-resources/build.gradle | 1 + 3 files changed, 3 insertions(+) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index fa79713d..56ccdbe3 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -25,6 +25,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } task buildZip(type: Zip) { diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index e708c058..3115e5a6 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -21,6 +21,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } task buildZip(type: Zip) { diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index b176e97f..c90674fd 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -17,6 +17,7 @@ dependencies { testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } task buildZip(type: Zip) { From 785384f008a03892545d37bc4b40f395a410a58e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Apr 2025 06:33:42 +0000 Subject: [PATCH 1106/1214] chore(deps): bump the slf4j group across 8 directories with 2 updates Bumps the slf4j group with 2 updates in the / directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-java-container-core directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-java-container-jersey directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-java-container-spring directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-java-container-springboot3 directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-jersey-archetype directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-spring-archetype directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Bumps the slf4j group with 2 updates in the /aws-serverless-springboot3-archetype directory: org.slf4j:slf4j-api and org.slf4j:slf4j-simple. Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-api` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 Updates `org.slf4j:slf4j-simple` from 2.0.16 to 2.0.17 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j - dependency-name: org.slf4j:slf4j-simple dependency-type: direct:development update-type: version-update:semver-patch dependency-group: slf4j ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e3a8ff15..ea67e10f 100644 --- a/pom.xml +++ b/pom.xml @@ -79,7 +79,7 @@ 0.7 12.1.0 2.18.3 - 2.0.16 + 2.0.17 5.12.1 5.15.2 1.3 From fb4de59de910ddc72de73bafba79571580a2a0d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Apr 2025 06:34:06 +0000 Subject: [PATCH 1107/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.15.2 to 5.16.1 Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.15.2 to 5.16.1. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.15.2...v5.16.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e3a8ff15..15be9c45 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.18.3 2.0.16 5.12.1 - 5.15.2 + 5.17.0 1.3 UTF-8 From 518aeea9d053f4d926397e270cd7cbc39b763fa4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Apr 2025 07:15:15 +0000 Subject: [PATCH 1108/1214] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.2 to 3.5.3. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.2...surefire-3.5.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-version: 3.5.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7693ddf9..90fd95e0 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.2 + 3.5.3 org.apache.maven.plugins From 257c4bb23c4df1fd0b9c2a97719e6feca5b24165 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Apr 2025 07:15:22 +0000 Subject: [PATCH 1109/1214] chore(deps): bump org.jacoco:jacoco-maven-plugin from 0.8.12 to 0.8.13 Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.12 to 0.8.13. - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.12...v0.8.13) --- updated-dependencies: - dependency-name: org.jacoco:jacoco-maven-plugin dependency-version: 0.8.13 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7693ddf9..a5b5d453 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ org.jacoco jacoco-maven-plugin - 0.8.12 + 0.8.13 From 1ddb08842eb4a5941caa85e17cb85f8ee78eca9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Apr 2025 07:15:38 +0000 Subject: [PATCH 1110/1214] chore(deps): bump org.apache.maven.plugins:maven-surefire-plugin Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.5.2 to 3.5.3. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.2...surefire-3.5.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-version: 3.5.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7693ddf9..90fd95e0 100644 --- a/pom.xml +++ b/pom.xml @@ -206,7 +206,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.2 + 3.5.3 org.apache.maven.plugins From a161e20f1da2dfe60fec9b97fa668b6e36ca6b5c Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Sat, 5 Apr 2025 09:18:43 +0200 Subject: [PATCH 1111/1214] chore(deps): update httpclient to 5.4.3 --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- pom.xml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 56ccdbe3..aec63fe5 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,7 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index dfa81318..1f05e901 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -37,7 +37,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.2 + 5.4.3 test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 3115e5a6..1897c2d0 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,7 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index f8edf92e..fe0b8b6c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -38,7 +38,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.2 + 5.4.3 test diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index c90674fd..6f312866 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.2") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 8e2648a9..091d1ad1 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -41,7 +41,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.2 + 5.4.3 test diff --git a/pom.xml b/pom.xml index 7693ddf9..e01461df 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.2 + 5.4.3 test From 02f36fb9891d0d6fac25e78de1c582bae178cc6c Mon Sep 17 00:00:00 2001 From: deki Date: Sat, 5 Apr 2025 07:37:23 +0000 Subject: [PATCH 1112/1214] chore: release - prepare release aws-serverless-java-container-2.1.3 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 1fd00e48..0e33fc12 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 80e99330..2777d8d5 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index ee7935d4..dc6e49cd 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 236e173f..02b12448 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.2.0-SNAPSHOT + 2.1.3 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.2.0-SNAPSHOT + 2.1.3 6.2.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container-core - 2.2.0-SNAPSHOT + 2.1.3 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 412459c4..0cbd9a83 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.2.0-SNAPSHOT + 2.1.3 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.3 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 8b95c533..0e4e892a 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.2.0-SNAPSHOT + 2.1.3 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.3 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 89469c2e..ed23960c 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.2.0-SNAPSHOT + 2.1.3 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.2.0-SNAPSHOT + 2.1.3 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.3 diff --git a/pom.xml b/pom.xml index 6bc2ff23..9ac11869 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.2.0-SNAPSHOT + 2.1.3 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.3 From 7d20289b26ba3e0a02d9393ccd234b04a0d909b9 Mon Sep 17 00:00:00 2001 From: deki Date: Sat, 5 Apr 2025 07:37:24 +0000 Subject: [PATCH 1113/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0e33fc12..15cd203a 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 2777d8d5..905f4d46 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index dc6e49cd..eeaf7a2a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 02b12448..0186a380 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.3 + 2.1.4-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.3 + 2.1.4-SNAPSHOT 6.2.5 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.4-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 0cbd9a83..c85993a4 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.3 + 2.1.4-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.3 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 0e4e892a..46e3d8db 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.3 + 2.1.4-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.3 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index ed23960c..01b157e5 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.4-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.3 + 2.1.4-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.3 + HEAD diff --git a/pom.xml b/pom.xml index 9ac11869..d679e20a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.3 + 2.1.4-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.3 + HEAD From 215b15e90f24c8bdf6dace204cc41b82a983aab4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 04:14:00 +0000 Subject: [PATCH 1114/1214] chore(deps): bump org.owasp:dependency-check-maven from 12.1.0 to 12.1.1 Bumps [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) from 12.1.0 to 12.1.1. - [Release notes](https://github.com/dependency-check/DependencyCheck/releases) - [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.1.0...v12.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-version: 12.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..7b4aea56 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.1.0 + 12.1.1 2.18.3 2.0.17 5.12.1 From 50c2ccd0b4ce469f7155c0706dedfacaf0974ff1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 04:14:16 +0000 Subject: [PATCH 1115/1214] chore(deps): bump org.owasp:dependency-check-maven Bumps [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) from 12.1.0 to 12.1.1. - [Release notes](https://github.com/dependency-check/DependencyCheck/releases) - [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.1.0...v12.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-version: 12.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..7b4aea56 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.1.0 + 12.1.1 2.18.3 2.0.17 5.12.1 From 2e0d79048dfd9b3ee7534959d00678d4c153a7b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 04:14:26 +0000 Subject: [PATCH 1116/1214] chore(deps): bump org.owasp:dependency-check-maven Bumps [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) from 12.1.0 to 12.1.1. - [Release notes](https://github.com/dependency-check/DependencyCheck/releases) - [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.1.0...v12.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-version: 12.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..7b4aea56 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.1.0 + 12.1.1 2.18.3 2.0.17 5.12.1 From 8a7d9031b211ff9a3355489083f2a7702af1deed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 04:14:37 +0000 Subject: [PATCH 1117/1214] chore(deps): bump org.owasp:dependency-check-maven Bumps [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) from 12.1.0 to 12.1.1. - [Release notes](https://github.com/dependency-check/DependencyCheck/releases) - [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.1.0...v12.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-version: 12.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..7b4aea56 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.1.0 + 12.1.1 2.18.3 2.0.17 5.12.1 From 9088431d352db09e54d0cab55e1a312533c525c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 04:14:47 +0000 Subject: [PATCH 1118/1214] chore(deps): bump org.owasp:dependency-check-maven Bumps [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) from 12.1.0 to 12.1.1. - [Release notes](https://github.com/dependency-check/DependencyCheck/releases) - [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md) - [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.1.0...v12.1.1) --- updated-dependencies: - dependency-name: org.owasp:dependency-check-maven dependency-version: 12.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..7b4aea56 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ 0.7 - 12.1.0 + 12.1.1 2.18.3 2.0.17 5.12.1 From 41f67a57b649882e933d5fc6c35bb5f3d7252de1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 04:14:02 +0000 Subject: [PATCH 1119/1214] chore(deps): bump org.junit:junit-bom Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.1 to 5.12.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 1897c2d0..f6ff5996 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") - testImplementation(platform("org.junit:junit-bom:5.12.1")) + testImplementation(platform("org.junit:junit-bom:5.12.2")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } From a58d611dbdf97d87b348dd0e800cddb64d51b2f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 04:26:06 +0000 Subject: [PATCH 1120/1214] chore(deps): bump the junit group across 8 directories with 1 update Bumps the junit group with 1 update in the / directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-java-container-core directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-java-container-jersey directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-java-container-spring directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-java-container-springboot3 directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-jersey-archetype directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-spring-archetype directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Bumps the junit group with 1 update in the /aws-serverless-springboot3-archetype directory: [org.junit:junit-bom](https://github.com/junit-team/junit5). Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) Updates `org.junit:junit-bom` from 5.12.1 to 5.12.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit - dependency-name: org.junit:junit-bom dependency-version: 5.12.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: junit ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d679e20a..33bef240 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 12.1.0 2.18.3 2.0.17 - 5.12.1 + 5.12.2 5.17.0 1.3 UTF-8 From dc9c63b491b41d691a1e3ce16a7bc2410d7d11e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 05:43:05 +0000 Subject: [PATCH 1121/1214] chore(deps): bump com.h3xstream.findsecbugs:findsecbugs-plugin Bumps [com.h3xstream.findsecbugs:findsecbugs-plugin](https://github.com/find-sec-bugs/find-sec-bugs) from 1.13.0 to 1.14.0. - [Release notes](https://github.com/find-sec-bugs/find-sec-bugs/releases) - [Changelog](https://github.com/find-sec-bugs/find-sec-bugs/blob/master/CHANGELOG.md) - [Commits](https://github.com/find-sec-bugs/find-sec-bugs/commits) --- updated-dependencies: - dependency-name: com.h3xstream.findsecbugs:findsecbugs-plugin dependency-version: 1.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index be3e8ff8..a076fa92 100644 --- a/pom.xml +++ b/pom.xml @@ -270,7 +270,7 @@ com.h3xstream.findsecbugs findsecbugs-plugin - 1.13.0 + 1.14.0 From 53beaa1b6c5a8bf2125d1dee5ae0550b5581773b Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 6 May 2025 14:49:21 +0200 Subject: [PATCH 1122/1214] chore(deps): Update Spring dependencies (framework to 6.2.6, security to 6.4.5, boot to 3.4.5) --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/spring/pet-store/build.gradle | 4 ++-- samples/spring/pet-store/pom.xml | 2 +- samples/springboot3/alt-pet-store/build.gradle | 2 +- samples/springboot3/alt-pet-store/pom.xml | 2 +- samples/springboot3/graphql-pet-store/pom.xml | 2 +- samples/springboot3/pet-store-native/pom.xml | 2 +- samples/springboot3/pet-store/build.gradle | 2 +- samples/springboot3/pet-store/pom.xml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 15cd203a..fa34e8d8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.4.4 + 6.4.5 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eeaf7a2a..f26cc578 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,8 +16,8 @@ - 6.2.5 - 6.4.4 + 6.2.6 + 6.4.5 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 619cdaa9..b09d851b 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,9 +15,9 @@ 2.1.4-SNAPSHOT - 6.2.5 - 3.4.4 - 6.4.4 + 6.2.6 + 3.4.5 + 6.4.5 diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index f6ff5996..026885dd 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.5', - 'org.springframework:spring-context:6.2.5', + 'org.springframework:spring-webmvc:6.2.6', + 'org.springframework:spring-context:6.2.6', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index fe0b8b6c..48b70f27 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 - 6.2.5 + 6.2.6 5.12.1 2.24.2 diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index 6f312866..d44a26cc 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.4.4', + 'org.springframework.boot:spring-boot-starter-web:3.4.5', 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', ) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 091d1ad1..73d407dd 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 0c28ff2b..4d60cdd0 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.5', - 'org.springframework:spring-context:6.2.5', + 'org.springframework:spring-webmvc:6.2.6', + 'org.springframework:spring-context:6.2.6', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 4945ba71..d4f23078 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.2.5 + 6.2.6 2.24.3 17 17 diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 59352a11..653135db 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.4') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index f1f605c6..0c98f1fe 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index 76b804e5..d3b4ef07 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml index 2dc5508d..96044201 100644 --- a/samples/springboot3/pet-store-native/pom.xml +++ b/samples/springboot3/pet-store-native/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 com.amazonaws.serverless.sample diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle index 59352a11..653135db 100644 --- a/samples/springboot3/pet-store/build.gradle +++ b/samples/springboot3/pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.4') { + implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index af519947..2896d90d 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.4 + 3.4.5 From 36bdfb8c12576b13adb8d273538916526c3496ac Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Tue, 6 May 2025 21:29:03 +0200 Subject: [PATCH 1123/1214] doc: add 3.x version (#1207) --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9df70fdf..3f26e0c1 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,11 @@ Serverless Java Container natively supports API Gateway's proxy integration mode Currently the following versions are maintained: -| Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | -|---------|--------|-------------------------|-----------------|------------------------|----------------|---------------| -| 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | -| 2.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | +| Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | +|---------|--------|-----------------------------|-----------------|------------------------|----------------|---------------| +| 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | +| 2.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | +| 3.x | | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 4.x | :x: | :x: | Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) From faf0d48e3a3cbf95b9a80ca28c9a5b3d6b066da8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:30:36 +0000 Subject: [PATCH 1124/1214] chore(deps): bump org.apache.maven.archetype:archetype-packaging Bumps [org.apache.maven.archetype:archetype-packaging](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.archetype:archetype-packaging dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-jersey-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c85993a4..1b50cbfa 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.3.1 + 3.4.0 From 7d1b723e52a5bde74e96907cb1abbeba2f31feb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:30:43 +0000 Subject: [PATCH 1125/1214] chore(deps): bump org.apache.maven.plugins:maven-archetype-plugin Bumps [org.apache.maven.plugins:maven-archetype-plugin](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-archetype-plugin dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-jersey-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index c85993a4..80637169 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.3.1 + 3.4.0 From 4486eb4b56b702e1d16411963030d01dd2eb9f31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:30:56 +0000 Subject: [PATCH 1126/1214] chore(deps): bump org.apache.maven.plugins:maven-archetype-plugin Bumps [org.apache.maven.plugins:maven-archetype-plugin](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-archetype-plugin dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-spring-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 46e3d8db..543fb735 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -66,7 +66,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.3.1 + 3.4.0 From af5bf64344a7e6cce416ae99d3ee1f0c120b9e68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:31:00 +0000 Subject: [PATCH 1127/1214] chore(deps): bump org.apache.maven.archetype:archetype-packaging Bumps [org.apache.maven.archetype:archetype-packaging](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.archetype:archetype-packaging dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-spring-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 46e3d8db..7b2eac6c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.3.1 + 3.4.0 From 327851297abf67e808195feff193a96c08f53fdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:31:06 +0000 Subject: [PATCH 1128/1214] chore(deps): bump org.apache.maven.plugins:maven-archetype-plugin Bumps [org.apache.maven.plugins:maven-archetype-plugin](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-archetype-plugin dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-springboot3-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 01b157e5..a6abbb25 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -65,7 +65,7 @@ org.apache.maven.plugins maven-archetype-plugin - 3.3.1 + 3.4.0 From 4916e68a790cf8509f7b980493b2e6ee135c30d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 04:31:13 +0000 Subject: [PATCH 1129/1214] chore(deps): bump org.apache.maven.archetype:archetype-packaging Bumps [org.apache.maven.archetype:archetype-packaging](https://github.com/apache/maven-archetype) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/apache/maven-archetype/releases) - [Commits](https://github.com/apache/maven-archetype/compare/maven-archetype-3.3.1...maven-archetype-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.archetype:archetype-packaging dependency-version: 3.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-springboot3-archetype/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 01b157e5..a37fee35 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -48,7 +48,7 @@ org.apache.maven.archetype archetype-packaging - 3.3.1 + 3.4.0 From 17201462aed05e360ce33cef3a3b8a512e3a534f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 04:35:30 +0000 Subject: [PATCH 1130/1214] chore(deps-dev): bump the httpclient group across 8 directories with 1 update Bumps the httpclient group with 1 update in the / directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-java-container-core directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-java-container-jersey directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-java-container-spring directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-java-container-springboot3 directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-jersey-archetype directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-spring-archetype directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-springboot3-archetype directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:development update-type: version-update:semver-minor dependency-group: httpclient ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index be3e8ff8..41e74d07 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.3 + 5.5 test From 972c0bcd755e6027358275c12a40107446b4b085 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 04:38:23 +0000 Subject: [PATCH 1131/1214] chore(deps): bump org.springframework.boot:spring-boot-starter-parent Bumps [org.springframework.boot:spring-boot-starter-parent](https://github.com/spring-projects/spring-boot) from 3.4.5 to 3.5.0. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.4.5...v3.5.0) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-parent dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/alt-pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml index 0c98f1fe..64cbb083 100644 --- a/samples/springboot3/alt-pet-store/pom.xml +++ b/samples/springboot3/alt-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.5 + 3.5.0 From 56e355ca3f53358aa690a7a5aba6527e60f8b9de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 04:38:32 +0000 Subject: [PATCH 1132/1214] chore(deps): bump org.springframework.boot:spring-boot-starter-parent Bumps [org.springframework.boot:spring-boot-starter-parent](https://github.com/spring-projects/spring-boot) from 3.4.5 to 3.5.0. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.4.5...v3.5.0) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-parent dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/graphql-pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml index d3b4ef07..23ac0bae 100644 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ b/samples/springboot3/graphql-pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.5 + 3.5.0 From 1781631ed76477385f73df2fe19d386edd5e000a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 04:38:43 +0000 Subject: [PATCH 1133/1214] chore(deps): bump org.springframework.boot:spring-boot-starter-parent Bumps [org.springframework.boot:spring-boot-starter-parent](https://github.com/spring-projects/spring-boot) from 3.4.5 to 3.5.0. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.4.5...v3.5.0) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-parent dependency-version: 3.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml index 2896d90d..4126ead7 100644 --- a/samples/springboot3/pet-store/pom.xml +++ b/samples/springboot3/pet-store/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.4.5 + 3.5.0 From bb226134ce9c00e032049621d9834255b55cb65a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 05:04:14 +0000 Subject: [PATCH 1134/1214] chore(deps): bump the httpclient group across 3 directories with 1 update Bumps the httpclient group with 1 update in the /aws-serverless-jersey-archetype/src/main/resources/archetype-resources directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Bumps the httpclient group with 1 update in the /aws-serverless-springboot3-archetype/src/main/resources/archetype-resources directory: [org.apache.httpcomponents.client5:httpclient5](https://github.com/apache/httpcomponents-client). Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) Updates `org.apache.httpcomponents.client5:httpclient5` from 5.4.3 to 5.5 - [Changelog](https://github.com/apache/httpcomponents-client/blob/master/RELEASE_NOTES.txt) - [Commits](https://github.com/apache/httpcomponents-client/compare/rel/v5.4.3...rel/v5.5) --- updated-dependencies: - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient - dependency-name: org.apache.httpcomponents.client5:httpclient5 dependency-version: '5.5' dependency-type: direct:production update-type: version-update:semver-minor dependency-group: httpclient ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index aec63fe5..c7c013f6 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -22,7 +22,7 @@ dependencies { } testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 026885dd..076a9bcf 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -18,7 +18,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") testImplementation(platform("org.junit:junit-bom:5.12.2")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index d44a26cc..b9e08417 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -14,7 +14,7 @@ dependencies { ) testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.3") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") testImplementation(platform("org.junit:junit-bom:5.12.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") From eef712ffbb45e8e84a9e97cab2f6eccc2f366c21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 04:15:43 +0000 Subject: [PATCH 1135/1214] chore(deps): bump the spring group across 2 directories with 2 updates Bumps the spring group with 2 updates in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-context](https://github.com/spring-projects/spring-framework). Bumps the spring group with 2 updates in the /samples/spring/pet-store directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-context](https://github.com/spring-projects/spring-framework). Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) --- updated-dependencies: - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 4 ++-- samples/spring/pet-store/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 026885dd..f8983d18 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.6', - 'org.springframework:spring-context:6.2.6', + 'org.springframework:spring-webmvc:6.2.8', + 'org.springframework:spring-context:6.2.8', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 4d60cdd0..92123972 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -7,8 +7,8 @@ repositories { dependencies { implementation ( - 'org.springframework:spring-webmvc:6.2.6', - 'org.springframework:spring-context:6.2.6', + 'org.springframework:spring-webmvc:6.2.8', + 'org.springframework:spring-context:6.2.8', 'com.amazonaws.serverless:aws-serverless-java-container-spring:[2.0-SNAPSHOT,)', 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', From 32984f09d9e9a6a56572995b066f4b46adcc403f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 04:15:45 +0000 Subject: [PATCH 1136/1214] chore(deps): bump the jackson group across 4 directories with 1 update Bumps the jackson group with 1 update in the /aws-serverless-jersey-archetype/src/main/resources/archetype-resources directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /aws-serverless-spring-archetype/src/main/resources/archetype-resources directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/jersey/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/spring/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- .../src/main/resources/archetype-resources/build.gradle | 2 +- samples/jersey/pet-store/build.gradle | 2 +- samples/spring/pet-store/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index aec63fe5..cbe29ab1 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.3', + 'com.fasterxml.jackson.core:jackson-databind:2.19.1', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 026885dd..f489ab2c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', - 'com.fasterxml.jackson.core:jackson-databind:2.18.3', + 'com.fasterxml.jackson.core:jackson-databind:2.19.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) diff --git a/samples/jersey/pet-store/build.gradle b/samples/jersey/pet-store/build.gradle index 0829175e..0194402b 100644 --- a/samples/jersey/pet-store/build.gradle +++ b/samples/jersey/pet-store/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { implementation ( 'com.amazonaws.serverless:aws-serverless-java-container-jersey:[2.0-SNAPSHOT,)', - 'com.fasterxml.jackson.core:jackson-databind:2.18.3', + 'com.fasterxml.jackson.core:jackson-databind:2.19.1', ) implementation("org.glassfish.jersey.media:jersey-media-json-jackson:3.1.10") { diff --git a/samples/spring/pet-store/build.gradle b/samples/spring/pet-store/build.gradle index 4d60cdd0..211f621c 100644 --- a/samples/spring/pet-store/build.gradle +++ b/samples/spring/pet-store/build.gradle @@ -13,7 +13,7 @@ dependencies { 'org.apache.logging.log4j:log4j-core:2.24.3', 'org.apache.logging.log4j:log4j-api:2.24.3', 'org.apache.logging.log4j:log4j-slf4j-impl:2.24.3', - 'com.fasterxml.jackson.core:jackson-databind:2.18.3', + 'com.fasterxml.jackson.core:jackson-databind:2.19.1', 'com.amazonaws:aws-lambda-java-log4j2:1.6.0', ) } From 4fb251ee9b493b69201ffc110c02faa1f2ee9eb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 04:35:32 +0000 Subject: [PATCH 1137/1214] chore(deps): bump the jackson group across 5 directories with 2 updates Bumps the jackson group with 2 updates in the / directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) and [com.fasterxml.jackson.module:jackson-module-afterburner](https://github.com/FasterXML/jackson-modules-base). Bumps the jackson group with 2 updates in the /aws-serverless-java-container-core directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) and [com.fasterxml.jackson.module:jackson-module-afterburner](https://github.com/FasterXML/jackson-modules-base). Bumps the jackson group with 1 update in the /aws-serverless-java-container-jersey directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /aws-serverless-java-container-spring directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Bumps the jackson group with 1 update in the /samples/jersey/pet-store directory: [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson). Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.module:jackson-module-afterburner` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson-modules-base/compare/jackson-modules-base-2.18.3...jackson-modules-base-2.19.1) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.18.3 to 2.19.1 - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.module:jackson-module-afterburner dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.19.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: jackson ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- samples/jersey/pet-store/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index be3e8ff8..313969dc 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 0.7 12.1.1 - 2.18.3 + 2.19.1 2.0.17 5.12.2 5.17.0 diff --git a/samples/jersey/pet-store/pom.xml b/samples/jersey/pet-store/pom.xml index dc29c9f6..aa3e1cae 100644 --- a/samples/jersey/pet-store/pom.xml +++ b/samples/jersey/pet-store/pom.xml @@ -27,7 +27,7 @@ 1.8 1.8 3.1.10 - 2.18.3 + 2.19.1 From 2d958f10c45a9377776e46db7d698080dbf709a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 04:36:49 +0000 Subject: [PATCH 1138/1214] chore(deps): bump the spring group across 3 directories with 6 updates Bumps the spring group with 2 updates in the / directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-test](https://github.com/spring-projects/spring-framework). Bumps the spring group with 2 updates in the /aws-serverless-java-container-spring directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-test](https://github.com/spring-projects/spring-framework). Bumps the spring group with 3 updates in the /samples/spring/pet-store directory: [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework), [org.springframework:spring-context](https://github.com/spring-projects/spring-framework) and [org.springframework:spring-context-indexer](https://github.com/spring-projects/spring-framework). Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webflux` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-core` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-test` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context-indexer` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-webmvc` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) Updates `org.springframework:spring-context-indexer` from 6.2.6 to 6.2.8 - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.6...v6.2.8) --- updated-dependencies: - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webflux dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-core dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-test dependency-version: 6.2.8 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context-indexer dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring - dependency-name: org.springframework:spring-context-indexer dependency-version: 6.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: spring ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- aws-serverless-java-container-springboot3/pom.xml | 2 +- samples/spring/pet-store/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f26cc578..2b455f4c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -16,7 +16,7 @@ - 6.2.6 + 6.2.8 6.4.5 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b09d851b..8035cb86 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -15,7 +15,7 @@ 2.1.4-SNAPSHOT - 6.2.6 + 6.2.8 3.4.5 6.4.5 diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index d4f23078..3603df15 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.2.6 + 6.2.8 2.24.3 17 17 From 5f14b7d3fc2a3ec33a3c75ef7d1756943e515af2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:29:22 +0000 Subject: [PATCH 1139/1214] chore(deps-dev): bump spring-security.version Bumps `spring-security.version` from 6.4.5 to 6.5.0. Updates `org.springframework.security:spring-security-config` from 6.4.5 to 6.5.0 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.4.5...6.5.0) Updates `org.springframework.security:spring-security-web` from 6.4.5 to 6.5.0 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.4.5...6.5.0) --- updated-dependencies: - dependency-name: org.springframework.security:spring-security-config dependency-version: 6.5.0 dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.springframework.security:spring-security-web dependency-version: 6.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-spring/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 2b455f4c..f4e34ddc 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 6.2.8 - 6.4.5 + 6.5.1 From 824689c5f8377bdc95c774be416742d2e3456680 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:29:23 +0000 Subject: [PATCH 1140/1214] chore(deps): bump spring-security.version from 6.4.5 to 6.5.0 Bumps `spring-security.version` from 6.4.5 to 6.5.0. Updates `org.springframework.security:spring-security-web` from 6.4.5 to 6.5.0 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.4.5...6.5.0) Updates `org.springframework.security:spring-security-config` from 6.4.5 to 6.5.0 - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/6.4.5...6.5.0) --- updated-dependencies: - dependency-name: org.springframework.security:spring-security-web dependency-version: 6.5.0 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.springframework.security:spring-security-config dependency-version: 6.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- aws-serverless-java-container-core/pom.xml | 2 +- aws-serverless-java-container-spring/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fa34e8d8..3c233492 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -60,7 +60,7 @@ org.springframework.security spring-security-web - 6.4.5 + 6.5.1 test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 2b455f4c..f4e34ddc 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -17,7 +17,7 @@ 6.2.8 - 6.4.5 + 6.5.1 From f1399c48e26d22fb97754b01999305035082b8cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:30:09 +0000 Subject: [PATCH 1141/1214] chore(deps): bump org.junit:junit-bom Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.1 to 5.13.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.13.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle index b9e08417..3aa54825 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") - testImplementation(platform("org.junit:junit-bom:5.12.1")) + testImplementation(platform("org.junit:junit-bom:5.13.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } From 305060aa1364b2125abd60a2666669c7f80299a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:30:09 +0000 Subject: [PATCH 1142/1214] chore(deps): bump org.junit:junit-bom Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.2 to 5.13.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.2...r5.13.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle index 96bf7744..a7c4098e 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/build.gradle @@ -19,7 +19,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") - testImplementation(platform("org.junit:junit-bom:5.12.2")) + testImplementation(platform("org.junit:junit-bom:5.13.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } From ce4e6039b946a6082c535c9c87d5b46fa7128d3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:30:14 +0000 Subject: [PATCH 1143/1214] chore(deps): bump org.junit:junit-bom Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.12.1 to 5.13.1. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.13.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .../src/main/resources/archetype-resources/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle index 922c719a..34ddfa29 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/build.gradle @@ -23,7 +23,7 @@ dependencies { testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") - testImplementation(platform("org.junit:junit-bom:5.12.1")) + testImplementation(platform("org.junit:junit-bom:5.13.1")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } From cc0e12720c0ab138e60df5c3d509fdc020543928 Mon Sep 17 00:00:00 2001 From: Vichym Date: Tue, 17 Jun 2025 16:31:10 -0700 Subject: [PATCH 1144/1214] fix build failure. --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index bde53961..c52a17d0 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -517,7 +517,10 @@ protected Map> getMultipartFormParametersMap() { newPart.setContentType(item.getContentType()); newPart.setSize(item.getSize()); item.getHeaders().getHeaderNames().forEachRemaining(h -> { - newPart.addHeader(h, item.getHeaders().getHeader(h)); + String headerValue = item.getHeaders().getHeader(h); + if (headerValue != null) { + newPart.addHeader(h, headerValue); + } }); addPart(multipartFormParameters, item.getFieldName(), newPart); From 29072d3d138ce001a2b00a533b670b277d0a23d4 Mon Sep 17 00:00:00 2001 From: Vichym Date: Tue, 17 Jun 2025 16:01:32 -0700 Subject: [PATCH 1145/1214] update commons-fileupload2-jakarta-servlet6 to 2.0.0-M4 This is to update dependency on commons-fileupload2-core from 2.0.0-M2 to 2.0.0-M4 --- aws-serverless-java-container-core/pom.xml | 2 +- .../servlet/AwsHttpServletRequest.java | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index fa34e8d8..9fe565ee 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -54,7 +54,7 @@ org.apache.commons commons-fileupload2-jakarta-servlet6 - 2.0.0-M2 + 2.0.0-M4 diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index c52a17d0..1807fcd3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -493,7 +493,7 @@ public Part getPart(String s) } @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) - protected Map> getMultipartFormParametersMap() { + protected Map> getMultipartFormParametersMap() throws RuntimeException { if (multipartFormParameters != null) { return multipartFormParameters; } @@ -511,19 +511,20 @@ protected Map> getMultipartFormParametersMap() { List items = upload.parseRequest(this); for (FileItem item : items) { String fileName = FilenameUtils.getName(item.getName()); - AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(item.getFieldName()); - newPart.setSubmittedFileName(fileName); - newPart.setContentType(item.getContentType()); - newPart.setSize(item.getSize()); - item.getHeaders().getHeaderNames().forEachRemaining(h -> { - String headerValue = item.getHeaders().getHeader(h); - if (headerValue != null) { - newPart.addHeader(h, headerValue); - } - }); - - addPart(multipartFormParameters, item.getFieldName(), newPart); + try { + AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); + newPart.setName(item.getFieldName()); + newPart.setSubmittedFileName(fileName); + newPart.setContentType(item.getContentType()); + newPart.setSize(item.getSize()); + item.getHeaders().getHeaderNames().forEachRemaining(h -> { + newPart.addHeader(h, item.getHeaders().getHeader(h)); + }); + addPart(multipartFormParameters, item.getFieldName(), newPart); + } catch (Exception e) { + log.error("Encounter issue adding form multipart", e); + throw new RuntimeException(e); + } } } catch (FileUploadException e) { Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); From db4aaa070951c8968fe37d677b16cfd2b606c597 Mon Sep 17 00:00:00 2001 From: vicheey <181402101+vicheey@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:48:49 -0700 Subject: [PATCH 1146/1214] Update aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 1807fcd3..68a339bd 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -521,7 +521,7 @@ protected Map> getMultipartFormParametersMap() throws Runtime newPart.addHeader(h, item.getHeaders().getHeader(h)); }); addPart(multipartFormParameters, item.getFieldName(), newPart); - } catch (Exception e) { + } catch (IOException e) { log.error("Encounter issue adding form multipart", e); throw new RuntimeException(e); } From 8b7e7ff9a0f4278874658781199dcbc2debb71c1 Mon Sep 17 00:00:00 2001 From: Vichym Date: Wed, 18 Jun 2025 06:52:31 -0700 Subject: [PATCH 1147/1214] update to rethrow IOException --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 68a339bd..43e03f60 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -493,7 +493,7 @@ public Part getPart(String s) } @SuppressFBWarnings({"FILE_UPLOAD_FILENAME", "WEAK_FILENAMEUTILS"}) - protected Map> getMultipartFormParametersMap() throws RuntimeException { + protected Map> getMultipartFormParametersMap() throws IOException { if (multipartFormParameters != null) { return multipartFormParameters; } @@ -523,7 +523,7 @@ protected Map> getMultipartFormParametersMap() throws Runtime addPart(multipartFormParameters, item.getFieldName(), newPart); } catch (IOException e) { log.error("Encounter issue adding form multipart", e); - throw new RuntimeException(e); + throw new IOException(e); } } } catch (FileUploadException e) { From d7d4b9dd28a0759a5f194779bb74e9f32f41cc64 Mon Sep 17 00:00:00 2001 From: Vichym Date: Wed, 18 Jun 2025 09:26:39 -0700 Subject: [PATCH 1148/1214] remove try-catch block --- .../proxy/internal/servlet/AwsHttpServletRequest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 43e03f60..10fd6fd1 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -511,7 +511,6 @@ protected Map> getMultipartFormParametersMap() throws IOExcep List items = upload.parseRequest(this); for (FileItem item : items) { String fileName = FilenameUtils.getName(item.getName()); - try { AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); newPart.setName(item.getFieldName()); newPart.setSubmittedFileName(fileName); @@ -521,10 +520,6 @@ protected Map> getMultipartFormParametersMap() throws IOExcep newPart.addHeader(h, item.getHeaders().getHeader(h)); }); addPart(multipartFormParameters, item.getFieldName(), newPart); - } catch (IOException e) { - log.error("Encounter issue adding form multipart", e); - throw new IOException(e); - } } } catch (FileUploadException e) { Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); From 1011155dd43a7709204e872df6298255b14a0fdf Mon Sep 17 00:00:00 2001 From: Vichym Date: Wed, 18 Jun 2025 12:57:43 -0700 Subject: [PATCH 1149/1214] reset white space. --- .../servlet/AwsHttpServletRequest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 10fd6fd1..0029ee2d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -511,15 +511,15 @@ protected Map> getMultipartFormParametersMap() throws IOExcep List items = upload.parseRequest(this); for (FileItem item : items) { String fileName = FilenameUtils.getName(item.getName()); - AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); - newPart.setName(item.getFieldName()); - newPart.setSubmittedFileName(fileName); - newPart.setContentType(item.getContentType()); - newPart.setSize(item.getSize()); - item.getHeaders().getHeaderNames().forEachRemaining(h -> { - newPart.addHeader(h, item.getHeaders().getHeader(h)); - }); - addPart(multipartFormParameters, item.getFieldName(), newPart); + AwsProxyRequestPart newPart = new AwsProxyRequestPart(item.get()); + newPart.setName(item.getFieldName()); + newPart.setSubmittedFileName(fileName); + newPart.setContentType(item.getContentType()); + newPart.setSize(item.getSize()); + item.getHeaders().getHeaderNames().forEachRemaining(h -> { + newPart.addHeader(h, item.getHeaders().getHeader(h)); + }); + addPart(multipartFormParameters, item.getFieldName(), newPart); } } catch (FileUploadException e) { Timer.stop("SERVLET_REQUEST_GET_MULTIPART_PARAMS"); From b96035e7bd6a68346d8668d03f3ff98d0a252a49 Mon Sep 17 00:00:00 2001 From: vicheey Date: Wed, 18 Jun 2025 21:30:07 +0000 Subject: [PATCH 1150/1214] chore: release - prepare release aws-serverless-java-container-2.1.4 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f77536a4..5b7d331f 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 905f4d46..ee776bd6 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f4e34ddc..1f656287 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 8035cb86..d9dcc7e1 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.4-SNAPSHOT + 2.1.4 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4-SNAPSHOT + 2.1.4 6.2.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4-SNAPSHOT + 2.1.4 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 31897f30..69fcd0ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.4-SNAPSHOT + 2.1.4 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.4 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index efcd5494..5c15bbd0 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.4-SNAPSHOT + 2.1.4 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.4 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 61df561f..50dea38b 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4-SNAPSHOT + 2.1.4 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.4-SNAPSHOT + 2.1.4 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.4 diff --git a/pom.xml b/pom.xml index b780be8e..6040b24f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.4-SNAPSHOT + 2.1.4 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.4 From e8b5aa73852796dd91de1a5c2d7b2884c213fe89 Mon Sep 17 00:00:00 2001 From: vicheey Date: Wed, 18 Jun 2025 21:30:08 +0000 Subject: [PATCH 1151/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 5b7d331f..9d0ff3cb 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ee776bd6..1788a36b 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 1f656287..f03d9db0 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index d9dcc7e1..5dcac156 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.4 + 2.1.5-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.4 + 2.1.5-SNAPSHOT 6.2.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.4 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 69fcd0ed..4afdc999 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.4 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.4 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 5c15bbd0..2a2f59b8 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.4 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.4 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 50dea38b..74fac615 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.4 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.4 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.4 + HEAD diff --git a/pom.xml b/pom.xml index 6040b24f..dd73a040 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.4 + 2.1.5-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.4 + HEAD From 18a067ef56a01fb48b980e74d0c73ee121023264 Mon Sep 17 00:00:00 2001 From: ekruczek Date: Mon, 15 Sep 2025 23:10:39 +0200 Subject: [PATCH 1152/1214] fix: headers with null values removed from response (#1523) Co-authored-by: Emil Kruczek --- .../proxy/internal/servlet/AwsHttpServletResponse.java | 9 ++++++--- .../internal/servlet/AwsHttpServletResponseTest.java | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index 86a72ead..f5395a0b 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -496,9 +496,12 @@ private void setHeader(String key, String value, boolean overwrite) { values = new ArrayList<>(); } - values.add(encodedValue); - - headers.put(encodedKey, values); + if (value == null && overwrite) { + headers.remove(encodedKey); + } else if (value != null) { + values.add(encodedValue); + headers.put(encodedKey, values); + } } private boolean canSetHeader() { diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java index 88d2a5e7..143caab6 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponseTest.java @@ -173,6 +173,16 @@ void responseHeaders_getAwsResponseHeaders_expectLatestHeader() { assertEquals("application/xml", awsResp.getFirst(HttpHeaders.CONTENT_TYPE)); } + @Test + void responseHeaders_setHeaderWithNullValue_expectHeaderRemoved() { + AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); + resp.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline"); + resp.setHeader(HttpHeaders.CONTENT_DISPOSITION, null); + + Headers awsResp = resp.getAwsResponseHeaders(); + assertEquals(0, awsResp.size()); + } + @Test void responseHeaders_getAwsResponseHeaders_expectedMultpleCookieHeaders() { AwsHttpServletResponse resp = new AwsHttpServletResponse(null, null); From 30af781d5e143f390db9963a4fd6812f60fd8ff7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:18:52 -0700 Subject: [PATCH 1153/1214] chore(deps): bump com.amazonaws:aws-lambda-java-core from 1.2.3 to 1.4.0 (#1524) Bumps [com.amazonaws:aws-lambda-java-core](https://github.com/aws/aws-lambda-java-libs) from 1.2.3 to 1.4.0. - [Commits](https://github.com/aws/aws-lambda-java-libs/commits) --- updated-dependencies: - dependency-name: com.amazonaws:aws-lambda-java-core dependency-version: 1.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- aws-serverless-java-container-core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 9d0ff3cb..e9aa6bbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -24,7 +24,7 @@ com.amazonaws aws-lambda-java-core - 1.2.3 + 1.4.0 From a1c920b88173233493015cb28adf243c61adcd63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:23:32 -0700 Subject: [PATCH 1154/1214] chore(deps-dev): bump org.mockito:mockito-core from 5.17.0 to 5.19.0 (#1517) Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 5.17.0 to 5.19.0. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.17.0...v5.19.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-version: 5.19.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dd73a040..ebc634fb 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ 2.19.1 2.0.17 5.12.2 - 5.17.0 + 5.19.0 1.3 UTF-8 From af5a61d177ab2f3d67371d8fcfecbd776daae631 Mon Sep 17 00:00:00 2001 From: reedham-aws Date: Thu, 18 Sep 2025 22:58:53 +0000 Subject: [PATCH 1155/1214] chore: release - prepare release aws-serverless-java-container-2.1.5 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index e9aa6bbe..bd4318e8 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 1788a36b..e90446a3 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f03d9db0..9ab8a97e 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 5dcac156..a41c3a72 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.5-SNAPSHOT + 2.1.5 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 2.1.5 6.2.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.5 tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 4afdc999..9f1862e4 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.5-SNAPSHOT + 2.1.5 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.5 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 2a2f59b8..d3cdb9f1 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.5-SNAPSHOT + 2.1.5 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.5 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 74fac615..02c3738a 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.5 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.5-SNAPSHOT + 2.1.5 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.5 diff --git a/pom.xml b/pom.xml index ebc634fb..c4bb9b90 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.5-SNAPSHOT + 2.1.5 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-2.1.5 From 4696691989cfcd5d8957dbdfc280018aa267c8ba Mon Sep 17 00:00:00 2001 From: reedham-aws Date: Thu, 18 Sep 2025 22:58:55 +0000 Subject: [PATCH 1156/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 8 ++++---- aws-serverless-java-container-spring/pom.xml | 8 ++++---- aws-serverless-java-container-springboot3/pom.xml | 8 ++++---- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index bd4318e8..e9aa6bbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index e90446a3..1788a36b 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT .. @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT com.fasterxml.jackson.core @@ -35,7 +35,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9ab8a97e..f03d9db0 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT .. @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index a41c3a72..5dcac156 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.5 + 2.1.5-SNAPSHOT 4.0.0 @@ -12,7 +12,7 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5 + 2.1.5-SNAPSHOT 6.2.8 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5 + 2.1.5-SNAPSHOT tests test-jar test diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 9f1862e4..4afdc999 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.5 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.5 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index d3cdb9f1..2a2f59b8 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.5 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.5 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 02c3738a..74fac615 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 2.1.5-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.5 + 2.1.5-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.5 + HEAD diff --git a/pom.xml b/pom.xml index c4bb9b90..ebc634fb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.5 + 2.1.5-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-2.1.5 + HEAD From a55a57af609c71c03142c6a9b62bb432746aca29 Mon Sep 17 00:00:00 2001 From: Adnan Khan Date: Tue, 21 Oct 2025 17:26:15 -0400 Subject: [PATCH 1157/1214] ci: scope down permissions for owasp-dependency-check.yml --- .github/workflows/owasp-dependency-check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/owasp-dependency-check.yml b/.github/workflows/owasp-dependency-check.yml index fa265774..b7df2a77 100644 --- a/.github/workflows/owasp-dependency-check.yml +++ b/.github/workflows/owasp-dependency-check.yml @@ -3,6 +3,9 @@ on: schedule: - cron: "10 10 * * 3" +permissions: + contents: read + jobs: owasp-dependency-check: name: Verify dependencies with OWASP checker From 0c2f8dfe6a61d5b1ac73a1a85832e67241af6fce Mon Sep 17 00:00:00 2001 From: Adnan Khan Date: Tue, 21 Oct 2025 17:26:17 -0400 Subject: [PATCH 1158/1214] ci: scope down permissions for release.yml --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ff2bea7..9faff653 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,9 @@ on: description: "Version to use for further development" required: true default: "X.Y.Z-SNAPSHOT" +permissions: + contents: write + jobs: release: runs-on: ubuntu-latest From 2816aae7a701bc0c934b050fc0f067a34d36c6a4 Mon Sep 17 00:00:00 2001 From: Adnan Khan Date: Tue, 21 Oct 2025 17:26:19 -0400 Subject: [PATCH 1159/1214] ci: scope down permissions for continuous-integration-workflow.yml --- .github/workflows/continuous-integration-workflow.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2785cd3d..08fe294d 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -8,6 +8,9 @@ on: - 1.x workflow_dispatch: +permissions: + contents: read + jobs: build_core: name: Build and test core From 8f98eea56204fb51194f0007452877829eb93f74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:18:39 +0000 Subject: [PATCH 1160/1214] chore(deps): bump org.springframework.boot:spring-boot-starter-web Bumps [org.springframework.boot:spring-boot-starter-web](https://github.com/spring-projects/spring-boot) from 3.4.5 to 3.5.7. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.4.5...v3.5.7) --- updated-dependencies: - dependency-name: org.springframework.boot:spring-boot-starter-web dependency-version: 3.5.7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- samples/springboot3/alt-pet-store/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle index 653135db..d2c99b90 100644 --- a/samples/springboot3/alt-pet-store/build.gradle +++ b/samples/springboot3/alt-pet-store/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { + implementation('org.springframework.boot:spring-boot-starter-web:3.5.7') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' }, 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', From 890ee2d77ec981ef5bdef58182381eff62008fdb Mon Sep 17 00:00:00 2001 From: andreossido Date: Wed, 12 Nov 2025 10:04:10 +0100 Subject: [PATCH 1161/1214] fix: added missing main class to SpringApplicationBuilder (#1580) fix: replaced `AnnotationConfigServletWebServerApplicationContext` with `ConfigurableWebApplicationContext` (#1580) --- .../proxy/spring/SpringBootLambdaContainerHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index 6b3dd5ca..cf4e5842 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext; +import org.springframework.web.context.ConfigurableWebApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import com.amazonaws.serverless.exceptions.ContainerInitializationException; @@ -192,12 +192,15 @@ public void initialize() SpringApplicationBuilder builder = new SpringApplicationBuilder(getEmbeddedContainerClasses()) .web(springWebApplicationType); // .REACTIVE, .SERVLET + if(springBootInitializer != null) { + builder.main(springBootInitializer); + } if (springProfiles != null) { builder.profiles(springProfiles); } applicationContext = builder.run(); if (springWebApplicationType == WebApplicationType.SERVLET) { - ((AnnotationConfigServletWebServerApplicationContext)applicationContext).setServletContext(getServletContext()); + ((ConfigurableWebApplicationContext)applicationContext).setServletContext(getServletContext()); AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); if (reg != null) { reg.setLoadOnStartup(1); From 9c18414d5ce24b86bfd33055b57b97e88bc485d1 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 11 Dec 2025 12:53:52 -0800 Subject: [PATCH 1162/1214] update spring boot to version v3.5 to prepare support for v4.0 --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 5dcac156..dc9ffca0 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -16,7 +16,7 @@ 6.2.8 - 3.4.5 + 3.5.8 6.4.5 From 9a02c12505057042c254f1155678e7ba957dc00c Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 11 Dec 2025 15:02:06 -0800 Subject: [PATCH 1163/1214] verify sample projects work; update dockerfile architecture --- samples/springboot3/pet-store-native/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index 4fb614e3..7d5833bf 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -8,7 +8,7 @@ RUN yum -y update \ # Graal VM ENV GRAAL_VERSION 21.0.2 -ENV ARCHITECTURE x64 +ENV ARCHITECTURE aarch64 ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm From 397e459903ecb2ab0bf1057cd21c393f08df0c56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 23:23:45 +0000 Subject: [PATCH 1164/1214] chore(deps): bump org.springframework:spring-webmvc Bumps [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) from 6.2.8 to 6.2.10. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/compare/v6.2.8...v6.2.10) --- updated-dependencies: - dependency-name: org.springframework:spring-webmvc dependency-version: 6.2.10 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- samples/spring/pet-store/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/spring/pet-store/pom.xml b/samples/spring/pet-store/pom.xml index 3603df15..27a49d37 100644 --- a/samples/spring/pet-store/pom.xml +++ b/samples/spring/pet-store/pom.xml @@ -24,7 +24,7 @@ - 6.2.8 + 6.2.10 2.24.3 17 17 From 27d2f8df47f68edd55821fe9684e8c693401661b Mon Sep 17 00:00:00 2001 From: andreossido Date: Tue, 13 Jan 2026 12:31:14 +0100 Subject: [PATCH 1165/1214] test: added unit tests for `SpringBootLambdaContainerHandler.initialize` --- .../SpringBootLambdaContainerHandler.java | 5 +- .../SpringBootLambdaContainerHandlerTest.java | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java index cf4e5842..45bf28ef 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -184,13 +184,16 @@ protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServlet Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); } + SpringApplicationBuilder getSpringApplicationBuilder(Class... sources) { + return new SpringApplicationBuilder(sources); + } @Override public void initialize() throws ContainerInitializationException { Timer.start("SPRINGBOOT2_COLD_START"); - SpringApplicationBuilder builder = new SpringApplicationBuilder(getEmbeddedContainerClasses()) + SpringApplicationBuilder builder = getSpringApplicationBuilder(getEmbeddedContainerClasses()) .web(springWebApplicationType); // .REACTIVE, .SERVLET if(springBootInitializer != null) { builder.main(springBootInitializer); diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java new file mode 100644 index 00000000..871a751b --- /dev/null +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java @@ -0,0 +1,76 @@ +package com.amazonaws.serverless.proxy.spring; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication; +import com.amazonaws.serverless.proxy.spring.webfluxapp.WebFluxTestApplication; +import java.util.Collection; +import java.util.List; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mockito; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.builder.SpringApplicationBuilder; + +class SpringBootLambdaContainerHandlerTest { + + SpringBootLambdaContainerHandler handler; + SpringApplicationBuilder springApplicationBuilder; + + public static Collection data() { + return List.of(new TestData(WebApplicationType.SERVLET, ServletApplication.class), + new TestData(WebApplicationType.REACTIVE, WebFluxTestApplication.class)); + } + + private void initSpringBootLambdaContainerHandlerTest(Class springBootInitializer, + WebApplicationType applicationType) { + handler = Mockito.spy(new SpringBootLambdaContainerHandler<>(AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + springBootInitializer, + new InitializationWrapper(), + applicationType)); + + doAnswer(d -> { + springApplicationBuilder = ((SpringApplicationBuilder) Mockito.spy(d.callRealMethod())); + return springApplicationBuilder; + }).when(handler).getSpringApplicationBuilder(any(Class[].class)); + } + + @ParameterizedTest + @MethodSource("data") + void initialize_withSpringBootInitializer(TestData data) throws ContainerInitializationException { + initSpringBootLambdaContainerHandlerTest(data.springBootApplication(), data.applicationType()); + handler.initialize(); + + verify(springApplicationBuilder, times(1)).main(data.springBootApplication()); + } + + @ParameterizedTest + @EnumSource(WebApplicationType.class) + void initialize_withoutSpringBootInitializer(WebApplicationType webApplicationType) { + initSpringBootLambdaContainerHandlerTest(null, webApplicationType); + assertThrows(IllegalArgumentException.class, handler::initialize, "Source must not be null"); + + verify(springApplicationBuilder, never()).main(any()); + } + + record TestData(WebApplicationType applicationType, Class springBootApplication) {} +} \ No newline at end of file From b83323fab79f11f05ae19c44e32bd6fbe8b4cce8 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 16 Jan 2026 15:24:01 -0800 Subject: [PATCH 1166/1214] add springboot4 and spring 7 support --- .../continuous-integration-workflow.yml | 12 + README.md | 2 +- aws-serverless-java-container-core/pom.xml | 11 +- .../proxy/AwsProxyExceptionHandler.java | 4 +- .../internal/LambdaContainerHandler.java | 18 +- .../jaxrs/AwsHttpApiV2SecurityContext.java | 6 +- .../servlet/AwsHttpServletResponse.java | 30 ++ .../servlet/AwsProxyHttpServletRequest.java | 18 +- .../servlet/AwsServletInputStream.java | 20 + .../proxy/model/HttpApiV2AuthorizerMap.java | 39 +- .../proxy/AwsProxyExceptionHandlerTest.java | 14 +- .../testutils/AwsProxyRequestBuilder.java | 12 +- .../proxy/model/AwsProxyRequestTest.java | 2 +- .../model/HttpApiV2ProxyRequestTest.java | 14 +- aws-serverless-java-container-jersey/pom.xml | 26 +- .../proxy/jersey/JerseyAwsProxyTest.java | 10 +- .../proxy/jersey/JerseyParamEncodingTest.java | 7 +- aws-serverless-java-container-spring/pom.xml | 19 +- .../proxy/spring/SpringAwsProxyTest.java | 18 +- .../spring/echoapp/EchoSpringAppConfig.java | 2 +- .../spring/profile/SpringProfileTest.java | 2 +- .../pom.xml | 19 +- .../spotbugs-excludeFilter.xml | 28 ++ .../pom.xml | 408 ++++++++++++++++++ .../spotbugs-excludeFilter.xml | 28 ++ .../spring/AwsSpringAotTypesProcessor.java | 97 +++++ .../spring/AwsSpringHttpProcessingUtils.java | 224 ++++++++++ .../AwsSpringWebCustomRuntimeEventLoop.java | 187 ++++++++ .../AwsSpringWebRuntimeInitializer.java | 66 +++ .../SpringBootAwsProxyExceptionHandler.java | 27 ++ .../SpringBootLambdaContainerHandler.java | 230 ++++++++++ .../spring/SpringBootProxyHandlerBuilder.java | 88 ++++ ...pringDelegatingLambdaContainerHandler.java | 104 +++++ ...sReactiveServletEmbeddedServerFactory.java | 105 +++++ ...erverlessServletEmbeddedServerFactory.java | 65 +++ .../main/resources/META-INF/spring.factories | 2 + .../resources/META-INF/spring/aot.factories | 1 + .../proxy/spring/AWSWebRuntimeTests.java | 39 ++ .../AwsSpringHttpProcessingUtilsTests.java | 278 ++++++++++++ .../serverless/proxy/spring/JpaAppTest.java | 52 +++ .../proxy/spring/SecurityAppTest.java | 39 ++ .../proxy/spring/ServletAppTest.java | 236 ++++++++++ .../serverless/proxy/spring/SlowAppTest.java | 32 ++ ...DelegatingLambdaContainerHandlerTests.java | 335 ++++++++++++++ .../proxy/spring/WebFluxAppTest.java | 68 +++ ...rlessServletEmbeddedServerFactoryTest.java | 49 +++ .../proxy/spring/jpaapp/DatabaseConfig.java | 23 + .../proxy/spring/jpaapp/JpaApplication.java | 12 + .../proxy/spring/jpaapp/LambdaHandler.java | 59 +++ .../spring/jpaapp/MessageController.java | 31 ++ .../spring/securityapp/LambdaHandler.java | 25 ++ .../spring/securityapp/MessageController.java | 17 + .../securityapp/SecurityApplication.java | 14 + .../spring/securityapp/SecurityConfig.java | 45 ++ .../spring/servletapp/LambdaHandler.java | 60 +++ .../servletapp/LambdaStreamHandler.java | 63 +++ .../spring/servletapp/MessageController.java | 75 ++++ .../proxy/spring/servletapp/MessageData.java | 20 + .../spring/servletapp/ServletApplication.java | 25 ++ .../proxy/spring/servletapp/UserData.java | 50 +++ .../proxy/spring/slowapp/LambdaHandler.java | 40 ++ .../spring/slowapp/MessageController.java | 15 + .../spring/slowapp/SlowTestApplication.java | 21 + .../spring/webfluxapp/LambdaHandler.java | 58 +++ .../spring/webfluxapp/MessageController.java | 38 ++ .../proxy/spring/webfluxapp/MessageData.java | 20 + .../webfluxapp/WebFluxTestApplication.java | 14 + aws-serverless-jersey-archetype/pom.xml | 4 +- .../resources/archetype-resources/pom.xml | 12 +- .../src/main/java/StreamLambdaHandler.java | 1 + .../test/java/StreamLambdaHandlerTest.java | 3 +- aws-serverless-spring-archetype/pom.xml | 4 +- .../resources/archetype-resources/pom.xml | 8 +- .../test/java/StreamLambdaHandlerTest.java | 2 +- aws-serverless-springboot3-archetype/pom.xml | 4 +- aws-serverless-springboot4-archetype/pom.xml | 80 ++++ .../META-INF/maven/archetype-metadata.xml | 39 ++ .../resources/archetype-resources/README.md | 99 +++++ .../archetype-resources/build.gradle | 37 ++ .../resources/archetype-resources/pom.xml | 180 ++++++++ .../archetype-resources/src/assembly/bin.xml | 27 ++ .../src/main/java/Application.java | 24 ++ .../src/main/java/StreamLambdaHandler.java | 33 ++ .../main/java/controller/PingController.java | 20 + .../src/main/resources/application.properties | 3 + .../test/java/StreamLambdaHandlerTest.java | 88 ++++ .../archetype-resources/template.yml | 52 +++ .../projects/base/archetype.properties | 3 + .../src/test/resources/projects/base/goal.txt | 1 + pom.xml | 10 +- .../springboot3/pet-store-native/Dockerfile | 2 +- samples/springboot4/alt-pet-store/README.md | 56 +++ .../springboot4/alt-pet-store/build.gradle | 30 ++ samples/springboot4/alt-pet-store/pom.xml | 148 +++++++ .../alt-pet-store/src/assembly/bin.xml | 27 ++ .../sample/springboot4/Application.java | 51 +++ .../controller/PetsController.java | 90 ++++ .../filter/CognitoIdentityFilter.java | 69 +++ .../sample/springboot4/model/Error.java | 29 ++ .../sample/springboot4/model/Pet.java | 55 +++ .../sample/springboot4/model/PetData.java | 117 +++++ .../src/main/resources/logback.xml | 6 + .../springboot4/alt-pet-store/template.yml | 41 ++ .../springboot4/graphql-pet-store/README.md | 38 ++ samples/springboot4/graphql-pet-store/pom.xml | 168 ++++++++ .../graphql-pet-store/src/assembly/bin.xml | 27 ++ .../sample/springboot4/Application.java | 43 ++ .../springboot4/StreamLambdaHandler.java | 44 ++ .../controller/PetsController.java | 21 + .../filter/CognitoIdentityFilter.java | 69 +++ .../sample/springboot4/model/Owner.java | 20 + .../sample/springboot4/model/Pet.java | 20 + .../main/resources/graphql/schema.graphqls | 16 + .../src/main/resources/logback.xml | 5 + .../graphql-pet-store/template.yml | 35 ++ .../springboot4/pet-store-native/.gitignore | 33 ++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 62547 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + .../springboot4/pet-store-native/Dockerfile | 37 ++ .../springboot4/pet-store-native/README.md | 39 ++ samples/springboot4/pet-store-native/mvnw | 308 +++++++++++++ samples/springboot4/pet-store-native/mvnw.cmd | 205 +++++++++ samples/springboot4/pet-store-native/pom.xml | 140 ++++++ .../pet-store-native/src/assembly/java.xml | 31 ++ .../pet-store-native/src/assembly/native.xml | 29 ++ .../sample/springboot4/DemoApplication.java | 12 + .../sample/springboot4/HelloController.java | 17 + .../controller/PetsController.java | 82 ++++ .../filter/CognitoIdentityFilter.java | 69 +++ .../sample/springboot4/model/Error.java | 29 ++ .../sample/springboot4/model/Pet.java | 55 +++ .../sample/springboot4/model/PetData.java | 117 +++++ .../src/main/resources/META-INF/.gitignore | 1 + .../src/main/resources/application.properties | 1 + .../pet-store-native/src/shell/java/bootstrap | 7 + .../src/shell/native/bootstrap | 5 + .../pet-store-native/template.yaml | 33 ++ samples/springboot4/pet-store/README.md | 36 ++ samples/springboot4/pet-store/build.gradle | 30 ++ samples/springboot4/pet-store/pom.xml | 160 +++++++ .../pet-store/src/assembly/bin.xml | 27 ++ .../sample/springboot4/Application.java | 49 +++ .../springboot4/StreamLambdaHandler.java | 50 +++ .../controller/PetsController.java | 77 ++++ .../filter/CognitoIdentityFilter.java | 69 +++ .../sample/springboot4/model/Error.java | 29 ++ .../sample/springboot4/model/Pet.java | 55 +++ .../sample/springboot4/model/PetData.java | 117 +++++ .../pet-store/src/main/resources/logback.xml | 5 + samples/springboot4/pet-store/template.yml | 35 ++ 150 files changed, 7640 insertions(+), 146 deletions(-) create mode 100644 aws-serverless-java-container-springboot3/spotbugs-excludeFilter.xml create mode 100644 aws-serverless-java-container-springboot4/pom.xml create mode 100644 aws-serverless-java-container-springboot4/spotbugs-excludeFilter.xml create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java create mode 100644 aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java create mode 100644 aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring.factories create mode 100644 aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring/aot.factories create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java create mode 100644 aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java create mode 100644 aws-serverless-springboot4-archetype/pom.xml create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/README.md create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/build.gradle create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/pom.xml create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/Application.java create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java create mode 100644 aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/template.yml create mode 100644 aws-serverless-springboot4-archetype/src/test/resources/projects/base/archetype.properties create mode 100644 aws-serverless-springboot4-archetype/src/test/resources/projects/base/goal.txt create mode 100644 samples/springboot4/alt-pet-store/README.md create mode 100644 samples/springboot4/alt-pet-store/build.gradle create mode 100644 samples/springboot4/alt-pet-store/pom.xml create mode 100644 samples/springboot4/alt-pet-store/src/assembly/bin.xml create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java create mode 100644 samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java create mode 100644 samples/springboot4/alt-pet-store/src/main/resources/logback.xml create mode 100644 samples/springboot4/alt-pet-store/template.yml create mode 100644 samples/springboot4/graphql-pet-store/README.md create mode 100644 samples/springboot4/graphql-pet-store/pom.xml create mode 100644 samples/springboot4/graphql-pet-store/src/assembly/bin.xml create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Owner.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java create mode 100644 samples/springboot4/graphql-pet-store/src/main/resources/graphql/schema.graphqls create mode 100644 samples/springboot4/graphql-pet-store/src/main/resources/logback.xml create mode 100644 samples/springboot4/graphql-pet-store/template.yml create mode 100644 samples/springboot4/pet-store-native/.gitignore create mode 100644 samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.jar create mode 100644 samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.properties create mode 100644 samples/springboot4/pet-store-native/Dockerfile create mode 100644 samples/springboot4/pet-store-native/README.md create mode 100755 samples/springboot4/pet-store-native/mvnw create mode 100644 samples/springboot4/pet-store-native/mvnw.cmd create mode 100644 samples/springboot4/pet-store-native/pom.xml create mode 100644 samples/springboot4/pet-store-native/src/assembly/java.xml create mode 100644 samples/springboot4/pet-store-native/src/assembly/native.xml create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/DemoApplication.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/HelloController.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java create mode 100644 samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java create mode 100644 samples/springboot4/pet-store-native/src/main/resources/META-INF/.gitignore create mode 100644 samples/springboot4/pet-store-native/src/main/resources/application.properties create mode 100644 samples/springboot4/pet-store-native/src/shell/java/bootstrap create mode 100644 samples/springboot4/pet-store-native/src/shell/native/bootstrap create mode 100644 samples/springboot4/pet-store-native/template.yaml create mode 100644 samples/springboot4/pet-store/README.md create mode 100644 samples/springboot4/pet-store/build.gradle create mode 100644 samples/springboot4/pet-store/pom.xml create mode 100644 samples/springboot4/pet-store/src/assembly/bin.xml create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java create mode 100644 samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java create mode 100644 samples/springboot4/pet-store/src/main/resources/logback.xml create mode 100644 samples/springboot4/pet-store/template.yml diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 2785cd3d..0095c65a 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -82,6 +82,18 @@ jobs: - name: Build with Spring Boot 3.3.x run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.3.6 -Dspring.version=6.1.15 -Dspringsecurity.version=6.3.5 -Ddependency-check.skip=true + build_springboot4: + name: Build and test SpringBoot 4 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: 17 + - name: Build latest + run: ./gha_build.sh springboot4 true true # temporarily disabled as Struts is not released at the moment # build_struts2: # name: Build and test Struts diff --git a/README.md b/README.md index 3f26e0c1..b7da76ea 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Currently the following versions are maintained: |---------|--------|-----------------------------|-----------------|------------------------|----------------|---------------| | 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | | 2.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | -| 3.x | | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 4.x | :x: | :x: | +| 3.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 4.x | :x: | :x: | Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index e9aa6bbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,18 +6,19 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT .. 3.1.0 - 6.0.0 + 6.1.0 + 3.0.2 @@ -40,13 +41,13 @@ - com.fasterxml.jackson.core + tools.jackson.core jackson-databind ${jackson.version} - com.fasterxml.jackson.module + tools.jackson.module jackson-module-afterburner ${jackson.version} diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java index 0ae00b4d..8e13bd79 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandler.java @@ -18,7 +18,7 @@ import com.amazonaws.serverless.proxy.model.ErrorModel; import com.amazonaws.serverless.proxy.model.Headers; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import jakarta.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,7 +103,7 @@ protected String getErrorJson(String message) { try { return LambdaContainerHandler.getObjectMapper().writeValueAsString(new ErrorModel(message)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { log.error("Could not produce error JSON", e); return "{ \"message\": \"" + message + "\" }"; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java index ff978456..86d4216a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java @@ -19,12 +19,10 @@ import com.amazonaws.serverless.proxy.model.ContainerConfig; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.module.afterburner.AfterburnerModule; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; +import tools.jackson.databind.ObjectWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,10 +84,9 @@ public abstract class LambdaContainerHandler { return subject; }); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { log.error("Error while attempting to parse JWT body for requestId: " + SecurityUtils.crlf(event.getRequestContext().getRequestId()), e); return null; } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java index f5395a0b..2e1d4827 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletResponse.java @@ -28,6 +28,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.ws.rs.core.HttpHeaders; +import java.nio.ByteBuffer; import jakarta.ws.rs.core.MediaType; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -150,6 +151,16 @@ public void sendRedirect(String s) throws IOException { flushBuffer(); } + @Override + public void sendRedirect(String location, int sc, boolean clearBuffer) throws IOException { + setStatus(sc); + addHeader(HttpHeaders.LOCATION, location); + if (clearBuffer) { + resetBuffer(); + } + flushBuffer(); + } + @Override public void setDateHeader(String s, long l) { @@ -297,6 +308,25 @@ public void write(int b) throws IOException { } } + @Override + public void write(ByteBuffer b) throws IOException { + try { + if (b.hasArray()) { + bodyOutputStream.write(b.array(), b.arrayOffset() + b.position(), b.remaining()); + b.position(b.limit()); + } else { + byte[] buf = new byte[b.remaining()]; + b.get(buf); + bodyOutputStream.write(buf); + } + } catch (Exception e) { + log.error("Cannot write to output stream", e); + if (listener != null) { + listener.onError(e); + } + } + } + @Override public void flush() throws IOException { flushBuffer(); diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 9c4b7971..c2a257d3 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -607,12 +607,22 @@ private List getHeaderValues(String key) { if (request.getRequestSource() == RequestSource.API_GATEWAY) { if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) { - values.add(request.getRequestContext().getIdentity().getCaller()); - return values; + if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null) { + String caller = request.getRequestContext().getIdentity().getCaller(); + if (caller != null) { + values.add(caller); + return values; + } + } } if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) { - values.add(request.getRequestContext().getIdentity().getUserAgent()); - return values; + if (request.getRequestContext() != null && request.getRequestContext().getIdentity() != null) { + String userAgent = request.getRequestContext().getIdentity().getUserAgent(); + if (userAgent != null) { + values.add(userAgent); + return values; + } + } } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java index eb155a36..220ca602 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsServletInputStream.java @@ -20,6 +20,7 @@ import jakarta.servlet.ServletInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; public class AwsServletInputStream extends ServletInputStream { private static Logger log = LoggerFactory.getLogger(AwsServletInputStream.class); @@ -73,4 +74,23 @@ public int read() } return readByte; } + + @Override + public int read(ByteBuffer b) throws IOException { + if (bodyStream == null || bodyStream instanceof NullInputStream) { + return -1; + } + if (!b.hasRemaining()) { + return 0; + } + byte[] buf = new byte[b.remaining()]; + int bytesRead = bodyStream.read(buf); + if (bytesRead > 0) { + b.put(buf, 0, bytesRead); + } + if (bytesRead == -1) { + finished = true; + } + return bytesRead; + } } diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java index 2cf6d77a..8226be98 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/HttpApiV2AuthorizerMap.java @@ -13,17 +13,16 @@ package com.amazonaws.serverless.proxy.model; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.deser.std.StdDeserializer; +import tools.jackson.databind.ser.std.StdSerializer; +import tools.jackson.databind.type.TypeFactory; import java.io.IOException; import java.util.HashMap; @@ -77,10 +76,9 @@ public HttpApiV2AuthorizerDeserializer() { } @Override - public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException, JsonProcessingException { + public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) { HttpApiV2AuthorizerMap map = new HttpApiV2AuthorizerMap(); - JsonNode node = jsonParser.getCodec().readTree(jsonParser); + JsonNode node = deserializationContext.readTree(jsonParser); if (node.has(JWT_KEY)) { HttpApiV2JwtAuthorizer authorizer = LambdaContainerHandler.getObjectMapper() .treeToValue(node.get(JWT_KEY), HttpApiV2JwtAuthorizer.class); @@ -88,7 +86,7 @@ public HttpApiV2AuthorizerMap deserialize(JsonParser jsonParser, Deserialization } if (node.has(LAMBDA_KEY)) { Map context = LambdaContainerHandler.getObjectMapper().treeToValue(node.get(LAMBDA_KEY), - TypeFactory.defaultInstance().constructMapType(HashMap.class, String.class, Object.class)); + LambdaContainerHandler.getObjectMapper().getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); map.put(LAMBDA_KEY, context); } if (node.has(IAM_KEY)) { @@ -110,16 +108,19 @@ public HttpApiV2AuthorizerSerializer() { @Override public void serialize(HttpApiV2AuthorizerMap httpApiV2AuthorizerMap, JsonGenerator jsonGenerator, - SerializerProvider serializerProvider) throws IOException { + SerializationContext serializationContext) { jsonGenerator.writeStartObject(); if (httpApiV2AuthorizerMap.isJwt()) { - jsonGenerator.writeObjectField(JWT_KEY, httpApiV2AuthorizerMap.getJwtAuthorizer()); + jsonGenerator.writeName(JWT_KEY); + jsonGenerator.writePOJO(httpApiV2AuthorizerMap.getJwtAuthorizer()); } if (httpApiV2AuthorizerMap.isLambda()) { - jsonGenerator.writeObjectField(LAMBDA_KEY, httpApiV2AuthorizerMap.getLambdaAuthorizerContext()); + jsonGenerator.writeName(LAMBDA_KEY); + jsonGenerator.writePOJO(httpApiV2AuthorizerMap.getLambdaAuthorizerContext()); } if (httpApiV2AuthorizerMap.isIam()) { - jsonGenerator.writeObjectField(IAM_KEY, httpApiV2AuthorizerMap.get(IAM_KEY)); + jsonGenerator.writeName(IAM_KEY); + jsonGenerator.writePOJO(httpApiV2AuthorizerMap.get(IAM_KEY)); } jsonGenerator.writeEndObject(); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java index 012827e4..e15b9876 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/AwsProxyExceptionHandlerTest.java @@ -5,8 +5,8 @@ import com.amazonaws.serverless.exceptions.InvalidResponseObjectException; import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.ErrorModel; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -47,7 +47,7 @@ void typedHandle_InvalidRequestEventException_500State() { @Test void typedHandle_InvalidRequestEventException_responseString() - throws JsonProcessingException { + throws JacksonException { AwsProxyResponse resp = exceptionHandler.handle(new InvalidRequestEventException(INVALID_REQUEST_MESSAGE, null)); assertNotNull(resp); @@ -74,7 +74,7 @@ void typedHandle_InvalidResponseObjectException_502State() { @Test void typedHandle_InvalidResponseObjectException_responseString() - throws JsonProcessingException { + throws JacksonException { AwsProxyResponse resp = exceptionHandler.handle(new InvalidResponseObjectException(INVALID_RESPONSE_MESSAGE, null)); assertNotNull(resp); @@ -106,7 +106,7 @@ void typedHandle_InternalServerErrorException_500State() { @Test void typedHandle_InternalServerErrorException_responseString() - throws JsonProcessingException { + throws JacksonException { InternalServerErrorException mockInternalServerErrorException = Mockito.mock(InternalServerErrorException.class); Mockito.when(mockInternalServerErrorException.getMessage()).thenReturn(INTERNAL_SERVER_ERROR_MESSAGE); @@ -131,7 +131,7 @@ void typedHandle_InternalServerErrorException_jsonContentTypeHeader() { @Test void typedHandle_NullPointerException_responseObject() - throws JsonProcessingException { + throws JacksonException { AwsProxyResponse resp = exceptionHandler.handle(new NullPointerException()); assertNotNull(resp); @@ -248,7 +248,7 @@ void getErrorJson_ErrorModel_validJson() void getErrorJson_JsonParsinException_validJson() throws IOException { ObjectMapper mockMapper = mock(ObjectMapper.class); - JsonProcessingException exception = mock(JsonProcessingException.class); + JacksonException exception = mock(JacksonException.class); when(mockMapper.writeValueAsString(any(Object.class))).thenThrow(exception); String output = exceptionHandler.getErrorJson(INVALID_RESPONSE_MESSAGE); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java index e4213045..a817bd2b 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java @@ -15,8 +15,8 @@ import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; import com.amazonaws.serverless.proxy.model.*; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.io.IOUtils; import org.apache.hc.core5.http.ContentType; @@ -106,7 +106,7 @@ public AwsProxyRequestBuilder alb() { try { String json = objectMapper.writeValueAsString(this.request); albRequest = objectMapper.readValue(json, AwsProxyRequest.class); - } catch (JsonProcessingException jpe) { + } catch (JacksonException jpe) { throw new RuntimeException(jpe); } @@ -265,7 +265,7 @@ public AwsProxyRequestBuilder body(Object body) { if (request.getMultiValueHeaders() != null && request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)) { try { return body(LambdaContainerHandler.getObjectMapper().writeValueAsString(body)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new UnsupportedOperationException("Could not serialize object: " + e.getMessage()); } } else { @@ -438,7 +438,7 @@ public InputStream buildStream() { try { String requestJson = LambdaContainerHandler.getObjectMapper().writeValueAsString(request); return new ByteArrayInputStream(requestJson.getBytes(StandardCharsets.UTF_8)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return null; } } @@ -448,7 +448,7 @@ public InputStream toHttpApiV2RequestStream() { try { String requestJson = LambdaContainerHandler.getObjectMapper().writeValueAsString(req); return new ByteArrayInputStream(requestJson.getBytes(StandardCharsets.UTF_8)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return null; } } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java index 6d0aa9ee..07bdff97 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/AwsProxyRequestTest.java @@ -7,7 +7,7 @@ import java.io.IOException; import org.junit.jupiter.api.Test; import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; public class AwsProxyRequestTest { private static final String CUSTOM_HEADER_KEY_LOWER_CASE = "custom-header"; diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java index 20ff4dff..e51a1602 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/model/HttpApiV2ProxyRequestTest.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.model; import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -181,7 +181,7 @@ void deserialize_fromJsonString_authorizerPopulatedCorrectly() { assertTrue(req.getRequestContext().getAuthorizer().getJwtAuthorizer().getClaims().containsKey("claim1")); assertEquals(2, req.getRequestContext().getAuthorizer().getJwtAuthorizer().getScopes().size()); assertEquals(RequestSource.API_GATEWAY, req.getRequestSource()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); } @@ -196,7 +196,7 @@ void deserialize_fromJsonString_authorizerEmptyMap() { assertFalse(req.getRequestContext().getAuthorizer().isJwt()); assertFalse(req.getRequestContext().getAuthorizer().isLambda()); assertFalse(req.getRequestContext().getAuthorizer().isIam()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); } @@ -212,7 +212,7 @@ void deserialize_fromJsonString_lambdaAuthorizer() { assertTrue(req.getRequestContext().getAuthorizer().isLambda()); assertEquals(5, req.getRequestContext().getAuthorizer().getLambdaAuthorizerContext().size()); assertEquals(1, req.getRequestContext().getAuthorizer().getLambdaAuthorizerContext().get("numberKey")); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); } @@ -239,7 +239,7 @@ void deserialize_fromJsonString_iamAuthorizer() { req.getRequestContext().getAuthorizer().getIamAuthorizer().getUserArn()); assertEquals("AIDACOSFODNN7EXAMPLE2", req.getRequestContext().getAuthorizer().getIamAuthorizer().getUserId()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); } @@ -254,7 +254,7 @@ void deserialize_fromJsonString_isBase64EncodedPopulates() { req = LambdaContainerHandler.getObjectMapper().readValue(NO_AUTH_PROXY, HttpApiV2ProxyRequest.class); assertTrue(req.isBase64Encoded()); assertEquals(RequestSource.API_GATEWAY, req.getRequestSource()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing request" + e.getMessage()); } @@ -277,7 +277,7 @@ void serialize_toJsonString_authorizerPopulatesCorrectly() { assertTrue(reqString.contains("\"scopes\":[\"first\",\"second\"]")); assertTrue(reqString.contains("\"authorizer\":{\"jwt\":{")); assertTrue(reqString.contains("\"isBase64Encoded\":false")); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while serializing request" + e.getMessage()); } diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 1788a36b..8fcc07c4 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT .. @@ -24,18 +24,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT - - - com.fasterxml.jackson.core - jackson-databind - - + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT tests test-jar test @@ -68,14 +62,6 @@ test - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - true - test - - org.glassfish.jersey.media jersey-media-json-jackson @@ -88,11 +74,11 @@ jackson-annotations - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - com.fasterxml.jackson.core + tools.jackson.core jackson-core diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java index b845a0b6..23f1078f 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java @@ -24,8 +24,8 @@ import com.amazonaws.serverless.proxy.model.AwsProxyResponse; import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.glassfish.jersey.logging.LoggingFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; @@ -303,7 +303,7 @@ void error_statusCode_methodNotAllowed(String reqType) { @MethodSource("data") @ParameterizedTest - void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { + void responseBody_responseWriter_validBody(String reqType) throws JacksonException { initJerseyAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); @@ -460,7 +460,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); assertNotNull(response.getValues().get(key)); assertEquals(value, response.getValues().get(key)); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } @@ -471,7 +471,7 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { SingleValueModel response = objectMapper.readValue(output.getBody(), SingleValueModel.class); assertNotNull(response.getValue()); assertEquals(value, response.getValue()); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } diff --git a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java index 9dc1ab32..5ca09b11 100644 --- a/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java +++ b/aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyParamEncodingTest.java @@ -11,7 +11,8 @@ import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; import org.junit.jupiter.api.Disabled; @@ -281,7 +282,7 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { SingleValueModel response = objectMapper.readValue(output.getBody(), SingleValueModel.class); assertNotNull(response.getValue()); assertEquals(value, response.getValue()); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } @@ -292,7 +293,7 @@ private void validateMapResponseModel(AwsProxyResponse output, String key, Strin MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); assertNotNull(response.getValues().get(key)); assertEquals(value, response.getValues().get(key)); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index f03d9db0..d85534fa 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,18 +6,18 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT .. - 6.2.8 - 6.5.1 + 7.0.0 + 7.0.0 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT tests test-jar test @@ -57,12 +57,7 @@ test - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - test - + jakarta.activation diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java index 9504b616..4b7d3eb8 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/SpringAwsProxyTest.java @@ -15,8 +15,8 @@ import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; import com.amazonaws.serverless.proxy.spring.echoapp.model.SingleValueModel; import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import org.apache.commons.codec.binary.Base64; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; @@ -294,7 +294,7 @@ void error_unauthenticatedCall_filterStepsRequest(String reqType) { @MethodSource("data") @ParameterizedTest - void responseBody_responseWriter_validBody(String reqType) throws JsonProcessingException { + void responseBody_responseWriter_validBody(String reqType) throws JacksonException { initSpringAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(CUSTOM_HEADER_VALUE); @@ -311,7 +311,7 @@ void responseBody_responseWriter_validBody(String reqType) throws JsonProcessing @MethodSource("data") @ParameterizedTest - void responseBody_responseWriter_validBody_UTF(String reqType) throws JsonProcessingException { + void responseBody_responseWriter_validBody_UTF(String reqType) throws JacksonException { initSpringAwsProxyTest(reqType); SingleValueModel singleValueModel = new SingleValueModel(); singleValueModel.setValue(UNICODE_VALUE); @@ -363,7 +363,7 @@ void injectBody_populatedResponse_noException(String reqType) { try { SingleValueModel output = objectMapper.readValue(response.getBody(), SingleValueModel.class); assertEquals("true", output.getValue()); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail(); } @@ -373,7 +373,7 @@ void injectBody_populatedResponse_noException(String reqType) { try { SingleValueModel output = objectMapper.readValue(emptyResp.getBody(), SingleValueModel.class); assertNull(output.getValue()); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail(); } @@ -392,7 +392,7 @@ void servletRequestEncoding_acceptEncoding_okStatusCode(String reqType) { .header(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate") .queryString("status", "200") .body(objectMapper.writeValueAsString(singleValueModel)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { fail("Could not serialize object to JSON"); } @@ -484,7 +484,7 @@ private void validateMapResponseModel(AwsProxyResponse output) { MapResponseModel response = objectMapper.readValue(output.getBody(), MapResponseModel.class); assertNotNull(response.getValues().get(CUSTOM_HEADER_KEY)); assertEquals(CUSTOM_HEADER_VALUE, response.getValues().get(CUSTOM_HEADER_KEY)); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } @@ -495,7 +495,7 @@ private void validateSingleValueModel(AwsProxyResponse output, String value) { SingleValueModel response = objectMapper.readValue(output.getBody(), SingleValueModel.class); assertNotNull(response.getValue()); assertEquals(value, response.getValue()); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Exception while parsing response body: " + e.getMessage()); } diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java index cf4aa495..9b3e0cec 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/echoapp/EchoSpringAppConfig.java @@ -1,7 +1,7 @@ package com.amazonaws.serverless.proxy.spring.echoapp; import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java index 7742db7f..d08a3e45 100644 --- a/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java +++ b/aws-serverless-java-container-spring/src/test/java/com/amazonaws/serverless/proxy/spring/profile/SpringProfileTest.java @@ -8,7 +8,7 @@ import com.amazonaws.serverless.proxy.spring.SpringLambdaContainerHandler; import com.amazonaws.serverless.proxy.spring.echoapp.EchoSpringAppConfig; import com.amazonaws.serverless.proxy.spring.echoapp.model.MapResponseModel; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 5dcac156..3ababeb9 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,8 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.5-SNAPSHOT + 2.1.3 + .. 4.0.0 @@ -12,11 +13,10 @@ AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda - 2.1.5-SNAPSHOT 6.2.8 - 3.4.5 + 3.5.8 6.4.5 @@ -30,16 +30,22 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.3 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.5-SNAPSHOT + 2.1.3 tests test-jar test + + com.github.spotbugs + spotbugs-annotations + 4.9.3 + provided + org.springframework spring-webflux @@ -296,6 +302,9 @@ com.github.spotbugs spotbugs-maven-plugin + + ${project.basedir}/spotbugs-excludeFilter.xml + + + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml new file mode 100644 index 00000000..e12ac19b --- /dev/null +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -0,0 +1,408 @@ + + + + aws-serverless-java-container + com.amazonaws.serverless + 3.0.0-SNAPSHOT + .. + + 4.0.0 + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + AWS Serverless Java container support - SpringBoot 4 implementation + Allows Java applications written for SpringBoot 4 to run in AWS Lambda + https://aws.amazon.com/lambda + + + 7.0.1 + 4.0.0 + 7.0.0 + + + + + + org.springframework + spring-framework-bom + ${spring.version} + pom + import + + + + + + + + org.springframework.cloud + spring-cloud-function-serverless-web + 5.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container-core + 3.0.0-SNAPSHOT + + + com.amazonaws.serverless + aws-serverless-java-container-core + 3.0.0-SNAPSHOT + tests + test-jar + test + + + com.github.spotbugs + spotbugs-annotations + 4.9.3 + provided + + + org.springframework + spring-webflux + ${spring.version} + true + + + org.springframework.boot + spring-boot + ${springboot.version} + true + + + org.springframework + spring-context + + + org.springframework + spring-core + + + + + org.springframework.boot + spring-boot-autoconfigure + ${springboot.version} + true + + + org.springframework.boot + spring-boot-web-server + ${springboot.version} + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + true + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-webmvc + ${springboot.version} + + + org.springframework + spring-core + ${spring.version} + true + + + org.springframework + spring-context + ${spring.version} + true + + + org.springframework + spring-webmvc + ${spring.version} + true + + + org.springframework + spring-aop + + + org.springframework + spring-expression + + + + + + org.springframework.security + spring-security-config + ${springsecurity.version} + + + org.springframework + spring-context + + + org.springframework + spring-beans + + + org.springframework + spring-core + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + test + + + org.springframework.security + spring-security-web + ${springsecurity.version} + + + org.springframework + spring-core + + + org.springframework + spring-web + + + org.springframework + spring-beans + + + org.springframework + spring-context + + + org.springframework + spring-expression + + + org.springframework + spring-aop + + + test + + + org.hibernate.validator + hibernate-validator + 9.1.0.Final + test + + + + org.junit.jupiter + junit-jupiter + test + + + + jakarta.validation + jakarta.validation-api + 3.1.1 + test + + + + jakarta.websocket + jakarta.websocket-api + 2.2.0 + test + + + + jakarta.websocket + jakarta.websocket-client-api + 2.2.0 + test + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${springboot.version} + test + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-webmvc + + + org.springframework.boot + spring-boot-starter-logging + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.apache.tomcat.embed + tomcat-embed-core + + + org.apache.tomcat.embed + tomcat-embed-websocket + + + + + com.h2database + h2 + 2.3.232 + test + + + org.springframework.boot + spring-boot-starter-webflux + ${springboot.version} + true + + + org.glassfish.expressly + expressly + 6.0.0 + test + + + + + + + + + org.jacoco + jacoco-maven-plugin + + ${basedir}/target/coverage-reports/jacoco-unit.exec + ${basedir}/target/coverage-reports/jacoco-unit.exec + + + com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop* + com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor* + + + + + default-prepare-agent + + prepare-agent + + + + jacoco-site + package + + report + + + + jacoco-check + test + + check + + + true + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.minCoverage} + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + com.github.spotbugs + spotbugs-maven-plugin + + ${project.basedir}/spotbugs-excludeFilter.xml + + + + + analyze-compile + compile + + check + + + + + + org.owasp + dependency-check-maven + ${dependencyCheck.version} + + true + + ${project.basedir}/../owasp-suppression.xml + + 7 + false + + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + diff --git a/aws-serverless-java-container-springboot4/spotbugs-excludeFilter.xml b/aws-serverless-java-container-springboot4/spotbugs-excludeFilter.xml new file mode 100644 index 00000000..b26b1ad2 --- /dev/null +++ b/aws-serverless-java-container-springboot4/spotbugs-excludeFilter.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java new file mode 100644 index 00000000..0a461aa9 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java @@ -0,0 +1,97 @@ +/* + * Copyright 2024-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.model.*; +import org.springframework.aot.generate.GenerationContext; +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution; +import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor; +import org.springframework.beans.factory.aot.BeanFactoryInitializationCode; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import tools.jackson.core.JsonToken; + +/** + * AOT Initialization processor required to register reflective hints for GraalVM. + * This is necessary to ensure proper JSON serialization/deserialization. + * It is registered with META-INF/spring/aot.factories + * + * @author Oleg Zhurakousky + */ +public class AwsSpringAotTypesProcessor implements BeanFactoryInitializationAotProcessor { + + @Override + public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { + return new ReflectiveProcessorBeanFactoryInitializationAotContribution(); + } + + private static final class ReflectiveProcessorBeanFactoryInitializationAotContribution implements BeanFactoryInitializationAotContribution { + @Override + public void applyTo(GenerationContext generationContext, BeanFactoryInitializationCode beanFactoryInitializationCode) { + RuntimeHints runtimeHints = generationContext.getRuntimeHints(); + // known static types + + runtimeHints.reflection().registerType(AwsProxyRequest.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(AwsProxyResponse.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(SingleValueHeaders.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(JsonToken.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(MultiValuedTreeMap.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(Headers.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(AwsProxyRequestContext.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(ApiGatewayRequestIdentity.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); + runtimeHints.reflection().registerType(AwsHttpServletResponse.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2ProxyRequest.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2HttpContext.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2ProxyRequestContext.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.HttpApiV2AuthorizerDeserializer.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.HttpApiV2AuthorizerSerializer.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2IamAuthorizer.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + runtimeHints.reflection().registerType(HttpApiV2JwtAuthorizer.class, + MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); + } + + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java new file mode 100644 index 00000000..15984bc4 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -0,0 +1,224 @@ +package com.amazonaws.serverless.proxy.spring; + +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import com.amazonaws.serverless.proxy.internal.HttpUtils; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.model.RequestSource; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.function.serverless.web.ServerlessHttpServletRequest; +import org.springframework.cloud.function.serverless.web.ServerlessMVC; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.CollectionUtils; +import org.springframework.util.FileCopyUtils; +import org.springframework.util.MultiValueMapAdapter; +import org.springframework.util.StringUtils; + +import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.services.lambda.runtime.Context; +import tools.jackson.databind.ObjectMapper; + +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; + +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.decodeValueIfEncoded; +import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getQueryParamValuesAsList; + +class AwsSpringHttpProcessingUtils { + + private static Log logger = LogFactory.getLog(AwsSpringHttpProcessingUtils.class); + private static final int LAMBDA_MAX_REQUEST_DURATION_MINUTES = 15; + + private AwsSpringHttpProcessingUtils() { + + } + + public static AwsProxyResponse processRequest(HttpServletRequest request, ServerlessMVC mvc, + AwsProxyHttpServletResponseWriter responseWriter) { + CountDownLatch latch = new CountDownLatch(1); + AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch); + try { + mvc.service(request, response); + boolean requestTimedOut = !latch.await(LAMBDA_MAX_REQUEST_DURATION_MINUTES, TimeUnit.MINUTES); // timeout is potentially lower as user configures it + if (requestTimedOut) { + logger.warn("request timed out after " + LAMBDA_MAX_REQUEST_DURATION_MINUTES + " minutes"); + } + AwsProxyResponse awsResponse = responseWriter.writeResponse(response, null); + return awsResponse; + } + catch (Exception e) { + e.printStackTrace(); + throw new IllegalStateException(e); + } + } + + public static String extractVersion() { + try { + String path = AwsSpringHttpProcessingUtils.class.getProtectionDomain().getCodeSource().getLocation().toString(); + int endIndex = path.lastIndexOf('.'); + if (endIndex < 0) { + return "UNKNOWN-VERSION"; + } + int startIndex = path.lastIndexOf("/") + 1; + return path.substring(startIndex, endIndex).replace("spring-cloud-function-serverless-web-", ""); + } + catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Failed to detect version", e); + } + return "UNKNOWN-VERSION"; + } + + } + + public static HttpServletRequest generateHttpServletRequest(InputStream jsonRequest, Context lambdaContext, + ServletContext servletContext, ObjectMapper mapper) { + try { + String text = new String(FileCopyUtils.copyToByteArray(jsonRequest), StandardCharsets.UTF_8); + if (logger.isDebugEnabled()) { + logger.debug("Creating HttpServletRequest from: " + text); + } + return generateHttpServletRequest(text, lambdaContext, servletContext, mapper); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static HttpServletRequest generateHttpServletRequest(String jsonRequest, Context lambdaContext, + ServletContext servletContext, ObjectMapper mapper) { + Map _request = readValue(jsonRequest, Map.class, mapper); + SecurityContextWriter securityWriter = "2.0".equals(_request.get("version")) + ? new AwsHttpApiV2SecurityContextWriter() + : new AwsProxySecurityContextWriter(); + HttpServletRequest httpServletRequest = "2.0".equals(_request.get("version")) + ? AwsSpringHttpProcessingUtils.generateRequest2(jsonRequest, lambdaContext, securityWriter, mapper, servletContext) + : AwsSpringHttpProcessingUtils.generateRequest1(jsonRequest, lambdaContext, securityWriter, mapper, servletContext); + return httpServletRequest; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static HttpServletRequest generateRequest1(String request, Context lambdaContext, + SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { + AwsProxyRequest v1Request = readValue(request, AwsProxyRequest.class, mapper); + + // Use AWS container's servlet request instead of Spring Cloud Function's + AwsProxyHttpServletRequest httpServletRequest = new AwsProxyHttpServletRequest(v1Request, lambdaContext, securityWriter.writeSecurityContext(v1Request, lambdaContext)); + httpServletRequest.setServletContext(servletContext); + return httpServletRequest; + } + + + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static HttpServletRequest generateRequest2(String request, Context lambdaContext, + SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { + HttpApiV2ProxyRequest v2Request = readValue(request, HttpApiV2ProxyRequest.class, mapper); + + + ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, + v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); + populateQueryStringParametersV2(v2Request.getQueryStringParameters(), httpRequest); + + v2Request.getHeaders().forEach(httpRequest::setHeader); + + populateContentAndContentType( + v2Request.getBody(), + v2Request.getHeaders().get(HttpHeaders.CONTENT_TYPE), + v2Request.isBase64Encoded(), + httpRequest + ); + + httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); + httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); + httpRequest.setAttribute(RequestReader.HTTP_API_EVENT_PROPERTY, v2Request); + httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); + httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, + securityWriter.writeSecurityContext(v2Request, lambdaContext)); + return httpRequest; + } + + private static void populateQueryStringParametersV2(Map requestParameters, ServerlessHttpServletRequest httpRequest) { + if (!CollectionUtils.isEmpty(requestParameters)) { + for (Entry entry : requestParameters.entrySet()) { + // fix according to parseRawQueryString + httpRequest.setParameter(entry.getKey(), entry.getValue()); + } + } + } + + private static void populateQueryStringParametersV1(AwsProxyRequest v1Request, ServerlessHttpServletRequest httpRequest) { + Map requestParameters = v1Request.getQueryStringParameters(); + if (!CollectionUtils.isEmpty(requestParameters)) { + // decode all keys and values in map + for (Entry entry : requestParameters.entrySet()) { + String k = v1Request.getRequestSource() == RequestSource.ALB ? decodeValueIfEncoded(entry.getKey()) : entry.getKey(); + String v = v1Request.getRequestSource() == RequestSource.ALB ? decodeValueIfEncoded(entry.getValue()) : entry.getValue(); + httpRequest.setParameter(k, v); + } + } + } + + private static void populateMultiValueQueryStringParametersV1(AwsProxyRequest v1Request, ServerlessHttpServletRequest httpRequest) { + if (v1Request.getMultiValueQueryStringParameters() != null) { + MultiValueMapAdapter queryStringParameters = new MultiValueMapAdapter<>(v1Request.getMultiValueQueryStringParameters()); + queryStringParameters.forEach((k, v) -> { + String key = v1Request.getRequestSource() == RequestSource.ALB + ? decodeValueIfEncoded(k) + : k; + List value = v1Request.getRequestSource() == RequestSource.ALB + ? getQueryParamValuesAsList(v1Request.getMultiValueQueryStringParameters(), k, false).stream() + .map(AwsHttpServletRequest::decodeValueIfEncoded) + .toList() + : v; + httpRequest.setParameter(key, value.toArray(new String[0])); + }); + } + } + + private static T readValue(String json, Class clazz, ObjectMapper mapper) { + try { + return mapper.readValue(json, clazz); + } + catch (Exception e) { + throw new IllegalStateException(e); + } + } + + private static void populateContentAndContentType( + String body, + String contentType, + boolean base64Encoded, + ServerlessHttpServletRequest httpRequest) { + if (StringUtils.hasText(body)) { + httpRequest.setContentType(contentType == null ? MediaType.APPLICATION_JSON_VALUE : contentType); + if (base64Encoded) { + httpRequest.setContent(Base64.getMimeDecoder().decode(body)); + } else { + Charset charseEncoding = HttpUtils.parseCharacterEncoding(contentType,StandardCharsets.UTF_8); + httpRequest.setContent(body.getBytes(charseEncoding)); + } + } + } + + + +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java new file mode 100644 index 00000000..97041824 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -0,0 +1,187 @@ +/* + * Copyright 2024-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.amazonaws.serverless.proxy.spring; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URI; +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext; +import org.springframework.cloud.function.serverless.web.ServerlessMVC; +import org.springframework.context.SmartLifecycle; +import org.springframework.core.env.Environment; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import jakarta.servlet.http.HttpServletRequest; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.json.JsonMapper; + +/** + * Event loop and necessary configurations to support AWS Lambda Custom Runtime + * - https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html. + * + * @author Oleg Zhurakousky + * @author Mark Sailes + * + */ +public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle { + + private static Log logger = LogFactory.getLog(AwsSpringWebCustomRuntimeEventLoop.class); + + static final String LAMBDA_VERSION_DATE = "2018-06-01"; + private static final String LAMBDA_ERROR_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/error"; + private static final String LAMBDA_RUNTIME_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/next"; + private static final String LAMBDA_INVOCATION_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/response"; + private static final String USER_AGENT_VALUE = String.format("spring-cloud-function/%s-%s", + System.getProperty("java.runtime.version"), AwsSpringHttpProcessingUtils.extractVersion()); + + private final ServletWebServerApplicationContext applicationContext; + + private volatile boolean running; + + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + + public AwsSpringWebCustomRuntimeEventLoop(ServletWebServerApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + public void run() { + this.running = true; + this.executor.execute(() -> { + eventLoop(this.applicationContext); + }); + } + + @Override + public void start() { + this.run(); + } + + @Override + public void stop() { + this.executor.shutdownNow(); + this.running = false; + } + + @Override + public boolean isRunning() { + return this.running; + } + + private void eventLoop(ServletWebServerApplicationContext context) { + ServerlessMVC mvc = ServerlessMVC.INSTANCE(context); + + Environment environment = context.getEnvironment(); + logger.info("Starting AWSWebRuntimeEventLoop"); + + String runtimeApi = environment.getProperty("AWS_LAMBDA_RUNTIME_API"); + String eventUri = MessageFormat.format(LAMBDA_RUNTIME_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE); + if (logger.isDebugEnabled()) { + logger.debug("Event URI: " + eventUri); + } + + RequestEntity requestEntity = RequestEntity.get(URI.create(eventUri)) + .header("User-Agent", USER_AGENT_VALUE).build(); + RestTemplate rest = new RestTemplate(); + ObjectMapper mapper = JsonMapper.builder() + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) + .build(); + AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); + + logger.info("Entering event loop"); + while (this.isRunning()) { + logger.debug("Attempting to get new event"); + ResponseEntity incomingEvent = rest.exchange(requestEntity, String.class); + + if (incomingEvent != null && incomingEvent.hasBody()) { + if (logger.isDebugEnabled()) { + logger.debug("New Event received from AWS Gateway: " + incomingEvent.getBody()); + } + String requestId = incomingEvent.getHeaders().getFirst("Lambda-Runtime-Aws-Request-Id"); + + try { + logger.debug("Submitting request to the user's web application"); + + HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils.generateHttpServletRequest( + incomingEvent.getBody(), null, mvc.getServletContext(), mapper); + httpServletRequest.startAsync(); + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( + httpServletRequest, mvc, responseWriter); + if (logger.isDebugEnabled()) { + logger.debug("Received response - body: " + awsResponse.getBody() + + "; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders()); + } + + String invocationUrl = MessageFormat.format(LAMBDA_INVOCATION_URL_TEMPLATE, runtimeApi, + LAMBDA_VERSION_DATE, requestId); + + ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(invocationUrl)) + .header("User-Agent", USER_AGENT_VALUE).body(awsResponse), byte[].class); + if (logger.isDebugEnabled()) { + logger.debug("Response sent: body: " + result.getBody() + + "; status: " + result.getStatusCode() + "; headers: " + result.getHeaders()); + } + if (logger.isInfoEnabled()) { + logger.info("Result POST status: " + result); + } + } + catch (Exception e) { + logger.error(e); + this.propagateAwsError(requestId, e, mapper, runtimeApi, rest); + } + } + } + } + + private void propagateAwsError(String requestId, Exception e, ObjectMapper mapper, String runtimeApi, RestTemplate rest) { + String errorMessage = e.getMessage(); + String errorType = e.getClass().getSimpleName(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + String stackTrace = sw.toString(); + Map em = new HashMap<>(); + em.put("errorMessage", errorMessage); + em.put("errorType", errorType); + em.put("stackTrace", stackTrace); + try { + byte[] outputBody = mapper.writeValueAsBytes(em); + String errorUrl = MessageFormat.format(LAMBDA_ERROR_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE, requestId); + ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(errorUrl)) + .header("User-Agent", USER_AGENT_VALUE) + .body(outputBody), Object.class); + if (logger.isInfoEnabled()) { + logger.info("Result ERROR status: " + result.getStatusCode()); + } + } + catch (Exception e2) { + throw new IllegalArgumentException("Failed to report error", e2); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java new file mode 100644 index 00000000..9324ebdf --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java @@ -0,0 +1,66 @@ +/* + * Copyright 2024-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.amazonaws.serverless.proxy.spring; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.SmartLifecycle; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +/** + * Initializer to optionally start Custom Runtime to process web workloads. + * Registered with META-INF/spring.factories + * + * @author Dave Syer + * @author Oleg Zhurakousky + */ +public class AwsSpringWebRuntimeInitializer implements ApplicationContextInitializer { + + private static Log logger = LogFactory.getLog(AwsSpringWebRuntimeInitializer.class); + + @Override + public void initialize(GenericApplicationContext context) { + Environment environment = context.getEnvironment(); + + if (context instanceof ServletWebServerApplicationContext && isCustomRuntime(environment)) { + if (context.getBeanFactory().getBeanNamesForType(AwsSpringWebCustomRuntimeEventLoop.class, false, false).length == 0) { + context.registerBean(StringUtils.uncapitalize(AwsSpringWebCustomRuntimeEventLoop.class.getSimpleName()), + SmartLifecycle.class, () -> new AwsSpringWebCustomRuntimeEventLoop((ServletWebServerApplicationContext) context)); + } + } + } + + private boolean isCustomRuntime(Environment environment) { + String handler = environment.getProperty("_HANDLER"); + if (StringUtils.hasText(handler)) { + handler = handler.split(":")[0]; + logger.info("AWS Handler: " + handler); + try { + Thread.currentThread().getContextClassLoader().loadClass(handler); + } + catch (Exception e) { + logger.debug("Will execute Lambda in Custom Runtime"); + return true; + } + } + return false; + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java new file mode 100644 index 00000000..127ef668 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java @@ -0,0 +1,27 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.web.ErrorResponse; + +/** + * This ExceptionHandler implementation enhances the standard AwsProxyExceptionHandler + * by mapping additional details from org.springframework.web.ErrorResponse + * + * As of now this class is identical with SpringAwsProxyExceptionHandler. We may consider + * moving it to a common module to share it in the future. + */ +public class SpringBootAwsProxyExceptionHandler extends AwsProxyExceptionHandler + implements ExceptionHandler { + @Override + public AwsProxyResponse handle(Throwable ex) { + if (ex instanceof ErrorResponse) { + return new AwsProxyResponse(((ErrorResponse) ex).getStatusCode().value(), + HEADERS, getErrorJson(ex.getMessage())); + } else { + return super.handle(ex); + } + } + +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java new file mode 100644 index 00000000..34dae152 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java @@ -0,0 +1,230 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring; + +import java.util.concurrent.CountDownLatch; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.server.servlet.context.AnnotationConfigServletWebServerApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.ResponseWriter; +import com.amazonaws.serverless.proxy.SecurityContextWriter; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; +import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; +import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; +import com.amazonaws.services.lambda.runtime.Context; + +import jakarta.servlet.Servlet; +import jakarta.servlet.http.HttpServletRequest; + +/** + * SpringBoot implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` + * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and + * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. + * + * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). + * + * @param The incoming event type + * @param The expected return type + */ +public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { + private static final String DISPATCHER_SERVLET_REGISTRATION_NAME = "dispatcherServlet"; + + private final Class springBootInitializer; + private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); + private String[] springProfiles = null; + private WebApplicationType springWebApplicationType; + private ConfigurableApplicationContext applicationContext; + + private static SpringBootLambdaContainerHandler instance; + + // State vars + private boolean initialized; + + /** + * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. + * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() + * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it + * for our mock {@link ServerlessReactiveServletEmbeddedServerFactory}. + * + * @return The initialized instance + */ + public static SpringBootLambdaContainerHandler getInstance() { + return instance; + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @param profiles A list of Spring profiles to activate + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework + */ + public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + return new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); + } + + /** + * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `HttpApiV2ProxyRequest` objects and the given Spring profiles + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @param profiles A list of Spring profiles to activate + * @return An initialized instance of the `SpringLambdaContainerHandler` + * @throws ContainerInitializationException If an error occurs while initializing the Spring framework + */ + public static SpringBootLambdaContainerHandler getHttpApiV2ProxyHandler(Class springBootInitializer, String... profiles) + throws ContainerInitializationException { + return new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(springBootInitializer) + .profiles(profiles) + .buildAndInitialize(); + } + + /** + * Creates a new container handler with the given reader and writer objects + * + * @param requestTypeClass The class for the incoming Lambda event + * @param responseTypeClass The class for the Lambda function output + * @param requestReader An implementation of `RequestReader` + * @param responseWriter An implementation of `ResponseWriter` + * @param securityContextWriter An implementation of `SecurityContextWriter` + * @param exceptionHandler An implementation of `ExceptionHandler` + * @param springBootInitializer {@code SpringBootServletInitializer} class + * @param init The initialization Wrapper that will be used to start Spring Boot + * @param applicationType The Spring Web Application Type + */ + public SpringBootLambdaContainerHandler(Class requestTypeClass, + Class responseTypeClass, + RequestReader requestReader, + ResponseWriter responseWriter, + SecurityContextWriter securityContextWriter, + ExceptionHandler exceptionHandler, + Class springBootInitializer, + InitializationWrapper init, + WebApplicationType applicationType) { + super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); + Timer.start("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); + initialized = false; + this.springBootInitializer = springBootInitializer; + springWebApplicationType = applicationType; + setInitializationWrapper(init); + SpringBootLambdaContainerHandler.setInstance(this); + + Timer.stop("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); + } + + // this is not pretty. However, because SpringBoot wants to control all of the initialization + // we need to access this handler as a singleton from the EmbeddedContainer to set the servlet + // context and from the ServletConfigurationSupport implementation + private static void setInstance(SpringBootLambdaContainerHandler h) { + SpringBootLambdaContainerHandler.instance = h; + } + + public void activateSpringProfiles(String... profiles) { + springProfiles = profiles; + // force a re-initialization + initialized = false; + } + + @Override + protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { + return new AwsHttpServletResponse(request, latch); + } + + @Override + protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { + // this method of the AwsLambdaServletContainerHandler sets the servlet context + Timer.start("SPRINGBOOT2_HANDLE_REQUEST"); + + // wire up the application context on the first invocation + if (!initialized) { + initialize(); + } + + // process filters & invoke servlet + Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); + if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { + ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); + ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); + } + doFilter(containerRequest, containerResponse, reqServlet); + Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); + } + + + @Override + public void initialize() + throws ContainerInitializationException { + Timer.start("SPRINGBOOT2_COLD_START"); + + SpringApplicationBuilder builder = new SpringApplicationBuilder(getEmbeddedContainerClasses()) + .web(springWebApplicationType); // .REACTIVE, .SERVLET + if (springProfiles != null) { + builder.profiles(springProfiles); + } + applicationContext = builder.run(); + if (springWebApplicationType == WebApplicationType.SERVLET) { + ((AnnotationConfigServletWebServerApplicationContext)applicationContext).setServletContext(getServletContext()); + AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); + if (reg != null) { + reg.setLoadOnStartup(1); + } + } + super.initialize(); + initialized = true; + Timer.stop("SPRINGBOOT2_COLD_START"); + } + + private Class[] getEmbeddedContainerClasses() { + Class[] classes = new Class[2]; + if (springWebApplicationType == WebApplicationType.REACTIVE) { + try { + // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. + this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); + log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); + classes[0] = ServerlessReactiveServletEmbeddedServerFactory.class; + } catch (ClassNotFoundException e) { + springWebApplicationType = WebApplicationType.SERVLET; + classes[0] = ServerlessServletEmbeddedServerFactory.class; + } + } else { + classes[0] = ServerlessServletEmbeddedServerFactory.class; + } + + classes[1] = springBootInitializer; + return classes; + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java new file mode 100644 index 00000000..e7ad017f --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java @@ -0,0 +1,88 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.ExceptionHandler; +import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.boot.WebApplicationType; + +import jakarta.servlet.http.HttpServletRequest; + +public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< + RequestType, + AwsProxyResponse, + HttpServletRequest, + SpringBootLambdaContainerHandler, + SpringBootProxyHandlerBuilder> { + private Class springBootInitializer; + private String[] profiles; + private WebApplicationType applicationType = WebApplicationType.REACTIVE; + + @Override + protected SpringBootProxyHandlerBuilder self() { + return this; + } + + + public SpringBootProxyHandlerBuilder springBootApplication(Class app) { + springBootInitializer = app; + return self(); + } + + public SpringBootProxyHandlerBuilder profiles(String... profiles) { + this.profiles = profiles; + return self(); + } + + public SpringBootProxyHandlerBuilder servletApplication() { + this.applicationType = WebApplicationType.SERVLET; + return self(); + } + + @Override + public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { + validate(); + if (springBootInitializer == null) { + throw new ContainerInitializationException("Missing spring boot application class in builder", null); + } + SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( + requestTypeClass, + responseTypeClass, + requestReader, + responseWriter, + securityContextWriter, + exceptionHandler, + springBootInitializer, + initializationWrapper, + applicationType + ); + if (profiles != null) { + handler.activateSpringProfiles(profiles); + } + return handler; + } + + @Override + public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { + SpringBootLambdaContainerHandler handler = build(); + initializationWrapper.start(handler); + return handler; + } + + @Override + protected ExceptionHandler defaultExceptionHandler() { + return new SpringBootAwsProxyExceptionHandler(); + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java new file mode 100644 index 00000000..5af476d7 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -0,0 +1,104 @@ +package com.amazonaws.serverless.proxy.spring; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AsyncInitializationWrapper; +import com.amazonaws.serverless.proxy.InitializationTypeHelper; +import com.amazonaws.serverless.proxy.internal.InitializableLambdaContainerHandler; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import org.springframework.cloud.function.serverless.web.FunctionClassUtils; +import org.springframework.cloud.function.serverless.web.ServerlessMVC; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import tools.jackson.databind.ObjectMapper; + +import jakarta.servlet.http.HttpServletRequest; + +/* + * Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +/** + * An implementation of {@link RequestStreamHandler} which delegates to + * Spring Cloud Function serverless web module managed by Spring team. + * + * It requires no sub-classing from the user other then being identified as "Handler". + * The configuration class(es) should be provided via MAIN_CLASS environment variable. + * + */ +public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { + private final SpringDelegatingInitHandler initHandler; + private final ObjectMapper mapper; + private final AwsProxyHttpServletResponseWriter responseWriter; + private final AsyncInitializationWrapper asyncInitWrapper; + + public SpringDelegatingLambdaContainerHandler() throws ContainerInitializationException { + this(new Class[] {FunctionClassUtils.getStartClass()}); + } + + public SpringDelegatingLambdaContainerHandler(final Class... startupClasses) throws ContainerInitializationException { + this.initHandler = new SpringDelegatingInitHandler(startupClasses); + if (InitializationTypeHelper.isAsyncInitializationDisabled()) { + initHandler.initialize(); + this.asyncInitWrapper = null; + } else { + this.asyncInitWrapper = new AsyncInitializationWrapper(); + asyncInitWrapper.start(initHandler); + } + this.mapper = new ObjectMapper(); + this.responseWriter = new AwsProxyHttpServletResponseWriter(); + } + + @Override + public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { + // Wait for async initialization to complete if needed to avoid race condition + if (asyncInitWrapper != null) { + try { + asyncInitWrapper.getInitializationLatch().await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IOException("Initialization interrupted", e); + } + } + + ServerlessMVC mvc = initHandler.getMvc(); + HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils + .generateHttpServletRequest(input, lambdaContext, mvc.getServletContext(), this.mapper); + httpServletRequest.startAsync(); + AwsProxyResponse awsProxyResponse = AwsSpringHttpProcessingUtils.processRequest(httpServletRequest, mvc, responseWriter); + this.mapper.writeValue(output, awsProxyResponse); + } + + private static final class SpringDelegatingInitHandler implements InitializableLambdaContainerHandler { + private ServerlessMVC mvc; + private final Class[] startupClasses; + + public SpringDelegatingInitHandler(final Class... startupClasses) { + this.startupClasses = startupClasses; + } + + @Override + public void initialize() throws ContainerInitializationException { + this.mvc = ServerlessMVC.INSTANCE(this.startupClasses); + this.mvc.waitForContext(); + } + + public ServerlessMVC getMvc() { + return this.mvc; + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java new file mode 100644 index 00000000..917523a3 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java @@ -0,0 +1,105 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.web.server.reactive.AbstractReactiveWebServerFactory; +import org.springframework.boot.web.server.WebServer; +import org.springframework.boot.web.server.WebServerException; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.HttpHandler; +import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; + +import jakarta.servlet.*; +import java.io.IOException; +import java.util.Enumeration; + +@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) +public class ServerlessReactiveServletEmbeddedServerFactory extends AbstractReactiveWebServerFactory implements WebServer, Servlet { + private ServletHttpHandlerAdapter handler; + private ServletConfig config; + static final String SERVLET_NAME = "com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory"; + static final String SERVLET_INFO = "ServerlessReactiveEmbeddedServerFactory"; + + @Override + @SuppressFBWarnings("MTIA_SUSPECT_SERVLET_INSTANCE_FIELD") + public WebServer getWebServer(HttpHandler httpHandler) { + handler = new ServletHttpHandlerAdapter(httpHandler); + return this; + } + + @Override + public void start() throws WebServerException { + // register this object as the main handler servlet with a mapping of / + SpringBootLambdaContainerHandler + .getInstance() + .getServletContext() + .addServlet(SERVLET_NAME, this) + .addMapping("/"); + handler.init(new ServletAdapterConfig()); + } + + @Override + public void stop() throws WebServerException { + // nothing to do here. + } + + @Override + public void init(ServletConfig servletConfig) throws ServletException { + config = servletConfig; + } + + @Override + public ServletConfig getServletConfig() { + return config; + } + + @Override + public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { + handler.service(servletRequest, servletResponse); + } + + @Override + public String getServletInfo() { + return SERVLET_INFO; + } + + @Override + public void destroy() { + + } + + private static class ServletAdapterConfig implements ServletConfig { + @Override + public String getServletName() { + return SERVLET_NAME; + } + + @Override + public ServletContext getServletContext() { + return SpringBootLambdaContainerHandler.getInstance().getServletContext(); + } + + @Override + public String getInitParameter(String s) { + return null; + } + + @Override + public Enumeration getInitParameterNames() { + return null; + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java new file mode 100644 index 00000000..7278ba44 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java @@ -0,0 +1,65 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.web.server.WebServer; +import org.springframework.boot.web.server.WebServerException; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.boot.web.server.servlet.ServletWebServerFactory; +import org.springframework.core.Ordered; + +import jakarta.servlet.ServletException; + +@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) +public class ServerlessServletEmbeddedServerFactory implements ServletWebServerFactory, WebServer { + @SuppressWarnings("rawtypes") + private AwsLambdaServletContainerHandler handler; + + public ServerlessServletEmbeddedServerFactory() { + super(); + handler = SpringBootLambdaContainerHandler.getInstance(); + } + + @Override + public WebServer getWebServer(ServletContextInitializer... initializers) { + for (ServletContextInitializer i : initializers) { + try { + if (handler.getServletContext() == null) { + throw new WebServerException("Attempting to initialize ServletEmbeddedWebServer without ServletContext in Handler", null); + } + i.onStartup(handler.getServletContext()); + } catch (ServletException e) { + throw new WebServerException("Could not initialize Servlets", e); + } + } + return this; + } + + @Override + public void start() throws WebServerException { + + } + + @Override + public void stop() throws WebServerException { + + } + + @Override + public int getPort() { + return 0; + } +} diff --git a/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring.factories b/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..cd5c2e70 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.context.ApplicationContextInitializer=\ +com.amazonaws.serverless.proxy.spring.AwsSpringWebRuntimeInitializer diff --git a/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring/aot.factories b/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring/aot.factories new file mode 100644 index 00000000..44acc0d8 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/main/resources/META-INF/spring/aot.factories @@ -0,0 +1 @@ +org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=com.amazonaws.serverless.proxy.spring.AwsSpringAotTypesProcessor \ No newline at end of file diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java new file mode 100644 index 00000000..9903e8f8 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java @@ -0,0 +1,39 @@ +package com.amazonaws.serverless.proxy.spring; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.ConfigurableApplicationContext; + +public class AWSWebRuntimeTests { + + @AfterEach + public void after() { + System.clearProperty("_HANDLER"); + } + + @Test + public void testWebRuntimeInitialization() throws Exception { + try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { + assertFalse(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); + } + System.setProperty("_HANDLER", "foo"); + AwsSpringWebCustomRuntimeEventLoop loop = null; + try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { + Thread.sleep(100); + assertTrue(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); + loop = context.getBean(AwsSpringWebCustomRuntimeEventLoop.class); + assertTrue(loop.isRunning()); + } + assertFalse(loop.isRunning()); + } + + @EnableAutoConfiguration + private static class EmptyApplication { + + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java new file mode 100644 index 00000000..b0271b7b --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -0,0 +1,278 @@ +package com.amazonaws.serverless.proxy.spring; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collection; + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AlbContext; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext; +import org.springframework.cloud.function.serverless.web.ServerlessMVC; +import org.springframework.cloud.function.serverless.web.ServerlessServletContext; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import tools.jackson.databind.ObjectMapper; + +import jakarta.servlet.http.HttpServletRequest; + +import static org.junit.jupiter.api.Assertions.*; + +public class AwsSpringHttpProcessingUtilsTests { + + private static String API_GATEWAY_EVENT = "{\n" + + " \"version\": \"1.0\",\n" + + " \"resource\": \"$default\",\n" + + " \"path\": \"/async\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"headers\": {\n" + + " \"Content-Length\": \"45\",\n" + + " \"Content-Type\": \"application/json\",\n" + + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"User-Agent\": \"curl/7.79.1\",\n" + + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" + + " \"X-Forwarded-For\": \"109.210.252.44\",\n" + + " \"X-Forwarded-Port\": \"443\",\n" + + " \"X-Forwarded-Proto\": \"https\",\n" + + " \"accept\": \"*/*\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Content-Length\": [\n" + + " \"45\"\n" + + " ],\n" + + " \"Content-Type\": [\n" + + " \"application/json\"\n" + + " ],\n" + + " \"Host\": [\n" + + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"curl/7.79.1\"\n" + + " ],\n" + + " \"X-Amzn-Trace-Id\": [\n" + + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" + + " ],\n" + + " \"X-Forwarded-For\": [\n" + + " \"109.210.252.44\"\n" + + " ],\n" + + " \"X-Forwarded-Port\": [\n" + + " \"443\"\n" + + " ],\n" + + " \"X-Forwarded-Proto\": [\n" + + " \"https\"\n" + + " ],\n" + + " \"accept\": [\n" + + " \"*/*\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"abc\": \"xyz\",\n" + + " \"parameter1\": \"value2\"\n" + + " },\n" + + " \"multiValueQueryStringParameters\": {\n" + + " \"abc\": [\n" + + " \"xyz\"\n" + + " ],\n" + + " \"parameter1\": [\n" + + " \"value1\",\n" + + " \"value2\"\n" + + " ]\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789098\",\n" + + " \"apiId\": \"i76bfhczs0\",\n" + + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"domainPrefix\": \"i76bfhczs0\",\n" + + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"path\": \"/pets\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" + + " \"requestTimeEpoch\": 1678276240455,\n" + + " \"resourceId\": \"$default\",\n" + + " \"resourcePath\": \"$default\",\n" + + " \"stage\": \"$default\"\n" + + " },\n" + + " \"pathParameters\": null,\n" + + " \"stageVariables\": null,\n" + + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" + + " \"isBase64Encoded\": false\n" + + "}"; + + private static String API_GATEWAY_EVENT_V2 = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/async\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + + " \"cookies\": [\n" + + " \"cookie1\",\n" + + " \"cookie2\"\n" + + " ],\n" + + " \"headers\": {\n" + + " \"header1\": \"value1\",\n" + + " \"header2\": \"value1,value2\",\n" + + " \"User-Agent\": \"curl/7.79.1\",\n" + + " \"X-Forwarded-Port\": \"443\"\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"parameter1\": \"value1,value2\",\n" + + " \"parameter2\": \"value\"\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authentication\": {\n" + + " \"clientCert\": {\n" + + " \"clientCertPem\": \"CERT_CONTENT\",\n" + + " \"subjectDN\": \"www.example.com\",\n" + + " \"issuerDN\": \"Example issuer\",\n" + + " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + + " \"validity\": {\n" + + " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + + " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"authorizer\": {\n" + + " \"jwt\": {\n" + + " \"claims\": {\n" + + " \"claim1\": \"value1\",\n" + + " \"claim2\": \"value2\"\n" + + " },\n" + + " \"scopes\": [\n" + + " \"scope1\",\n" + + " \"scope2\"\n" + + " ]\n" + + " }\n" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/async\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"pathParameters\": {\n" + + " \"parameter1\": \"value1\"\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\n" + + " \"stageVariable1\": \"value1\",\n" + + " \"stageVariable2\": \"value2\"\n" + + " }\n" + + "}"; + + private static final String ALB_EVENT = "{\n" + + " \"requestContext\": {\n" + + " \"elb\": {\n" + + " \"targetGroupArn\": \"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09\"\n" + + " }\n" + + " },\n" + + " \"httpMethod\": \"POST\",\n" + + " \"path\": \"/async\",\n" + + " \"multiValueQueryStringParameters\": { \"parameter1\": [\"value1\", \"value2\"], \"parameter2\": [\"1970-01-01T00%3A00%3A00.004Z\"]},\n" + + " \"multiValueHeaders\": {\n" + + " \"accept\": [\"text/html,application/xhtml+xml\"],\n" + + " \"accept-language\": [\"en-US,en;q=0.8\"],\n" + + " \"content-type\": [\"text/plain\"],\n" + + " \"cookie\": [\"cookies\"],\n" + + " \"host\": [\"lambda-846800462-us-east-2.elb.amazonaws.com\"],\n" + + " \"User-Agent\": [\"curl/7.79.1\"],\n" + + " \"x-amzn-trace-id\": [\"Root=1-5bdb40ca-556d8b0c50dc66f0511bf520\"],\n" + + " \"x-forwarded-for\": [\"72.21.198.66\"],\n" + + " \"x-forwarded-port\": [\"443\"],\n" + + " \"x-forwarded-proto\": [\"https\"]\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"body\": \"request_body\"\n" + + "}"; + + private final ObjectMapper mapper = new ObjectMapper(); + + public static Collection data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT}); + } + + @MethodSource("data") + @ParameterizedTest + public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonEvent.getBytes(StandardCharsets.UTF_8)); + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); + assertRequest(request); + } + + private static void assertRequest(HttpServletRequest request) { + assertEquals("curl/7.79.1", request.getHeader("User-Agent")); + assertEquals("443", request.getHeader("X-Forwarded-Port")); + assertEquals("POST", request.getMethod()); + assertEquals("/async", request.getRequestURI()); + assertNotNull(request.getServletContext()); + // parameter handling for 2.0 requests is currently not spec compliant and to be fixed in future version + // see also GitHub issue https://github.com/aws/serverless-java-container/issues/1278 + if (!(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY) instanceof HttpApiV2ProxyRequest)) { + assertEquals("value1", request.getParameter("parameter1")); + assertArrayEquals(new String[]{"value1", "value2"}, request.getParameterValues("parameter1")); + } + if (request.getAttribute(RequestReader.ALB_CONTEXT_PROPERTY) instanceof AlbContext) { + // query params should be decoded + assertEquals("1970-01-01T00:00:00.004Z", request.getParameter("parameter2")); + } + } + + @MethodSource("data") + @ParameterizedTest + public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + // spot check some headers + assertRequest(request); + } + + + @EnableAutoConfiguration + @Configuration + @EnableWebSecurity + public static class EmptyApplication { + @RestController + @EnableWebMvc + public static class MyController { + @PostMapping(path = "/async") + public String async(@RequestBody String body) { + return "hello"; + } + } + + @Bean + SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf((csrf) -> csrf.disable()); + return http.build(); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java new file mode 100644 index 00000000..a111e510 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java @@ -0,0 +1,52 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.jpaapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.jpaapp.MessageController; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.Collection; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class JpaAppTest { + + LambdaHandler handler; + MockLambdaContext lambdaContext = new MockLambdaContext(); + + private String type; + + public static Collection data() { + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); + } + + public void initJpaAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + + @MethodSource("data") + @ParameterizedTest + void asyncRequest(String reqType) { + initJpaAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") + .json() + .body("{\"name\":\"kong\"}"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals("{\"name\":\"KONG\"}", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initJpaAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java new file mode 100644 index 00000000..d0b57950 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java @@ -0,0 +1,39 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.securityapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; +import org.junit.jupiter.api.Test; + +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SecurityAppTest { + + LambdaHandler handler = new LambdaHandler(); + MockLambdaContext lambdaContext = new MockLambdaContext(); + + public SecurityAppTest() { + System.setProperty("logging.level.root", "DEBUG"); + } + + @Test + void helloRequest_withAuth_respondsWithSingleMessage() { + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(401, resp.getStatusCode()); + assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.WWW_AUTHENTICATE)); + req = new AwsProxyRequestBuilder("/hello", "GET") + .basicAuth(SecurityConfig.USERNAME, SecurityConfig.PASSWORD) + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .build(); + resp = handler.handleRequest(req, lambdaContext); + assertEquals(200, resp.getStatusCode()); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java new file mode 100644 index 00000000..3e7cd0cf --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java @@ -0,0 +1,236 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.ContainerConfig; +import com.amazonaws.serverless.proxy.spring.servletapp.*; +import tools.jackson.core.JacksonException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collection; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +public class ServletAppTest { + + LambdaHandler handler; + MockLambdaContext lambdaContext = new MockLambdaContext(); + + private String type; + + public static Collection data() { + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); + } + + public void initServletAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + + @MethodSource("data") + @ParameterizedTest + void asyncRequest(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") + .json() + .body("{\"name\":\"bob\"}"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals("{\"name\":\"BOB\"}", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void validateRequest_invalidData_respondsWith400(String reqType) { + initServletAppTest(reqType); + UserData ud = new UserData(); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/validate", "POST") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .body(ud); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + try { + System.out.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(resp)); + } catch (JacksonException e) { + e.printStackTrace(); + } + assertEquals("3", resp.getBody()); + assertEquals(400, resp.getStatusCode()); + + UserData ud2 = new UserData(); + ud2.setFirstName("Test"); + ud2.setLastName("Test"); + ud2.setEmail("Test"); + req = new AwsProxyRequestBuilder("/validate", "POST") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) + .body(ud2); + resp = handler.handleRequest(req, lambdaContext); + assertEquals("1", resp.getBody()); + assertEquals(400, resp.getStatusCode()); + } + + @MethodSource("data") + @ParameterizedTest + void messageObject_parsesObject_returnsCorrectMessage(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .json() + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void messageObject_propertiesInContentType_returnsCorrectMessage(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") + .header(HttpHeaders.ACCEPT, "application/json;v=1") + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void echoMessage_fileNameLikeParameter_returnsMessage(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/echo/test.test.test", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test.test.test", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void getUtf8String_returnsValidUtf8String(String reqType) { + initServletAppTest(reqType); + // We expect strings to come back as UTF-8 correctly because Spring itself will call the setCharacterEncoding + // method on the response to set it to UTF- + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/utf8", "GET") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("text/plain; charset=UTF-8", resp.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).stream().collect(Collectors.joining(","))); + assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void getUtf8Json_returnsValidUtf8String(String reqType) { + initServletAppTest(reqType); + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void stream_getUtf8String_returnsValidUtf8String(String reqType) throws IOException { + initServletAppTest(reqType); + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); + AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/utf8", "GET") + .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); + InputStream req = null; + switch (type) { + case "ALB": + req = reqBuilder.alb().buildStream(); + break; + case "API_GW": + req = reqBuilder.buildStream(); + break; + case "HTTP_API": + req = reqBuilder.toHttpApiV2RequestStream(); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + streamHandler.handleRequest(req, out, lambdaContext); + AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void stream_getUtf8Json_returnsValidUtf8String(String reqType) throws IOException { + initServletAppTest(reqType); + LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); + LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); + AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); + InputStream req = null; + switch (type) { + case "ALB": + req = reqBuilder.alb().buildStream(); + break; + case "API_GW": + req = reqBuilder.buildStream(); + break; + case "HTTP_API": + req = reqBuilder.toHttpApiV2RequestStream(); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + streamHandler.handleRequest(req, out, lambdaContext); + AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void springExceptionMapping_throw404Ex_expectMappedTo404(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/ex/customstatus", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(404, resp.getStatusCode()); + } + + @MethodSource("data") + @ParameterizedTest + void echoMessage_populatesSingleValueHeadersForHttpApiV2(String reqType) { + initServletAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") + .header(HttpHeaders.ACCEPT, "application/json;v=1") + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + if ("HTTP_API".equals(type)) { + assertNotNull(resp.getHeaders()); + } else { + assertNull(resp.getHeaders()); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java new file mode 100644 index 00000000..f5e83e85 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java @@ -0,0 +1,32 @@ +package com.amazonaws.serverless.proxy.spring; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.slowapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.slowapp.MessageController; +import com.amazonaws.serverless.proxy.spring.slowapp.SlowTestApplication; +import org.junit.jupiter.api.Test; + +import java.time.Instant; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SlowAppTest { + + @Test + void slowAppInit_continuesInBackgroundThread_returnsCorrect() { + LambdaHandler slowApp = new LambdaHandler(); + System.out.println("Start time: " + slowApp.getConstructorTime()); + assertTrue(slowApp.getConstructorTime() < 10_000); + AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); + long startRequestTime = Instant.now().toEpochMilli(); + AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); + long endRequestTime = Instant.now().toEpochMilli(); + assertTrue(endRequestTime - startRequestTime > SlowTestApplication.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); + assertEquals(200, resp.getStatusCode()); + assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java new file mode 100644 index 00000000..e98b1987 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -0,0 +1,335 @@ +package com.amazonaws.serverless.proxy.spring; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.*; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.util.CollectionUtils; + +import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; +import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication; +import com.amazonaws.serverless.proxy.spring.servletapp.UserData; +import tools.jackson.databind.ObjectMapper; + +import jakarta.ws.rs.core.HttpHeaders; + +@SuppressWarnings("rawtypes") +public class SpringDelegatingLambdaContainerHandlerTests { + + private static String API_GATEWAY_EVENT = "{\n" + + " \"version\": \"1.0\",\n" + + " \"resource\": \"$default\",\n" + + " \"path\": \"/async\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"headers\": {\n" + + " \"Content-Length\": \"45\",\n" + + " \"Content-Type\": \"application/json\",\n" + + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"User-Agent\": \"curl/7.79.1\",\n" + + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" + + " \"X-Forwarded-For\": \"109.210.252.44\",\n" + + " \"X-Forwarded-Port\": \"443\",\n" + + " \"X-Forwarded-Proto\": \"https\",\n" + + " \"accept\": \"*/*\"\n" + + " },\n" + + " \"multiValueHeaders\": {\n" + + " \"Content-Length\": [\n" + + " \"45\"\n" + + " ],\n" + + " \"Content-Type\": [\n" + + " \"application/json\"\n" + + " ],\n" + + " \"Host\": [\n" + + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" + + " ],\n" + + " \"User-Agent\": [\n" + + " \"curl/7.79.1\"\n" + + " ],\n" + + " \"X-Amzn-Trace-Id\": [\n" + + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" + + " ],\n" + + " \"X-Forwarded-For\": [\n" + + " \"109.210.252.44\"\n" + + " ],\n" + + " \"X-Forwarded-Port\": [\n" + + " \"443\"\n" + + " ],\n" + + " \"X-Forwarded-Proto\": [\n" + + " \"https\"\n" + + " ],\n" + + " \"accept\": [\n" + + " \"*/*\"\n" + + " ]\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"abc\": \"xyz\",\n" + + " \"name\": \"Ricky\",\n" + + " \"foo\": \"baz\"\n" + + " },\n" + + " \"multiValueQueryStringParameters\": {\n" + + " \"abc\": [\n" + + " \"xyz\"\n" + + " ],\n" + + " \"name\": [\n" + + " \"Ricky\"\n" + + " ],\n" + + " \"foo\": [\n" + + " \"bar\",\n" + + " \"baz\"\n" + + " ]\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789098\",\n" + + " \"apiId\": \"i76bfhczs0\",\n" + + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" + + " \"domainPrefix\": \"i76bfhczs0\",\n" + + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"httpMethod\": \"POST\",\n" + + " \"identity\": {\n" + + " \"accessKey\": null,\n" + + " \"accountId\": null,\n" + + " \"caller\": null,\n" + + " \"cognitoAmr\": null,\n" + + " \"cognitoAuthenticationProvider\": null,\n" + + " \"cognitoAuthenticationType\": null,\n" + + " \"cognitoIdentityId\": null,\n" + + " \"cognitoIdentityPoolId\": null,\n" + + " \"principalOrgId\": null,\n" + + " \"sourceIp\": \"109.210.252.44\",\n" + + " \"user\": null,\n" + + " \"userAgent\": \"curl/7.79.1\",\n" + + " \"userArn\": null\n" + + " },\n" + + " \"path\": \"/pets\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" + + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" + + " \"requestTimeEpoch\": 1678276240455,\n" + + " \"resourceId\": \"$default\",\n" + + " \"resourcePath\": \"$default\",\n" + + " \"stage\": \"$default\"\n" + + " },\n" + + " \"pathParameters\": null,\n" + + " \"stageVariables\": null,\n" + + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" + + " \"isBase64Encoded\": false\n" + + "}"; + + private static String API_GATEWAY_EVENT_V2 = "{\n" + + " \"version\": \"2.0\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"rawPath\": \"/my/path\",\n" + + " \"rawQueryString\": \"parameter1=value1¶meter1=value2&name=Ricky¶meter2=value\",\n" + + " \"cookies\": [\n" + + " \"cookie1\",\n" + + " \"cookie2\"\n" + + " ],\n" + + " \"headers\": {\n" + + " \"header1\": \"value1\",\n" + + " \"header2\": \"value1,value2\"\n" + + " },\n" + + " \"queryStringParameters\": {\n" + + " \"parameter1\": \"value1,value2\",\n" + + " \"name\": \"Ricky\",\n" + + " \"parameter2\": \"value\"\n" + + " },\n" + + " \"requestContext\": {\n" + + " \"accountId\": \"123456789012\",\n" + + " \"apiId\": \"api-id\",\n" + + " \"authentication\": {\n" + + " \"clientCert\": {\n" + + " \"clientCertPem\": \"CERT_CONTENT\",\n" + + " \"subjectDN\": \"www.example.com\",\n" + + " \"issuerDN\": \"Example issuer\",\n" + + " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + + " \"validity\": {\n" + + " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + + " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + + " }\n" + + " }\n" + + " },\n" + + " \"authorizer\": {\n" + + " \"jwt\": {\n" + + " \"claims\": {\n" + + " \"claim1\": \"value1\",\n" + + " \"claim2\": \"value2\"\n" + + " },\n" + + " \"scopes\": [\n" + + " \"scope1\",\n" + + " \"scope2\"\n" + + " ]\n" + + " }\n" + + " },\n" + + " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + + " \"domainPrefix\": \"id\",\n" + + " \"http\": {\n" + + " \"method\": \"POST\",\n" + + " \"path\": \"/my/path\",\n" + + " \"protocol\": \"HTTP/1.1\",\n" + + " \"sourceIp\": \"IP\",\n" + + " \"userAgent\": \"agent\"\n" + + " },\n" + + " \"requestId\": \"id\",\n" + + " \"routeKey\": \"$default\",\n" + + " \"stage\": \"$default\",\n" + + " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + + " \"timeEpoch\": 1583348638390\n" + + " },\n" + + " \"body\": \"Hello from Lambda\",\n" + + " \"pathParameters\": {\n" + + " \"parameter1\": \"value1\"\n" + + " },\n" + + " \"isBase64Encoded\": false,\n" + + " \"stageVariables\": {\n" + + " \"stageVariable1\": \"value1\",\n" + + " \"stageVariable2\": \"value2\"\n" + + " }\n" + + "}"; + + private SpringDelegatingLambdaContainerHandler handler; + + private ObjectMapper mapper = new ObjectMapper(); + + public void initServletAppTest() throws ContainerInitializationException { + this.handler = new SpringDelegatingLambdaContainerHandler(ServletApplication.class); + } + + public static Collection data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); + } + + @MethodSource("data") + @ParameterizedTest + public void validateComplesrequest(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", + "/foo/male/list/24", "{\"name\":\"bob\"}", false,null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + String[] responseBody = ((String) result.get("body")).split("/"); + assertEquals("male", responseBody[0]); + assertEquals("24", responseBody[1]); + assertEquals("Ricky", responseBody[2]); + } + + @MethodSource("data") + @ParameterizedTest + public void testValidate400(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(400, result.get("statusCode")); + assertEquals("3", result.get("body")); + } + + @MethodSource("data") + @ParameterizedTest + public void testValidate200(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + ud.setFirstName("bob"); + ud.setLastName("smith"); + ud.setEmail("foo@bar.com"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("body")); + } + + @MethodSource("data") + @ParameterizedTest + public void testValidate200Base64(String jsonEvent) throws Exception { + initServletAppTest(); + UserData ud = new UserData(); + ud.setFirstName("bob"); + ud.setLastName("smith"); + ud.setEmail("foo@bar.com"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", + Base64.getMimeEncoder().encodeToString(mapper.writeValueAsString(ud).getBytes()),true, null)); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("VALID", result.get("body")); + } + + @MethodSource("data") + @ParameterizedTest + public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", + mapper.writeValueAsString(new MessageData("test message")),false, null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + assertEquals("test message", result.get("body")); + } + + @SuppressWarnings({"unchecked" }) + @MethodSource("data") + @ParameterizedTest + void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { + initServletAppTest(); + + Map headers = new HashMap<>(); + headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); + headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", + mapper.writeValueAsString(new MessageData("test message")),false, headers)); + + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals("test message", result.get("body")); + } + + private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { + Map requestMap = mapper.readValue(jsonEvent, Map.class); + if (requestMap.get("version").equals("2.0")) { + return generateHttpRequest2(requestMap, method, path, body, isBase64Encoded,headers); + } + return generateHttpRequest(requestMap, method, path, body,isBase64Encoded, headers); + } + + @SuppressWarnings({ "unchecked"}) + private byte[] generateHttpRequest(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { + requestMap.put("path", path); + requestMap.put("httpMethod", method); + requestMap.put("body", body); + requestMap.put("isBase64Encoded", isBase64Encoded); + if (!CollectionUtils.isEmpty(headers)) { + requestMap.put("headers", headers); + } + return mapper.writeValueAsBytes(requestMap); + } + + @SuppressWarnings({ "unchecked"}) + private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { + Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); + Map http = (Map) ((Map) map.get("requestContext")).get("http"); + http.put("path", path); + http.put("method", method); + map.put("body", body); + map.put("isBase64Encoded", isBase64Encoded); + if (!CollectionUtils.isEmpty(headers)) { + map.put("headers", headers); + } + return mapper.writeValueAsBytes(map); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java new file mode 100644 index 00000000..cc7d3365 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java @@ -0,0 +1,68 @@ +package com.amazonaws.serverless.proxy.spring; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.Arrays; +import java.util.Collection; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.webfluxapp.LambdaHandler; +import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageController; +import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageData; +import tools.jackson.core.JacksonException; + +public class WebFluxAppTest { + + LambdaHandler handler; + MockLambdaContext lambdaContext = new MockLambdaContext(); + + private String type; + + public static Collection data() { + return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); + } + + public void initWebFluxAppTest(String reqType) { + type = reqType; + handler = new LambdaHandler(type); + } + + @MethodSource("data") + @ParameterizedTest + void helloRequest_respondsWithSingleMessage(String reqType) { + initWebFluxAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/single", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + System.out.println(resp.getBody()); + assertEquals(MessageController.MESSAGE, resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void helloDoubleRequest_respondsWithDoubleMessage(String reqType) { + initWebFluxAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/double", "GET"); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + + assertEquals(MessageController.MESSAGE + MessageController.MESSAGE, resp.getBody()); + } + + @MethodSource("data") + @ParameterizedTest + void messageObject_parsesObject_returnsCorrectMessage(String reqType) throws JacksonException { + initWebFluxAppTest(reqType); + AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") + .json() + .body(new MessageData("test message")); + AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); + assertNotNull(resp); + assertEquals(200, resp.getStatusCode()); + assertEquals("test message", resp.getBody()); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java new file mode 100644 index 00000000..5ffd4a31 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.proxy.spring.embedded; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; +import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import org.junit.jupiter.api.Test; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.web.servlet.ServletContextInitializer; + +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; + +import static org.junit.jupiter.api.Assertions.fail; + +public class ServerlessServletEmbeddedServerFactoryTest { + private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( + AwsProxyRequest.class, + AwsProxyResponse.class, + new AwsProxyHttpServletRequestReader(), + new AwsProxyHttpServletResponseWriter(), + new AwsProxySecurityContextWriter(), + new AwsProxyExceptionHandler(), + null, + new InitializationWrapper(), + WebApplicationType.REACTIVE + ); + + public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { + } + + @Test + void getWebServer_callsInitializers() { + ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); + factory.getWebServer(new ServletContextInitializer() { + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + if (servletContext == null) { + fail("Null servlet context"); + } + } + }); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java new file mode 100644 index 00000000..aeef7c65 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java @@ -0,0 +1,23 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DriverManagerDataSource; + +import javax.sql.DataSource; + +@Configuration +public class DatabaseConfig { + + @Bean + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("org.h2.Driver"); + dataSource.setUrl("jdbc:h2:mem:testdb"); + dataSource.setUsername("sa"); + dataSource.setPassword(""); + + return dataSource; + } +} + diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java new file mode 100644 index 00000000..bc80c95a --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java @@ -0,0 +1,12 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingSystem; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@SpringBootApplication +@Import(MessageController.class) +public class JpaApplication {} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java new file mode 100644 index 00000000..0cf67c10 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java @@ -0,0 +1,59 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; + + public LambdaHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(JpaApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(JpaApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java new file mode 100644 index 00000000..a8529226 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java @@ -0,0 +1,31 @@ +package com.amazonaws.serverless.proxy.spring.jpaapp; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.async.DeferredResult; +import java.util.Collections; +import java.util.Map; + +@RestController +public class MessageController { + + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) + public String hello() { + return HELLO_MESSAGE; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(path = "/async", method = RequestMethod.POST) + @ResponseBody + public DeferredResult> asyncResult(@RequestBody Map value) { + DeferredResult result = new DeferredResult<>(); + result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); + return result; + } + +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java new file mode 100644 index 00000000..ae8ba21a --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java @@ -0,0 +1,25 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(SecurityApplication.class); + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java new file mode 100644 index 00000000..ad67d476 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java @@ -0,0 +1,17 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) + public Mono hello() { + return Mono.just(HELLO_MESSAGE); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java new file mode 100644 index 00000000..cafcd400 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java @@ -0,0 +1,14 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.web.reactive.config.EnableWebFlux; + +@SpringBootApplication +@EnableWebFluxSecurity +@EnableWebFlux +@Import(SecurityConfig.class) +public class SecurityApplication { +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java new file mode 100644 index 00000000..497d2084 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java @@ -0,0 +1,45 @@ +package com.amazonaws.serverless.proxy.spring.securityapp; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.server.SecurityWebFilterChain; + +@Configuration +@EnableWebFluxSecurity +public class SecurityConfig +{ + public static final String USERNAME = "admin"; + public static final String PASSWORD = "{noop}password"; + private static BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + + @Bean + public SecurityWebFilterChain securitygWebFilterChain( + ServerHttpSecurity http) { + return http.authorizeExchange(exchanges -> exchanges + .anyExchange().authenticated()) + .csrf(csrf -> csrf.disable()) + .httpBasic(httpBasic -> {}) + .build(); + } + + @Bean + public static BCryptPasswordEncoder passwordEncoder() { + return passwordEncoder; + } + + @Bean + public MapReactiveUserDetailsService userDetailsService() { + UserDetails user = User + .withUsername(USERNAME) + .password(passwordEncoder.encode(PASSWORD)) + .roles("USER") + .build(); + return new MapReactiveUserDetailsService(user); + } +} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java new file mode 100644 index 00000000..88441988 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java @@ -0,0 +1,60 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; + + public LambdaHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java new file mode 100644 index 00000000..fd7d71d7 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java @@ -0,0 +1,63 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class LambdaStreamHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + private String type; + + public LambdaStreamHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .servletApplication() + .springBootApplication(ServletApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + switch (type) { + case "API_GW": + case "ALB": + handler.proxyStream(inputStream, outputStream, context); + break; + case "HTTP_API": + httpApiHandler.proxyStream(inputStream, outputStream, context); + } + + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java new file mode 100644 index 00000000..1923396c --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java @@ -0,0 +1,75 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.Errors; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.server.ResponseStatusException; + +import jakarta.validation.Valid; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + public static final String VALID_MESSAGE = "VALID"; + public static final String UTF8_RESPONSE = "öüäß фрыцшщ"; + public static final String EX_MESSAGE = "404 exception message"; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @RequestMapping(path = "/async", method = RequestMethod.POST) + @ResponseBody + public DeferredResult> asyncResult(@RequestBody Map value) { + DeferredResult result = new DeferredResult<>(); + result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); + return result; + } + + @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) + public String hello() { + return HELLO_MESSAGE; + } + + @RequestMapping(path="/validate", method=RequestMethod.POST, produces = {"text/plain"}) + public ResponseEntity validateBody(@RequestBody @Valid UserData userData, Errors errors) { + if (errors != null && errors.hasErrors()) { + return ResponseEntity.badRequest().body(errors.getErrorCount() + ""); + } + return ResponseEntity.ok(VALID_MESSAGE); + } + + @RequestMapping(path="/message", method = RequestMethod.POST) + public String returnMessage(@RequestBody MessageData data) { + if (data == null) { + throw new RuntimeException("No message data"); + } + return data.getMessage(); + } + + @RequestMapping(path="/echo/{message}", method=RequestMethod.GET) + public String returnPathMessage(@PathVariable(value="message") String message) { + return message; + } + + @GetMapping(value = "/content-type/utf8", produces = "text/plain") + public ResponseEntity getUtf8String() { + return ResponseEntity.ok(UTF8_RESPONSE); + } + + @GetMapping(value = "/content-type/jsonutf8", produces=MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getUtf8Json() { + Map resp = new HashMap(); + resp.put("s", UTF8_RESPONSE); + return ResponseEntity.ok(resp); + } + + @GetMapping(value = "/ex/customstatus") + public String throw404Exception() { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, EX_MESSAGE); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java new file mode 100644 index 00000000..129101cb --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +public class MessageData { + private String message; + + public MessageData() { + } + + public MessageData(String m) { + setMessage(m); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java new file mode 100644 index 00000000..b2dc1a31 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -0,0 +1,25 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@Import(MessageController.class) +@RestController +public class ServletApplication { + + @RequestMapping(path = "/foo/{gender}/list/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + public String complexRequest( + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name + ) { + return gender + "/" + age + "/" + name; + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java new file mode 100644 index 00000000..379291a3 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.proxy.spring.servletapp; + + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public class UserData { + @NotBlank + private String firstName; + @NotBlank + private String lastName; + @NotNull @Email + private String email; + private String error; + + public UserData() { + + } + + public UserData(String err) { + error = err; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getError() { return error; } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java new file mode 100644 index 00000000..22f75e7a --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java @@ -0,0 +1,40 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +import java.time.Instant; + +public class LambdaHandler implements RequestHandler { + private SpringBootLambdaContainerHandler handler; + private long constructorTime; + + public LambdaHandler() { + try { + long startTime = Instant.now().toEpochMilli(); + System.out.println("startCall: " + startTime); + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .springBootApplication(SlowTestApplication.class) + .buildAndInitialize(); + constructorTime = Instant.now().toEpochMilli() - startTime; + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + public long getConstructorTime() { + return constructorTime; + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { + return handler.proxy(awsProxyRequest, context); + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java new file mode 100644 index 00000000..098e8e7d --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java @@ -0,0 +1,15 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MessageController { + public static final String HELLO_MESSAGE = "Hello"; + + @RequestMapping(path="/hello", method= RequestMethod.GET) + public String hello() { + return HELLO_MESSAGE; + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java new file mode 100644 index 00000000..adb4bcb3 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java @@ -0,0 +1,21 @@ +package com.amazonaws.serverless.proxy.spring.slowapp; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.stereotype.Component; + +import java.time.Instant; + +@SpringBootApplication +public class SlowTestApplication { + + @Component + public static class SlowDownInit implements InitializingBean { + public static final int INIT_SLEEP_TIME_MS = 13_000; + + @Override + public void afterPropertiesSet() throws Exception { + Thread.sleep(INIT_SLEEP_TIME_MS); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java new file mode 100644 index 00000000..0eb52a7b --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java @@ -0,0 +1,58 @@ +package com.amazonaws.serverless.proxy.spring.webfluxapp; + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.InitializationWrapper; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; + +public class LambdaHandler implements RequestHandler { + private static SpringBootLambdaContainerHandler handler; + private static SpringBootLambdaContainerHandler httpApiHandler; + + private String type; + + public LambdaHandler(String reqType) { + type = reqType; + try { + switch (type) { + case "API_GW": + case "ALB": + handler = new SpringBootProxyHandlerBuilder() + .defaultProxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(WebFluxTestApplication.class) + .buildAndInitialize(); + break; + case "HTTP_API": + httpApiHandler = new SpringBootProxyHandlerBuilder() + .defaultHttpApiV2Proxy() + .initializationWrapper(new InitializationWrapper()) + .springBootApplication(WebFluxTestApplication.class) + .buildAndInitialize(); + break; + } + } catch (ContainerInitializationException e) { + e.printStackTrace(); + } + } + + @Override + public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { + switch (type) { + case "API_GW": + return handler.proxy(awsProxyRequest.build(), context); + case "ALB": + return handler.proxy(awsProxyRequest.alb().build(), context); + case "HTTP_API": + return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); + default: + throw new RuntimeException("Unknown request type: " + type); + } + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java new file mode 100644 index 00000000..61e55a13 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java @@ -0,0 +1,38 @@ +package com.amazonaws.serverless.proxy.spring.webfluxapp; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import reactor.core.publisher.Flux; + +@EnableAutoConfiguration +@RestController +public class MessageController { + public static final String MESSAGE = "Hello"; + + @RequestMapping(path="/single", method= RequestMethod.GET, produces = {"text/plain"}) + Flux singleMessage(){ + return Flux.just( + MESSAGE + ); + } + + @RequestMapping(path="/double", method= RequestMethod.GET, produces={"text/plain"}) + Flux doubleMessage(){ + return Flux.just( + MESSAGE, + MESSAGE + ); + } + + @RequestMapping(path="/message", method = RequestMethod.POST, produces={"text/plain"}, consumes = {"application/json"}) + public Flux returnMessage(@RequestBody MessageData data) { + if (data == null) { + throw new RuntimeException("No message data"); + } + return Flux.just(data.getMessage()); + } +} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java new file mode 100644 index 00000000..2be6b4f2 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.proxy.spring.webfluxapp; + +public class MessageData { + private String message; + + public MessageData() { + } + + public MessageData(String m) { + setMessage(m); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java new file mode 100644 index 00000000..891abd18 --- /dev/null +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java @@ -0,0 +1,14 @@ +package com.amazonaws.serverless.proxy.spring.webfluxapp; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.reactive.config.EnableWebFlux; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@SpringBootApplication +public class WebFluxTestApplication { + +} diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 4afdc999..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 1f05e901..da0c0540 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,7 +16,7 @@ 1.8 3.1.10 - 2.18.3 + 3.0.2 5.12.1 @@ -24,12 +24,12 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - ${project.version} + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - ${project.version} + 3.0.0-SNAPSHOT tests test-jar test @@ -51,18 +51,18 @@ jackson-annotations - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - com.fasterxml.jackson.core + tools.jackson.core jackson-core - com.fasterxml.jackson.core + tools.jackson.core jackson-databind \${jackson.version} diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java index 768a5ad9..a4e2251e 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -10,6 +10,7 @@ import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ServerProperties; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 53db9b16..a247daed 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -16,6 +16,7 @@ import jakarta.ws.rs.core.Response; import java.io.ByteArrayOutputStream; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.io.InputStream; @@ -81,7 +82,7 @@ private void handle(InputStream is, ByteArrayOutputStream os) { private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { try { return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { + } catch (JacksonException e) { e.printStackTrace(); fail("Error while parsing response: " + e.getMessage()); } diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 2a2f59b8..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT maven-archetype diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 48b70f27..4dd847a3 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -16,8 +16,8 @@ 1.8 1.8 - 6.2.6 - 5.12.1 + 7.0.0 + 6.0.0 2.24.2 @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-spring - ${project.version} + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container-core - ${project.version} + 3.0.0-SNAPSHOT tests test-jar test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java index 53db9b16..cfb809f8 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -81,7 +81,7 @@ private void handle(InputStream is, ByteArrayOutputStream os) { private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { try { return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { + } catch (tools.jackson.core.JacksonException e) { e.printStackTrace(); fail("Error while parsing response: " + e.getMessage()); } diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 74fac615..f4c56c05 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5-SNAPSHOT + 2.1.3 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.5-SNAPSHOT + 2.1.3 maven-archetype diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml new file mode 100644 index 00000000..82e1ad03 --- /dev/null +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -0,0 +1,80 @@ + + 4.0.0 + + + com.amazonaws.serverless + aws-serverless-java-container + 3.0.0-SNAPSHOT + + + com.amazonaws.serverless.archetypes + aws-serverless-springboot4-archetype + 3.0.0-SNAPSHOT + maven-archetype + + + https://github.com/aws/serverless-java-container.git + HEAD + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + + src/main/resources + true + + archetype-resources/pom.xml + archetype-resources/README.md + + + + src/main/resources + false + + archetype-resources/pom.xml + + + + + + + org.apache.maven.archetype + archetype-packaging + 3.4.0 + + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + \ + + + + org.apache.maven.plugins + maven-archetype-plugin + 3.4.0 + + + + integration-test + + + + + + + + diff --git a/aws-serverless-springboot4-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot4-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 00000000..5379692b --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,39 @@ + + + + src/main/java + + **/*.java + + + + src/main/resources + + **/*.properties + + + + src/test/java + + **/*.java + + + + src/assembly + + * + + + + + + template.yml + README.md + build.gradle + + + + \ No newline at end of file diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/README.md new file mode 100644 index 00000000..311c40ae --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/README.md @@ -0,0 +1,99 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +# \${artifactId} serverless API +The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). + +The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. + +The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). + +#[[##]]# Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +#[[##]]# Building the project +You can use the SAM CLI to quickly build the project +```bash +$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false +$ cd \${artifactId} +$ sam build +Building resource '\${resourceName}Function' +Running JavaGradleWorkflow:GradleBuild +Running JavaGradleWorkflow:CopyArtifacts + +Build Succeeded + +Built Artifacts : .aws-sam/build +Built Template : .aws-sam/build/template.yaml + +Commands you can use next +========================= +[*] Invoke Function: sam local invoke +[*] Deploy: sam deploy --guided +``` + +#[[##]]# Testing locally with the SAM CLI + +From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. + +```bash +$ sam local start-api + +... +Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] +... +``` + +Using a new shell, you can send a test ping request to your API: + +```bash +$ curl -s http://127.0.0.1:3000/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` + +#[[##]]# Deploying to AWS +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL + +``` +... +------------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +------------------------------------------------------------------------------------------------------------- +\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets +------------------------------------------------------------------------------------------------------------- +``` + +Copy the `OutputValue` into a browser or use curl to test your first request: + +```bash +$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool + +{ + "pong": "Hello, World!" +} +``` diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/build.gradle new file mode 100644 index 00000000..3aa54825 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} +} + +dependencies { + implementation ( + 'org.springframework.boot:spring-boot-starter-web:3.4.5', + 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', + ) + + testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") + testImplementation(platform("org.junit:junit-bom:5.13.1")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +test { + useJUnitPlatform() +} + +build.dependsOn buildZip diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/pom.xml new file mode 100644 index 00000000..c122a405 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/pom.xml @@ -0,0 +1,180 @@ +#set($dollar = '$') + + + 4.0.0 + + \${groupId} + \${artifactId} + \${version} + jar + + Serverless Spring Boot 4 API + https://github.com/aws/serverless-java-container + + + org.springframework.boot + spring-boot-starter-parent + 4.0.0 + + + + 17 + 5.12.1 + + + + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + ${project.version} + + + com.amazonaws.serverless + aws-serverless-java-container-core + ${project.version} + tests + test-jar + test + + + org.apache.httpcomponents.client5 + httpclient5 + 5.4.3 + test + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.junit.jupiter + junit-jupiter + test + + + + + + + org.junit + junit-bom + ${junit.version} + import + pom + + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.2 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + copy-dependencies + package + + copy-dependencies + + + ${dollar}{project.build.directory}${dollar}{file.separator}lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + zip-assembly + package + + single + + + ${dollar}{project.artifactId}-${dollar}{project.version} + + src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml + + false + + + + + + + + + diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/Application.java new file mode 100644 index 00000000..1b74086f --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/Application.java @@ -0,0 +1,24 @@ +#macro(loggingOff) + logging.level.root:OFF +#end +#set($logging = "#loggingOff()") +#set($logging = $logging.replaceAll("\n", "").trim()) +package ${groupId}; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Import; + +import ${groupId}.controller.PingController; + + +@SpringBootApplication +// We use direct @Import instead of @ComponentScan to speed up cold starts +// @ComponentScan(basePackages = "${groupId}.controller") +@Import({ PingController.class }) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java new file mode 100644 index 00000000..e022540c --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java @@ -0,0 +1,33 @@ +package ${groupId}; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} \ No newline at end of file diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java new file mode 100644 index 00000000..94f517f0 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java @@ -0,0 +1,20 @@ +package ${groupId}.controller; + + +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@EnableWebMvc +public class PingController { + @RequestMapping(path = "/ping", method = RequestMethod.GET) + public Map ping() { + Map pong = new HashMap<>(); + pong.put("pong", "Hello, World!"); + return pong; + } +} diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties new file mode 100644 index 00000000..070e632f --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# Reduce logging level to make sure the application works with SAM local +# https://github.com/aws/serverless-java-container/issues/134 +logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java new file mode 100644 index 00000000..4bceb78f --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java @@ -0,0 +1,88 @@ +package ${groupId}; + + +import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; +import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; +import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.services.lambda.runtime.Context; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.*; + +public class StreamLambdaHandlerTest { + + private static StreamLambdaHandler handler; + private static Context lambdaContext; + + @BeforeAll + public static void setUp() { + handler = new StreamLambdaHandler(); + lambdaContext = new MockLambdaContext(); + } + + @Test + public void ping_streamRequest_respondsWithHello() { + InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); + + assertFalse(response.isBase64Encoded()); + + assertTrue(response.getBody().contains("pong")); + assertTrue(response.getBody().contains("Hello, World!")); + + assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); + assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); + } + + @Test + public void invalidResource_streamRequest_responds404() { + InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) + .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) + .buildStream(); + ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); + + handle(requestStream, responseStream); + + AwsProxyResponse response = readResponse(responseStream); + assertNotNull(response); + assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); + } + + private void handle(InputStream is, ByteArrayOutputStream os) { + try { + handler.handleRequest(is, os, lambdaContext); + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + + private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { + try { + return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); + } catch (Exception e) { + e.printStackTrace(); + fail("Error while parsing response: " + e.getMessage()); + } + return null; + } +} diff --git a/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/template.yml new file mode 100644 index 00000000..18c23187 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/main/resources/archetype-resources/template.yml @@ -0,0 +1,52 @@ +#set($resourceName = $artifactId) +#macro(replaceChar $originalName, $char) + #if($originalName.contains($char)) + #set($tokens = $originalName.split($char)) + #set($newResourceName = "") + #foreach($token in $tokens) + #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) + #end + ${newResourceName} + #else + #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) + ${newResourceName} + #end +#end +#set($resourceName = "#replaceChar($resourceName, '-')") +#set($resourceName = "#replaceChar($resourceName, '.')") +#set($resourceName = $resourceName.replaceAll("\n", "").trim()) +#macro(regionVar) + AWS::Region +#end +#set($awsRegion = "#regionVar()") +#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: AWS Serverless Spring Boot 2 API - ${groupId}::${artifactId} +Globals: + Api: + EndpointConfiguration: REGIONAL + +Resources: + ${resourceName}Function: + Type: AWS::Serverless::Function + Properties: + Handler: ${groupId}.StreamLambdaHandler::handleRequest + Runtime: java25 + CodeUri: . + MemorySize: 512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Events: + ProxyResource: + Type: Api + Properties: + Path: /{proxy+} + Method: any + +Outputs: + ${resourceName}Api: + Description: URL for application + Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' + Export: + Name: ${resourceName}Api diff --git a/aws-serverless-springboot4-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot4-archetype/src/test/resources/projects/base/archetype.properties new file mode 100644 index 00000000..7df3bf6e --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/test/resources/projects/base/archetype.properties @@ -0,0 +1,3 @@ +groupId=test.service +artifactId=springboot-archetype-test +version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot4-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot4-archetype/src/test/resources/projects/base/goal.txt new file mode 100644 index 00000000..597acc76 --- /dev/null +++ b/aws-serverless-springboot4-archetype/src/test/resources/projects/base/goal.txt @@ -0,0 +1 @@ +package \ No newline at end of file diff --git a/pom.xml b/pom.xml index ebc634fb..30bf82e9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 2.1.5-SNAPSHOT + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -29,9 +29,11 @@ aws-serverless-java-container-jersey aws-serverless-java-container-spring aws-serverless-java-container-springboot3 + aws-serverless-java-container-springboot4 aws-serverless-jersey-archetype aws-serverless-spring-archetype aws-serverless-springboot3-archetype + aws-serverless-springboot4-archetype @@ -78,9 +80,9 @@ 0.7 12.1.1 - 2.19.1 + 2.0.17 - 5.12.2 + 6.0.0 5.19.0 1.3 UTF-8 @@ -265,7 +267,7 @@ true ${project.build.directory}/spotbugs - ${project.parent.basedir}/spotbugs-excludeFilter.xml + ${project.basedir}/../spotbugs-excludeFilter.xml com.h3xstream.findsecbugs diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index 4fb614e3..7d5833bf 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -8,7 +8,7 @@ RUN yum -y update \ # Graal VM ENV GRAAL_VERSION 21.0.2 -ENV ARCHITECTURE x64 +ENV ARCHITECTURE aarch64 ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm diff --git a/samples/springboot4/alt-pet-store/README.md b/samples/springboot4/alt-pet-store/README.md new file mode 100644 index 00000000..56cfca32 --- /dev/null +++ b/samples/springboot4/alt-pet-store/README.md @@ -0,0 +1,56 @@ +# Serverless Spring Boot 4 example +A basic pet store written with the [Spring Boot 4 framework](https://projects.spring.io/spring-boot/) and Spring Framework 7.0. Unlike older examples, this example is relying on the new +`SpringDelegatingLambdaContainerHandler`, which you simply need to identify as a _handler_ of the Lambda function. The main configuration class identified as `MAIN_CLASS` +environment variable or `Start-Class` or `Main-Class` entry in Manifest file. See provided `template.yml` file for reference. + + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. + +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package +``` +$ sam build +``` + +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. + +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL + +``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- + +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` + +You can also try a complex request passing both path and request parameters to complex endpoint such as this: + + +``` +@RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) +public String complexRequest(@RequestBody String body, + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name +) +``` +For example. + +``` +curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST https://zuhd709386.execute-api.us-east-2.amazonaws.com/foo/male/bar/25?name=Ricky +``` diff --git a/samples/springboot4/alt-pet-store/build.gradle b/samples/springboot4/alt-pet-store/build.gradle new file mode 100644 index 00000000..298feedf --- /dev/null +++ b/samples/springboot4/alt-pet-store/build.gradle @@ -0,0 +1,30 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} +} + +dependencies { + implementation ( + implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' + }, + 'com.amazonaws.serverless:aws-serverless-java-container-springboot4:[2.0-SNAPSHOT,)', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2' + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip diff --git a/samples/springboot4/alt-pet-store/pom.xml b/samples/springboot4/alt-pet-store/pom.xml new file mode 100644 index 00000000..c898b94f --- /dev/null +++ b/samples/springboot4/alt-pet-store/pom.xml @@ -0,0 +1,148 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + petstore-springboot4-example + 2.0-SNAPSHOT + Spring Boot 4 example for the aws-serverless-java-container library + Simple pet store written with Spring Framework 7.0 and Spring Boot 4.0 + https://aws.amazon.com/lambda/ + + + org.springframework.boot + spring-boot-starter-parent + 4.0.0 + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 17 + + + + + org.springframework.boot + spring-boot-starter + + + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + [2.2.0-SNAPSHOT,),[2.1.1,) + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.4 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + + + diff --git a/samples/springboot4/alt-pet-store/src/assembly/bin.xml b/samples/springboot4/alt-pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java new file mode 100644 index 00000000..f5d30c51 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java @@ -0,0 +1,51 @@ +package com.amazonaws.serverless.sample.springboot4; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import com.amazonaws.serverless.sample.springboot4.controller.PetsController; +import com.amazonaws.serverless.sample.springboot4.filter.CognitoIdentityFilter; + +import jakarta.servlet.Filter; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + @Bean("CognitoIdentityFilter") + public Filter cognitoFilter() { + return new CognitoIdentityFilter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java new file mode 100644 index 00000000..f31542e5 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java @@ -0,0 +1,90 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.controller; + + + +import com.amazonaws.serverless.sample.springboot4.model.Pet; +import com.amazonaws.serverless.sample.springboot4.model.PetData; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet listPets() { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + + @RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) + public String complexRequest(@RequestBody String body, + @PathVariable("gender") String gender, + @PathVariable("age") String age, + @RequestParam("name") String name + ) { + System.out.println("Body: " + body + " - " + gender + "/" + age + "/" + name); + return gender + "/" + age + "/" + name; + } + +} diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..705683ae --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot4.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot4.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java new file mode 100644 index 00000000..ddc63025 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java new file mode 100644 index 00000000..b7e95ca9 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java new file mode 100644 index 00000000..66bdd366 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot4/alt-pet-store/src/main/resources/logback.xml b/samples/springboot4/alt-pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..81d89177 --- /dev/null +++ b/samples/springboot4/alt-pet-store/src/main/resources/logback.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/samples/springboot4/alt-pet-store/template.yml b/samples/springboot4/alt-pet-store/template.yml new file mode 100644 index 00000000..4a7e8bb4 --- /dev/null +++ b/samples/springboot4/alt-pet-store/template.yml @@ -0,0 +1,41 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot4 spring-cloud-function web-proxy support + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: +# AutoPublishAlias: bcn + FunctionName: pet-store-boot-4 + Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest + Runtime: java25 + SnapStart: + ApplyOn: PublishedVersions + CodeUri: . + MemorySize: 1024 + Policies: AWSLambdaBasicExecutionRole + Timeout: 30 + Environment: + Variables: + MAIN_CLASS: com.amazonaws.serverless.sample.springboot4.Application + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Outputs: + SpringPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: SpringPetStoreApi + + diff --git a/samples/springboot4/graphql-pet-store/README.md b/samples/springboot4/graphql-pet-store/README.md new file mode 100644 index 00000000..9f1f8db3 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/README.md @@ -0,0 +1,38 @@ +# Serverless Spring Boot 4 with GraphQL example +A basic pet store written with the [Spring Boot 4 framework](https://projects.spring.io/spring-boot/) and Spring Framework 7.0. Unlike older examples, this example uses the [Spring for GraphQl](https://docs.spring.io/spring-graphql/reference/) library. + + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. + +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package +``` +$ sam build +``` + +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. + +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` to make a call to the URL + +``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl +--------------------------------------------------------------------------------------------------------- + +$ curl -X POST https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl -d '{"query":"query petDetails {\n petById(id: \"pet-1\") {\n id\n name\n breed\n owner {\n id\n firstName\n lastName\n }\n }\n}","operationName":"petDetails"}' -H "Content-Type: application/json" + +``` \ No newline at end of file diff --git a/samples/springboot4/graphql-pet-store/pom.xml b/samples/springboot4/graphql-pet-store/pom.xml new file mode 100644 index 00000000..23558694 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/pom.xml @@ -0,0 +1,168 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-springboot4-graphql-example + 2.0-SNAPSHOT + Spring Boot 4 GraphQL example for the aws-serverless-java-container library + GraphQL pet store written with Spring Framework 7.0 and Spring Boot 4.0 + https://aws.amazon.com/lambda/ + + + org.springframework.boot + spring-boot-starter-parent + 4.0.0 + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 17 + + + + + org.springframework.boot + spring-boot-starter-graphql + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.graphql + spring-graphql-test + test + + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + [2.0.0-SNAPSHOT,),[2.0.0-M1,) + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.2 + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.4 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + + + diff --git a/samples/springboot4/graphql-pet-store/src/assembly/bin.xml b/samples/springboot4/graphql-pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..efc312c2 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java new file mode 100644 index 00000000..b6036722 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java @@ -0,0 +1,43 @@ +package com.amazonaws.serverless.sample.springboot4; + +import com.amazonaws.serverless.sample.springboot4.controller.PetsController; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java new file mode 100644 index 00000000..863af635 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java @@ -0,0 +1,44 @@ +package com.amazonaws.serverless.sample.springboot4; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler; +import com.amazonaws.serverless.sample.springboot4.filter.CognitoIdentityFilter; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.EnumSet; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringDelegatingLambdaContainerHandler handler; + static { + try { + handler = new SpringDelegatingLambdaContainerHandler(Application.class); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.handleRequest(inputStream, outputStream, context); + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java new file mode 100644 index 00000000..c76a624e --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java @@ -0,0 +1,21 @@ +package com.amazonaws.serverless.sample.springboot4.controller; + +import org.springframework.graphql.data.method.annotation.Argument; +import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.graphql.data.method.annotation.SchemaMapping; +import org.springframework.stereotype.Controller; +import com.amazonaws.serverless.sample.springboot4.model.Owner; +import com.amazonaws.serverless.sample.springboot4.model.Pet; + +@Controller +public class PetsController { + @QueryMapping + public Pet petById(@Argument String id) { + return Pet.getById(id); + } + + @SchemaMapping + public Owner owner(Pet pet) { + return Owner.getById(pet.ownerId()); + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..705683ae --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot4.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot4.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Owner.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Owner.java new file mode 100644 index 00000000..5349a85b --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Owner.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.sample.springboot4.model; + +import java.util.Arrays; +import java.util.List; + +public record Owner (String id, String firstName, String lastName) { + + private static List owners = Arrays.asList( + new Owner("owner-1", "Joshua", "Bloch"), + new Owner("owner-2", "Douglas", "Adams"), + new Owner("owner-3", "Bill", "Bryson") + ); + + public static Owner getById(String id) { + return owners.stream() + .filter(owner -> owner.id().equals(id)) + .findFirst() + .orElse(null); + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java new file mode 100644 index 00000000..b1419945 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java @@ -0,0 +1,20 @@ +package com.amazonaws.serverless.sample.springboot4.model; + +import java.util.Arrays; +import java.util.List; + +public record Pet (String id, String name, String breed, String ownerId) { + + private static List pets = Arrays.asList( + new Pet("pet-1", "Alpha", "Bulldog", "owner-1"), + new Pet("pet-2", "Max", "German Shepherd", "owner-2"), + new Pet("pet-3", "Rockie", "Golden Retriever", "owner-3") + ); + + public static Pet getById(String id) { + return pets.stream() + .filter(pet -> pet.id().equals(id)) + .findFirst() + .orElse(null); + } +} diff --git a/samples/springboot4/graphql-pet-store/src/main/resources/graphql/schema.graphqls b/samples/springboot4/graphql-pet-store/src/main/resources/graphql/schema.graphqls new file mode 100644 index 00000000..293cdcc4 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/resources/graphql/schema.graphqls @@ -0,0 +1,16 @@ +type Query { + petById(id: ID): Pet +} + +type Pet { + id: ID + name: String + breed: String + owner: Owner +} + +type Owner { + id: ID + firstName: String + lastName: String +} diff --git a/samples/springboot4/graphql-pet-store/src/main/resources/logback.xml b/samples/springboot4/graphql-pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..8ff98899 --- /dev/null +++ b/samples/springboot4/graphql-pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/samples/springboot4/graphql-pet-store/template.yml b/samples/springboot4/graphql-pet-store/template.yml new file mode 100644 index 00000000..5db3eefd --- /dev/null +++ b/samples/springboot4/graphql-pet-store/template.yml @@ -0,0 +1,35 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot4, Spring for GraphQl and the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.sample.springboot4.StreamLambdaHandler::handleRequest + Runtime: java25 + CodeUri: . + MemorySize: 1024 + Policies: AWSLambdaBasicExecutionRole + Timeout: 60 + Environment: + Variables: + MAIN_CLASS: com.amazonaws.serverless.sample.springboot4.Application + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/graphql' + Export: + Name: SpringBootPetStoreApi diff --git a/samples/springboot4/pet-store-native/.gitignore b/samples/springboot4/pet-store-native/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/samples/springboot4/pet-store-native/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.jar b/samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 zcmb5V1CS=sk~Z9!wr$(CZEL#U=Co~N+O}=mwr$(Cds^S@-Tij=#=rmlVk@E|Dyp8$ z$UKz?`Q$l@GN3=8fq)=^fVx`E)Pern1@-q?PE1vZPD);!LGdpP^)C$aAFx&{CzjH` zpQV9;fd0PyFPNN=yp*_@iYmRFcvOrKbU!1a*o)t$0ex(~3z5?bw11HQYW_uDngyer za60w&wz^`W&Z!0XSH^cLNR&k>%)Vr|$}(wfBzmSbuK^)dy#xr@_NZVszJASn12dw; z-KbI5yz=2awY0>OUF)&crfPu&tVl|!>g*#ur@K=$@8N05<_Mldg}X`N6O<~3|Dpk3 zRWb!e7z<{Mr96 z^C{%ROigEIapRGbFA5g4XoQAe_Y1ii3Ci!KV`?$ zZ2Hy1VP#hVp>OOqe~m|lo@^276Ik<~*6eRSOe;$wn_0@St#cJy}qI#RP= zHVMXyFYYX%T_k3MNbtOX{<*_6Htq*o|7~MkS|A|A|8AqKl!%zTirAJGz;R<3&F7_N z)uC9$9K1M-)g0#}tnM(lO2k~W&4xT7gshgZ1-y2Yo-q9Li7%zguh7W#kGfnjo7Cl6 z!^wTtP392HU0aVB!$cPHjdK}yi7xNMp+KVZy3_u}+lBCloJ&C?#NE@y$_{Uv83*iV zhDOcv`=|CiyQ5)C4fghUmxmwBP0fvuR>aV`bZ3{Q4&6-(M@5sHt0M(}WetqItGB1C zCU-)_n-VD;(6T1%0(@6%U`UgUwgJCCdXvI#f%79Elbg4^yucgfW1^ zNF!|C39SaXsqU9kIimX0vZ`U29)>O|Kfs*hXBXC;Cs9_Zos3%8lu)JGm~c19+j8Va z)~kFfHouwMbfRHJ``%9mLj_bCx!<)O9XNq&uH(>(Q0V7-gom7$kxSpjpPiYGG{IT8 zKdjoDkkMTL9-|vXDuUL=B-K)nVaSFd5TsX0v1C$ETE1Ajnhe9ept?d;xVCWMc$MbR zL{-oP*vjp_3%f0b8h!Qija6rzq~E!#7X~8^ZUb#@rnF~sG0hx^Ok?G9dwmit494OT z_WQzm_sR_#%|I`jx5(6aJYTLv;3U#e@*^jms9#~U`eHOZZEB~yn=4UA(=_U#pYn5e zeeaDmq-$-)&)5Y}h1zDbftv>|?GjQ=)qUw*^CkcAG#o%I8i186AbS@;qrezPCQYWHe=q-5zF>xO*Kk|VTZD;t={XqrKfR|{itr~k71VS?cBc=9zgeFbpeQf*Wad-tAW7(o ze6RbNeu31Uebi}b0>|=7ZjH*J+zSj8fy|+T)+X{N8Vv^d+USG3arWZ?pz)WD)VW}P z0!D>}01W#e@VWTL8w1m|h`D(EnHc*C5#1WK4G|C5ViXO$YzKfJkda# z2c2*qXI-StLW*7_c-%Dws+D#Kkv^gL!_=GMn?Y^0J7*3le!!fTzSux%=1T$O8oy8j z%)PQ9!O+>+y+Dw*r`*}y4SpUa21pWJ$gEDXCZg8L+B!pYWd8X;jRBQkN_b=#tb6Nx zVodM4k?gF&R&P=s`B3d@M5Qvr;1;i_w1AI=*rH(G1kVRMC`_nohm~Ie5^YWYqZMV2<`J* z`i)p799U_mcUjKYn!^T&hu7`Lw$PkddV&W(ni)y|9f}rGr|i-7nnfH6nyB$Q{(*Nv zZz@~rzWM#V@sjT3ewv9c`pP@xM6D!StnV@qCdO${loe(4Gy00NDF5&@Ku;h2P+Vh7 z(X6De$cX5@V}DHXG?K^6mV>XiT768Ee^ye&Cs=2yefVcFn|G zBz$~J(ld&1j@%`sBK^^0Gs$I$q9{R}!HhVu|B@Bhb29PF(%U6#P|T|{ughrfjB@s- zZ)nWbT=6f6aVyk86h(0{NqFg#_d-&q^A@E2l0Iu0(C1@^s6Y-G0r32qll>aW3cHP# zyH`KWu&2?XrIGVB6LOgb+$1zrsW>c2!a(2Y!TnGSAg(|akb#ROpk$~$h}jiY&nWEz zmMxk4&H$8yk(6GKOLQCx$Ji-5H%$Oo4l7~@gbHzNj;iC%_g-+`hCf=YA>Z&F)I1sI z%?Mm27>#i5b5x*U%#QE0wgsN|L73Qf%Mq)QW@O+)a;#mQN?b8e#X%wHbZyA_F+`P%-1SZVnTPPMermk1Rpm#(;z^tMJqwt zDMHw=^c9%?#BcjyPGZFlGOC12RN(i`QAez>VM4#BK&Tm~MZ_!#U8PR->|l+38rIqk zap{3_ei_txm=KL<4p_ukI`9GAEZ+--)Z%)I+9LYO!c|rF=Da5DE@8%g-Zb*O-z8Tv zzbvTzeUcYFgy{b)8Q6+BPl*C}p~DiX%RHMlZf;NmCH;xy=D6Ii;tGU~ zM?k;9X_E?)-wP|VRChb4LrAL*?XD6R2L(MxRFolr6GJ$C>Ihr*nv#lBU>Yklt`-bQ zr;5c(o}R!m4PRz=CnYcQv}m?O=CA(PWBW0?)UY)5d4Kf;8-HU@=xMnA#uw{g`hK{U zB-EQG%T-7FMuUQ;r2xgBi1w69b-Jk8Kujr>`C#&kw-kx_R_GLRC}oum#c{je^h&x9 zoEe)8uUX|SahpME4SEog-5X^wQE0^I!YEHlwawJ|l^^0kD)z{o4^I$Eha$5tzD*A8 zR<*lss4U5N*JCYl;sxBaQkB3M8VT|gXibxFR-NH4Hsmw|{={*Xk)%!$IeqpW&($DQ zuf$~fL+;QIaK?EUfKSX;Gpbm8{<=v#$SrH~P-it--v1kL>3SbJS@>hAE2x_k1-iK# zRN~My-v@dGN3E#c!V1(nOH>vJ{rcOVCx$5s7B?7EKe%B`bbx(8}km#t2a z1A~COG(S4C7~h~k+3;NkxdA4gbB7bRVbm%$DXK0TSBI=Ph6f+PA@$t){_NrRLb`jp zn1u=O0C8%&`rdQgO3kEi#QqiBQcBcbG3wqPrJ8+0r<`L0Co-n8y-NbWbx;}DTq@FD z1b)B$b>Nwx^2;+oIcgW(4I`5DeLE$mWYYc7#tishbd;Y!oQLxI>?6_zq7Ej)92xAZ z!D0mfl|v4EC<3(06V8m+BS)Vx90b=xBSTwTznptIbt5u5KD54$vwl|kp#RpZuJ*k) z>jw52JS&x)9&g3RDXGV zElux37>A=`#5(UuRx&d4qxrV<38_w?#plbw03l9>Nz$Y zZS;fNq6>cGvoASa2y(D&qR9_{@tVrnvduek+riBR#VCG|4Ne^w@mf2Y;-k90%V zpA6dVw|naH;pM~VAwLcQZ|pyTEr;_S2GpkB?7)+?cW{0yE$G43`viTn+^}IPNlDo3 zmE`*)*tFe^=p+a{a5xR;H0r=&!u9y)kYUv@;NUKZ)`u-KFTv0S&FTEQc;D3d|KEKSxirI9TtAWe#hvOXV z>807~TWI~^rL?)WMmi!T!j-vjsw@f11?#jNTu^cmjp!+A1f__Dw!7oqF>&r$V7gc< z?6D92h~Y?faUD+I8V!w~8Z%ws5S{20(AkaTZc>=z`ZK=>ik1td7Op#vAnD;8S zh<>2tmEZiSm-nEjuaWVE)aUXp$BumSS;qw#Xy7-yeq)(<{2G#ap8z)+lTi( ziMb-iig6!==yk zb6{;1hs`#qO5OJQlcJ|62g!?fbI^6v-(`tAQ%Drjcm!`-$%Q#@yw3pf`mXjN>=BSH z(Nftnf50zUUTK;htPt0ONKJq1_d0!a^g>DeNCNpoyZhsnch+s|jXg1!NnEv%li2yw zL}Y=P3u`S%Fj)lhWv0vF4}R;rh4&}2YB8B!|7^}a{#Oac|%oFdMToRrWxEIEN<0CG@_j#R4%R4i0$*6xzzr}^`rI!#y9Xkr{+Rt9G$*@ zQ}XJ+_dl^9@(QYdlXLIMI_Q2uSl>N9g*YXMjddFvVouadTFwyNOT0uG$p!rGF5*`1 z&xsKPj&;t10m&pdPv+LpZd$pyI_v1IJnMD%kWn{vY=O3k1sJRYwPoDV1S4OfVz4FB z$^ygjgHCW=ySKSsoSA&wSlq83JB+O-)s>>e@a{_FjB{@=AlrX7wq>JE=n@}@fba(;n4EG| zge1i)?NE@M@DC5eEv4; z#R~0aNssmFHANL@-eDq2_jFn=MXE9y>1FZH4&v<}vEdB6Kz^l)X%%X@E#4)ahB(KY zx8RH+1*6b|o1$_lRqi^)qoLs;eV5zkKSN;HDwJIx#ceKS!A$ZJ-BpJSc*zl+D~EM2 zm@Kpq2M*kX`;gES_Dd1Y#UH`i!#1HdehqP^{DA-AW^dV(UPu|O@Hvr>?X3^~=1iaRa~AVXbj z-yGL<(5}*)su2Tj#oIt+c6Gh}$0|sUYGGDzNMX+$Oi$e&UJt3&kwu)HX+XP{es(S3 z%9C9y({_fu>^BKjI7k;mZ4DKrdqxw`IM#8{Sh?X(6WE4S6-9M}U0&e32fV$2w{`19 zd=9JfCaYm@J$;nSG3(|byYDqh>c%`JW)W*Y0&K~g6)W?AvVP&DsF_6!fG3i%j^Q>R zR_j5@NguaZB{&XjXF+~6m|utO*pxq$8?0GjW0J-e6Lnf0c@}hvom8KOnirhjOM7!n zP#Iv^0_BqJI?hR5+Dl}p!7X}^NvFOCGvh9y*hgik<&X)3UcEBCdUr$Dt8?0f&LSur ze*n!(V(7umZ%UCS>Hf(g=}39OcvGbf2+D;OZ089m_nUbdCE0PXJfnyrIlLXGh2D!m zK=C#{JmoHY1ws47L0zeWkxxV=A%V8a&E^w%;fBp`PN_ndicD@oN?p?Bu~20>;h;W` ztV=hI*Ts$6JXOwOY?sOk_1xjzNYA#40dD}|js#3V{SLhPEkn5>Ma+cGQi*#`g-*g56Q&@!dg)|1YpLai3Bu8a;l2fnD6&)MZ~hS%&J}k z2p-wG=S|5YGy*Rcnm<9VIVq%~`Q{g(Vq4V)CP257v06=M2W|8AgZO0CC_}HVQ>`VU zy;2LDlG1iwIeMj?l40_`21Qsm?d=1~6f4@_&`lp~pIeXnR)wF0z7FH&wu~L~mfmMr zY4_w6tc{ZP&sa&Ui@UxZ*!UovRT})(p!GtQh~+AMZ6wcqMXM*4r@EaUdt>;Qs2Nt8 zDCJi#^Rwx|T|j_kZi6K!X>Ir%%UxaH>m6I9Yp;Sr;DKJ@{)dz4hpG>jX?>iiXzVQ0 zR$IzL8q11KPvIWIT{hU`TrFyI0YQh`#>J4XE*3;v^07C004~FC7TlRVVC}<}LC4h_ zZjZ)2*#)JyXPHcwte!}{y%i_!{^KwF9qzIRst@oUu~4m;1J_qR;Pz1KSI{rXY5_I_ z%gWC*%bNsb;v?>+TbM$qT`_U8{-g@egY=7+SN#(?RE<2nfrWrOn2OXK!ek7v`aDrH zxCoFHyA&@^@m+#Y(*cohQ4B76me;)(t}{#7?E$_u#1fv)vUE5K;jmlgYI0$Mo!*EA zf?dx$4L(?nyFbv|AF1kB!$P_q)wk1*@L0>mSC(A8f4Rgmv1HG;QDWFj<(1oz)JHr+cP|EPET zSD~QW&W(W?1PF-iZ()b|UrnB(#wG^NR!*X}t~OS-21dpXq)h)YcdA(1A`2nzVFax9rx~WuN=SVt`OIR=eE@$^9&Gx_HCfN= zI(V`)Jn+tJPF~mS?ED7#InwS&6OfH;qDzI_8@t>In6nl zo}q{Ds*cTG*w3CH{Mw9*Zs|iDH^KqmhlLp_+wfwIS24G z{c@fdgqy^Y)RNpI7va^nYr9;18t|j=AYDMpj)j1oNE;8+QQ)ap8O??lv%jbrb*a;} z?OvnGXbtE9zt;TOyWc|$9BeSGQbfNZR`o_C!kMr|mzFvN+5;g2TgFo8DzgS2kkuw@ z=`Gq?xbAPzyf3MQ^ZXp>Gx4GwPD))qv<1EreWT!S@H-IpO{TPP1se8Yv8f@Xw>B}Y z@#;egDL_+0WDA)AuP5@5Dyefuu&0g;P>ro9Qr>@2-VDrb(-whYxmWgkRGE(KC2LwS z;ya>ASBlDMtcZCCD8h+Awq1%A|Hbx)rpn`REck#(J^SbjiHXe-jBp!?>~DC7Wb?mC z_AN+^nOt;3tPnaRZBEpB6s|hCcFouWlA{3QJHP!EPBq1``CIsgMCYD#80(bsKpvwO)0#)1{ zos6v&9c=%W0G-T@9sfSLxeGZvnHk$SnHw57+5X4!u1dvH0YwOvuZ7M^2YOKra0dqR zD`K@MTs(k@h>VeI5UYI%n7#3L_WXVnpu$Vr-g}gEE>Y8ZQQsj_wbl&t6nj{;ga4q8SN#Z6cBZepMoyv7MF-tnnZp*(8jq848yZ zsG_fP$Y-rtCAPPI7QC^nzQjlk;p3tk88!1dJuEFZ!BoB;c!T>L>xSD<#+4X%*;_IB z0bZ%-SLOi5DV7uo{z}YLKHsOHfFIYlu8h(?gRs9@bbzk&dkvw*CWnV;GTAKOZfbY9 z(nKOTQ?fRRs(pr@KsUDq@*P`YUk4j=m?FIoIr)pHUCSE84|Qcf6GucZBRt;6oq_8Z zP^R{LRMo?8>5oaye)Jgg9?H}q?%m@2bBI!XOOP1B0s$%htwA&XuR`=chDc2)ebgna zFWvevD|V882V)@vt|>eeB+@<-L0^6NN%B5BREi8K=GwHVh6X>kCN+R3l{%oJw5g>F zrj$rp$9 zhepggNYDlBLM;Q*CB&%w zW+aY{Mj{=;Rc0dkUw~k)SwgT$RVEn+1QV;%<*FZg!1OcfOcLiF@~k$`IG|E8J0?R2 zk?iDGLR*b|9#WhNLtavx0&=Nx2NII{!@1T78VEA*I#65C`b5)8cGclxKQoVFM$P({ zLwJKo9!9xN4Q8a2F`xL&_>KZfN zOK?5jP%CT{^m4_jZahnn4DrqgTr%(e_({|z2`C2NrR6=v9 z*|55wrjpExm3M&wQ^P?rQPmkI9Z9jlcB~4IfYuLaBV95OGm#E|YwBvj5Z}L~f`&wc zrFo!zLX*C{d2}OGE{YCxyPDNV(%RZ7;;6oM*5a>5LmLy~_NIuhXTy-*>*^oo1L;`o zlY#igc#sXmsfGHA{Vu$lCq$&Ok|9~pSl5Q3csNqZc-!a;O@R$G28a@Sg#&gnrYFsk z&OjZtfIdsr%RV)bh>{>f883aoWuYCPDP{_)%yQhVdYh;6(EOO=;ztX1>n-LcOvCIr zKPLkb`WG2;>r)LTp!~AlXjf-Oe3k`Chvw$l7SB2bA=x3s$;;VTFL0QcHliysKd^*n zg-SNbtPnMAIBX7uiwi&vS)`dunX$}x)f=iwHH;OS6jZ9dYJ^wQ=F#j9U{wJ9eGH^#vzm$HIm->xSO>WQ~nwLYQ8FS|?l!vWL<%j1~P<+07ZMKkTqE0F*Oy1FchM z2(Nx-db%$WC~|loN~e!U`A4)V4@A|gPZh`TA18`yO1{ z(?VA_M6SYp-A#%JEppNHsV~kgW+*Ez=?H?GV!<$F^nOd+SZX(f0IoC#@A=TDv4B2M z%G-laS}yqR0f+qnYW_e7E;5$Q!eO-%XWZML++hz$Xaq@c%2&ognqB2%k;Cs!WA6vl z{6s3fwj*0Q_odHNXd(8234^=Asmc0#8ChzaSyIeCkO(wxqC=R`cZY1|TSK)EYx{W9 z!YXa8GER#Hx<^$eY>{d;u8*+0ocvY0f#D-}KO!`zyDD$%z1*2KI>T+Xmp)%%7c$P< zvTF;ea#Zfzz51>&s<=tS74(t=Hm0dIncn~&zaxiohmQn>6x`R+%vT%~Dhc%RQ=Cj^ z&%gxxQo!zAsu6Z+Ud#P!%3is<%*dJXe!*wZ-yidw|zw|C`cR z`fiF^(yZt?p{ZX|8Ita)UC$=fg6wOve?w+8ww|^7OQ0d zN(3dmJ@mV8>74I$kQl8NM%aC+2l?ZQ2pqkMs{&q(|4hwNM z^xYnjj)q6uAK@m|H$g2ARS2($e9aqGYlEED9sT?~{isH3Sk}kjmZ05Atkgh^M6VNP zX7@!i@k$yRsDK8RA1iqi0}#Phs7y(bKYAQbO9y=~10?8cXtIC4@gF#xZS;y3mAI`h zZ^VmqwJ%W>kisQ!J6R?Zjcgar;Il%$jI*@y)B+fn^53jQd0`)=C~w%Lo?qw!q3fVi{~2arObUM{s=q)hgBn64~)W0tyi?(vlFb z>tCE=B1cbfyY=V38fUGN(#vmn1aY!@v_c70}pa(Lrle-(-SH8Nd!emQF zf3kz0cE~KzB%37B24|e=l4)L}g1AF@v%J*A;5F7li!>I0`lfO9TR+ak`xyqWnj5iwJ$>t_vp(bet2p(jRD;5Q9x2*`|FA4#5cfo8SF@cW zeO{H7C0_YJ*P@_BEvm2dB}pUDYXq@G1^Ee#NY9Q`l`$BUXb01#lmQk^{g3?aaP~(* zD;INgi#8TDZ&*@ZKhx$jA^H-H1Lp`%`O{Y{@_o!+7ST}{Ng^P;X>~Bci{|Qdf1{}p z_kK+zL;>D30r6~R?|h!5NKYOi6X&I5)|ME+NG>d9^`hxKpU^)KBOpZiU^ z;|SzGWtbaclC-%9(zR-|q}kB8H&($nsB1LPAkgcm+Qs@cAov{IXxo5PHrH(8DuEMb z3_R#>7^jjGeS7$!`}m8!8$z|)I~{dhd)SvoH9oR9#LjO{{8O&r7w{d9V1z^syn&E6 z{DG0vlQF_Yb3*|>RzVop^{$mWp|%NDYj@4{d*-@O^<(=L=DMFIQHEp-dtz@1Rumd; zadt^4B#(uUyM6aeUJkGl0GfaULpR!2Ql&q$nEV^+SiDptdPbuJ=VJ)`czZ@&HPUuj zc5dSRB&xk)dI~;6N?wkzI}}4K3i%I=EnlKGpPJ9hu?mNzH7|H0j(mN3(ubdaps3GM z1i+9gk=!$mH=L#LRDf4!mXw0;uxSUIXhl|#h*uK+fQPilJc8RCK9GNPt=X^8`*;3$ zBBo77gkGB5F8a8)*OR10nK&~8CEMPVQyhY>i`PS{L^-*WAz$ljtU%zlG1lm%%U4Zw zms0oZR8b|`>4U1X*9JLQQ>m9MF5%ppoafz^;`7DbmmIENrc$hucekkE4I83WhT%(9 zMaE;f7`g4B#vl(#tNP8$3q{$&oY*oa0HLX6D?xTW3M6f<^{%CK4OE1Pmfue`M6Dh= z&Z-zrq$^xhP%|hU&)(+2KSSpeHgX^0?gRZ5wA8@%%9~@|*Ylux1M{WQ4ekG(T+_b` zb6I)QRGp%fRF)^T?i^j&JDBhfNU9?>Sl6WVMM%S?7< ze|4gaDbPooB=F4Y=>~_+y~Q1{Ox@%q>v+_ZIOfnz5y+qy zhi+^!CE*Lv-}>g^%G=bGLqD(aTN;yHDBH#tOC=X02}QU~Xdme``Wn>N>6{VwgU~Z>g+0 zxv0`>>iSfu$baHMw8(^FL6QWe;}(U>@;8j)t)yHAOj?SdeH;evFx-kpU@nT>lsrUt zqhV}2pD^5bC4786guG1`5|fK@pE6xcT#ns)vR|^?A08G62teHaE&p`ZrCBj_Swt*~dVt=5*RK6Y{% zABqK$X59BnrK3r3u=wxklRnA1uh+q`?T0kE1YhvDWF4OY#<(+V|R@R%tdkq2huF(!Ip+EpZF3zr*|9pmKHPo)Cu z;H+^s&`Ql}u=Jt~ZWj`bAw|i-3#7(2WuRU3DU{BW8`?!O?YO1M$*MMTsaEM!5Jyp~ z!gp6yR4$O%wQ8%dyz43ZPeoJwy;o;yg=S0^Y}%|)to>=N^`!3VMf1~}OZ`Dl$q&|w z9$!i3!i1uAgPTuKSWdBrDr*N$g=E#mdqfj*h;Z}OG`{n245+g;IKfdn!&gF2OtHaD zyGDzj@@d2!P(_Ux)3v;1ABTj__{w*kaRF-1YVU`})Acgk?(T*1YqEve3=5)8bkZK* z!Tus*e$h@^u z>#zV0771Bix~r&h2FJ9)%N{>s>?2tk1$bId)1#G;OKgn-U8jUo^AK;Hu)hQEi}swD(264kAS-SBCD$R(Ro0rh8~Le zzRwxbz_JHDbD+hTX15AWmVw!#rC)-zeZahQQmo6FG1)ah3uuyIuTMof}RO!`Y3^Fxn_-G$23RDOh(@NU?r6`*S?#E50)w zpcsgDZ-iO{;EesgDQq9;p*C#QH(sp~2w^zAJWaUL%@yo)iIL6y8;e_}=dwQc%k%;H zFt5lenH*`}LWd+fPqi;exJeRZgl&nLR%|a!%1x0RQ54cgyWBYrL>sskcAtPxi&8c( zw_K?sI*3n%S;lKiYpveBN08{rgV&-B1NN5Jiu07~%n#%&f!(R(z1)xsxtRBkg#+Lv zh21zX?aYDd_f}qdA`Os*j!eC<5)iUJ&Twj7?*p%vEOGElGhpRZsccM!<k}DeC;TY;rULQs3e}lZyP#UVb=6 zB$Dkm2FaHWUXr7<{R&46sfZ)&(HXxB_=e`%LZci`s7L6c-L7iF&wdmTJz`*^=jD~* zpOZ@jcq8LezVkE^M6D9^QgZqnX&x*mr1_Cf#R9R3&{i3%v#}V$UZzGC;Or*=Dw5SXBC6NV|sGZp^#%RTimyaj@!ZuyJ z6C+r}O1TsAzV9PAa*Gd!9#FQMl)ZLHzTr99biAqA(dz-m9LeIeKny3YB=*+|#-Gq# zaErUR5Z*Wh^e<+wcm70eW;f-g=YTbMiDX)AznDM6B73)T4r%nq+*hKcKF?)#vbv?K zPMe=sFCuC*ZqsBPh-?g!m*O`}6<}Pfj}Y1n9|Y@cUdD5GX_)6Sx9pPfS7 zxkt?g6ZwJ+50C7qrh6dMFmr7qah`FskT_H=GC92vkVh$WfZa2%5L99_DxyM{$#6HQ zx$VR-Wwt!q9JL2{ybEGJr$^?!V4m_BqDqt!mbs=QjHf340+^a{)waVvP0+98(BA$M ztWr&sM=juyYgvf`(SC}+y@QtYgU>0ghJ6VbU}|kEraR&&W%#;!#KI?le%g`e>ZVPiDrneh#&1(Y?uiMo^f5qo@{JEr(p9>8GhDa+PC9yG;lX+D?hQ^fZB&Sdox219zUj_5;+n<0@Wi3@DK`MU8FM!OFJ z8*_mTA-u!Ab#95FRVWTIqAL#BVQGxE_s?>Ql|@0o9vos&r<_4d!+Q6(_270)6#lu$ zV!j$a?_V0I<(3Z=J7C-K0a^Kc1Go9p&T6yQeAD+)dG-$a&%Fo0AOte~_Z&_m2@ue~ z9cKFf-A41Dz31Ooj9FSR`l?H5UtdP?JS=UU$jF#znE1k@0g%K?KQuwZkfDI3Ai)(q z#x_Yo6WR_Y@#6I_02S&NpcP<%sw!!M_3#*8qa+*4rS@x=i{-2K#*Qr)*Q$-{<_(<| z0730e+rubnT38*m;|$-4!1r6u&Ua2kO_s-(7*NGgDTe##%I>_9uW;X__b_k)xlv$; zW%K2hsmr>5e^Z~`tS-eUgWmSF9}Yg8E}qydSVX0nYZMX_x94QK?tw2>^;raVTqstR zIrNAX2`X~|h->dTOb9IrA!i5INpLV}99ES|i0ldzC`;R$FBY5&7+TIy8%GO8SZ37_ zw=^Swk?z+j-&0-cTE|LU0q@IKRa&C6ZlXbSa2vN5r-)*f<3{wLV*uJUw980AFkWN7 zKh{?97GmVu-0rs9FB6ludy|n`gN5p~?y51aJzBg6#+-=0pWdZ2n4xTiQ=&3As-!-6 zFlb|ssAJEJL#s8(=odfz8^9b#@RrvNE4gjuEITzAd7R4+rq$yEJKXP?6D@yM7xZ&^ z@%jnE3}bteJo{p(l`hu`Yvzg9I#~>(T;>c;ufeLfc!m3D&RaQS=gAtEO-WbI+f_#| zaVpq-<%~=27U8*qlVCuI6z9@j)#R!z3{jc>&I(qT-8IBW57_$z5Qm3gVC1TcWJNc% zDk?H3%QHno@fu9nT%L^K)=#sRiRNg|=%M zR;8BE)QA4#Dsg^EakzttRg9pkfIrF3iVYVM#*_+#3X+~qeZc^WQJvEyVlO@9=0pl!ayNOh|{j0j^a z+zi_$_0QKhwArW)sJ$wji;A`?$ecbr?(4x5%2pLgh#wggbt)#T^2R3a9m+>GcrUxU z*u-WTgHAN*e!0;Wa%1k)J_P(Vdp>vwrROTVae@6Wn04q4JL-)g&bWO6PWGuN2Q*s9 zn47Q2bIn4=!P1k0jN_U#+`Ah59zRD??jY?s;U;k@%q87=dM*_yvLN0->qswJWb zImaj{Ah&`)C$u#E0mfZh;iyyWNyEg;w0v%QS5 zGXqad{`>!XZJ%+nT+DiVm;lahOGmZyeqJ-;D&!S3d%CQS4ZFM zkzq5U^O|vIsU_erz_^^$|D0E3(i*&fF-fN}8!k3ugsUmW1{&dgnk!|>z2At?h^^T@ zWN_|`?#UM!FwqmSAgD6Hw%VM|fEAlhIA~^S@d@o<`-sxtE(|<><#76_5^l)Xr|l}Q zd@7Fa8Bj1ICqcy2fKl1rD4TYd84)PG5Ee2W4Nt@NNmpJWvc3q@@*c;~%^Vasf2H`y z+~U-19wtFT?@yIFc4SE_ab?s@wEUfSkOED}+qVjjy>=eac2^S^+|_3%cjH%EUTJ&r znp9q?RbStJcT*Vi{3KDa^jr4>{5x+?!1)8c2SqiCEzE$TQ+`3KPQQnG8_Qk<^)y_o zt1Q^f{#yCUt!1e(3;E6y?>p+7sGAYLp`lA3c~Y`re9q&`c6>0?c0E2Ap5seFv92#X z1Vldj!7A8@8tWr&?%;EBQ_Fwd)8A3!wIx`V!~~h(!$pCy7=&*+*uIzG@*d%*{qG#4 zX0^}}sRN^N=p{w(+yjv%xwb!%lnVTE7l1l6gJwQmq_G83J&Y98$S!r*L8}IiIa2E= zE!0tbOuEDb*No0-KB{zjo1k#_4FHtr{!)>o+Y@bll}Sa6D^xktI0H&l{jKAK)A(iz zB-N00F?~Z}Y7tG+vp)-q*v71(C}65$-=uXx^|R$xx9zZip-V>Hqeyfd(wteM)+!!H z$s+>g4I@+`h2>C|J;PhvtOq)`xm4;CyF}R<)!ma3T{Vf_5|zo;D4YI4ZDBkE(vMeE zb#ZV;n}CgA0w8x!UC2&5Z(K)9bibj#?~>R(72lFx_Am~jS?;7mo~p+05~XGD+(wV4 zEVYnf0N5+-7O+Gc1L!sPGUHv<6=cV8}*m$m`kBs@z zy;goR(?J^JrB7uXXpD00+SD0luk!vK3wwp(N%|X!HmO{xC#OMYQ&a7Yqv-54iEUK4 zVH;)rY6)pUX~ESvQK^w|&}>J{I?YlvOhpMgt-JB}m5Br`Q9X+^8+Xa%S81hO<1t#h zbS+MljFP1J0GGNR1}KwE=cfey%;@n&@Kli+Z5d>daJjbvuO3dW{r$1FT0j zR$c9$t~P50P+NhG^krLH%k}wsQ%mm+@#c;-c9>rYy;8#(jZ|KA8RrmnN2~>w0ciU7 zGiLC?Q^{^Ox-9F()RE^>Xq(MAbGaT0^6jc>M5^*&uc@YGt5Iw4i{6_z5}H$oO`arY z4BT(POK%DnxbH>P$A;OWPb@gYS96F7`jTn6JO@hdM za>_p!1mf?ULJZb1w-+HamqN__2CtI%VK`k^(++Ga0%z*z@k0wYJDqT^)~%|4O299; zh1_iRtc7you(kOK8?Q$R7v-@Qk4+i=8GD2_zI0%{Ra`_prF{+UPW^m5MCA&4ZUpZb z2*!)KA8b--Upp~U%f+rsmCmV~!Y>Gzl#yVvZER2h;f&rkdx{r#9mc8DZMJaQXs?SL zCg3#>xR6ve8&YkP*`Z=lng|Ow+h@t*!Ial*XQg3P;VS8@E1C)VS`?L9N+rxlD7bxC z3@Ag)Vu?#ykY`ND+GvRYTUP&-KDMiqly$Z~uFXt^)4Jjk9RIs*&$?-UPM*d7&m${m zm12kaN3mV1J|c6f$>V+{lvHp~XVW3DU0;cBR>7|)4bo{xa1-ts-lYU-Q-b)_fVVl`EP5X}+J9EzT20x8XIv=m7witdu7!3Lh=KE#OyKpT1GWk{YAo^ny|fvZt<+jmsFs=l*%e& zmRkBt5ccv4O7!HAyv2~rsq*(FmMTm?@TX3&1`nu|7C^F{ad%GLuoX}Rl}6`)uHF_xlx^gVca+mGH4T8u8;q{S*x3=j;kelz^atO~)v!Q_BT z4H6%IA}bvfuk0_vweELeEl8N5w-Q1GF!@f{VKnbyYB2?}d&QvI-j}~RI_+9t9$tC2 z94m=3eLi=sQb^S5;fqP?3aaXc&`}`lq z&M8dOXvxx9Y1^u_ZQHhO+qP}nwkvJhwoz$Mp6Qcq^7M#eWm}!3U@s07hop` zW24|J{t$aB`W>uBTssEvYMyi$hkaOqWh+^(RV_1MYnE0XPgW?7sBDk=Cqs(;$qrPEflqa0ZE?A3cBfW%0RPA235Wb6@=R_d>Sez; z`spwa50bq?-zh+id~Q!T`AYn`$GHzs;jxIw(A1_Ql&f|qP}|bon#H;sjKmSDM!nyn z>bU8l%3DB3F+$}|J^da!!pN|DO!Ndc2J)wMk!+Rr1hes#V}5o(?(yQSphn|9_aU<- zn|nsDS{^x&tweP;Ft`2ur>Koo2IdXJDsr6IN)7vB41Yy-^Wbo9*2th2QA@C zE0-0Gk12YOO?d_Guu6b3&(PIL`d zh4{`k54hu9o%v1K3PGuccez-wdC<&2fp)>`qIIaf)R{5un7-vwm=>LD7ibnJ$|KyE zzw`X*tM0S|V(I3vf454PY{yA5lbE+36_<1kd=&0Xy4jfvUKZ0$Jq!AG4KS7DrE9rph;dK^6*#CIU9qu7 z?)6O`TN&MCWGmUVd1@E2ow2`vZ1A#nGo8_n!dmX77DCgAP1va*ILU+!a&$zdm6Pa6 z4#|*&3dM+r_RJb%!0}7X!An&T4a4@ejqNJ;=1YVQ{J6|oURuj8MBZ8i7l=zz%S4-; zL}=M^wU43lZVwNJgN|#xIfo$aZfY#odZ6~z?aNn=oR1@zDb=a(o3w`IGu&j>6lYxL z&MtqINe4Z>bdsHNkVIu$Dbq0wc#X-xev221e~L zbm8kJ(Xzij$gF4Ij0(yuR?H1hShSy@{WXsHyKtAedk4O!IdpR{E32Oqp{1TD{usJi zGG@{3A$x%R*pp8b$RQo4w&eDhN`&b~iZ2m3U>@9p1o5kXoEVmHX7I6Uw4dn((mFw` zilWrqFd=F5sH$&*(eJB52zaLwRe zz`sruIc=Ck75>v5P5kd>B2u=drvGPg6s&k5^W!%CDxtRO)V6_Y_QP{%7B>E~vyMLG zhrfn8kijyK&bX+rZsnSJ26!j$1x+V!Pyn|ph%sXWr9^f&lf|C;+I^Fi_4;`-LJI&F zr;5O@#4jZX=Yaw0`pUyfF4J8A9wE#7_9!X|_s8~YUzWu&#E^%4NxUA3*jK-F5R3LP2|msHBLmiMIzVpPAEX)2 zLKYjm3VI4r#7|nP^}-}rL+Q4?LqlmBnbL+R8P%8VmV{`wP0=~2)LptW_i682*sUR# z+EifOk_cWVKg-iWr^Qf4cs^3&@BFRC6n0vu{HqZzNqW1{m)3K@gi$i}O(hT`f#bT- z8PqCdSj~FncPNmMKl9i9QPH1OMhvd42zLL~qWVup#nIJRg_?7KQ-g3jGTt5ywN;Qx zwmz4dddJYIOsC8VqC2R%NQ>zm=PJH70kS|EsEB>2Otmtf-18`jUGA6kMZL3vEASDN zNX%?0+=vgsUz!dxZ@~)eU17m4pN3xGC0T;#a@b9Iu0g_v*a3|ck^s_DVA^%yH-wt= zm1)7&q6&Rq#)nc9PQ6DKD{NU=&ul10rTiIe!)x^PS~=K(wX9|?k&{Mv&S$iL9@H7= zG0w~UxKXLF003zJ-H%fGA4Db9{~#p&Bl7ki^SWwv2sfoAlrLMvza)uh;7Aa_@FL4b z4G>`j5Mn9e5JrrN#R$wiB(!6@lU@49(tawM&oma6lB$-^!Pmmo;&j57CDmKi)yesg~P;lJPy9D(!;n;^1ql)$5uYf~f z&GywSWx=ABov_%8pCx=g-gww_u26?5st=rdeExu?5dvj^C?ZZxDv@Si^nX~2qA&K= z2jr;{=L(x~9GLXrIGXs>dehU^D}_NMCMegdtNVWyx)8xHT6Qu!R>?%@RvADs9er;NMkweUBFNrBm1F5e0_>^%CwM6ui}K_MpRqLS0*@lAcj zB6TTCBv>w2qh)qU3*kN+6tPmMQx|5Z0A4n67U-nss90Ec_rDF}r)IR4PE{$8;BSt= zT%6|jyD^(w6a*A5>_|TkMqx~e$n@8{`q?|)Q&Y4UWcI!yP-8AwBQ#P`%M&ib;}pli z9KAPU_9txQ3zOM#(x}*lN8q$2(Tq1yT4RN0!t~|&RdQMXfm!81d0ZuyD}aG3r4+g` z8Aevs3E_ssRAMR+&*Q30M!J5&o%^(3$ZJ=PLZ9<@x^0nb>dm17;8EQJE>hLgR(Wc% zn_LXw|5=b$6%X zS~ClDAZ?wdQrtKcV9>_v1_IXqy)?<@cGGq#!H`DNOE1hb4*P_@tGbMy6r@iCN=NiA zL1jLwuMw&N-e9H(v7>HGwqegSgD{GSzZ@sZ?g5Y`fuZ^X2hL=qeFO(;u|QZl1|HmW zYv+kq#fq_Kzr_LaezT zqIkG6R+ve#k6!xy*}@Kz@jcRaG9g|~j5fAYegGOE0k8+qtF?EgI99h*W}Cw z7TP&T0tz4QxiW!r zF4?|!WiNo=$ZCyrom-ep7y}(MVWOWxL+9?AlhX<>p||=VzvX`lUX(EdR^e5m%Rp_q zim6JL6{>S%OKoX(0FS>c1zY|;&!%i-sSE>ybYX3&^>zb`NPj7?N^ydh=s=0fpyyz% zraFILQ17_9<ettJJt~I+sl=&CPHwz zC9dEb#QFQcY?bk11Y=tEl{t+2IG`QFmYS>ECl;kv=N6&_xJLQt>}ZQiFSf+!D*4Ar zGJ~LFB7e_2AQaxg*h{$!eJ6=smO(d2ZNmwzcy3OG@)kNymCWS44|>fP^7QkJHkE9JmLryhcxFASKb4GYkJ|u^Fj=VdF0%6kgKllkt zC|_ov2R4cJ2QjjYjT6jE#J1J<xaNC>Xm;0SX<`LuW*}*{yQ3c9{Zl=<9NP z^2g5rAdO!-b4XfeBrXa4f{M0&VDrq+ps&2C8FYl@S59?edhp~7ee>GR$zQI4r8ONi zP^OA+8zrTAxOMx5ZBS03RS@J_V`3{QsOxznx6Yt*$IuEd3%R|Ki&zZkjNvrxlPD$m z%K+rwM!`E&Z46ogXCu!3 z8use`FJJ?g_xi?~?MxZYXEu=F=XTC8P3{W*CbG3Wk)^31nD~W>*cJ@W4xg%Qqo7rq z`pUu8wL!6Cm~@niI*YmQ+NbldAlQRh?L!)upVZ)|1{2;0gh38FD&8h#V{7tR&&J}I zX1?;dBqK}5XVyv;l(%?@IVMYj3lL4r)Wx9$<99}{B92UthUfHW3DvGth^Q0-=kcJ1 z!*I9xYAc$5N$~rXV>_VzPVv`6CeX(A_j3*ZkeB~lor#8O-k+0OOYzTkri@PVRRpOP zmBV|NKlJT?y4Q82er)@lK&P%CeLbRw8f+ZC9R)twg5ayJ-Va!hbpPlhs?>297lC8 zvD*WtsmSS{t{}hMPS;JjNf)`_WzqoEt~Pd0T;+_0g*?p=dEQ0#Aemzg_czxPUspzI z^H5oelpi$Z{#zG$emQJ#$q#|K%a0_x5`|;7XGMuQ7lQB9zsnh6b75B9@>ZatHR_6c z0(k}`kfHic{V|@;ghTu>UOZ_jFClp>UT#piDniL(5ZNYXWeW0VRfBerxamg4su5<; z(}Ct2AhR@I-ro0}DdZLRtgI@dm+V`cRZjgV-H+aXm5|Mgz`aZX63i<|oHk-E)cABn z0$NR?(>fla7)Ong28FZSi9Yk0LtYl5lZw5wT!K5=fYT$avgkMKJWx~V#i@7~6_{dM zxDDPIW2l{O2Elv#i^cjYg~lGHRj(W*9gD`(FILKY$R`tL2qo&rtU*c;li!V`O$aV{ z!m|n!FAB2>MR_FVN*Ktv5+2dW4rr3YmfEheyD+48%USM#q6)w%#2}~=5yZE1LLcth zF%VtefH&#AcMx7)JNC$P>~OFuG6sK}F7V$D7m!{ixz&inpAVpFXiu^QruAw@Sc7Y2 z_A^V(2W_+KTGRp2aQSMAgyV#b3@{?5q@hPEP6oF3^}|@8GuD6iKbX;!LI!L=P#Za zL$Zuv#=x3fseRMZ()#SQcXv->xW`C|6quwqL1M&KByBj z2V`}(uL4JB-hUs6304@%QL~S6VF^6ZI=e-Nm9Tc^7gWLd*HM-^S&0d1NuObw-Y3e> zqSXR3>u^~aDQx>tHzn9x?XRk}+__h_LvS~3Fa`#+m*MB9qG(g(GY-^;wO|i#x^?CR zVsOitW{)5m7YV{kb&Z!eXmI}pxP_^kI{}#_ zgjaG)(y7RO*u`io)9E{kXo@kDHrbP;mO`v2Hei32u~HxyuS)acL!R(MUiOKsKCRtv z#H4&dEtrDz|MLy<&(dV!`Pr-J2RVuX1OUME@1%*GzLOchqoc94!9QF$QnrTrRzl`K zYz}h+XD4&p|5Pg33fh+ch;6#w*H5`@6xA;;S5)H>i$}ii2d*l_1qHxY`L3g=t? z!-H0J5>kDt$4DQ{@V3$htxCI;N+$d^K^ad8q~&)NCV6wa5(D${P!Y2w(XF!8d0GpJ zRa=xLRQ;=8`J2+A334};LOIhU`HQ*0v4Upn?w|sciL|{AJSrG_(%-(W9EZb%>EAGG zpDY?z1rQLps`nbCtzqJ#@wxU4}(j!ZQ{`g`g*SXlLah*W9 zyuh)UWoRCknQtd~Lk#BT_qjwj&Kw8U)w=owaJ;A5ae}3)y>{neYNS`|VHJdcSEBF# zBJ6a;T)u;^i#L~LVF-X7!E$SggILXMlsEy~v}K*DM2)f@U~g|Q6I-Pss@)`>fgFWx zsq&7pe!|VA-h;@=fBF{(mR1^{1>ukTYUdyF^#A+(|I_&nm{_xaKn3h4&yMyym2k-wMFg(s@ez=DPmuB%`| z6;e@HQKB(|!PU1sW)W6~x|=8m6rL~4dQ9LTk|RzL-_(_77B4I~ZG=q7K%qHiv!FD8 zmt;Vnhb{ymaydv2V;X-5p zTt2ln?kaB9&(dH_X70^@rrCfz)nwfa9LYTHXO(IPcTEf$QiEhTpl??L+`Eetyqof8 zzl=q)?KdYni!C_9b8Z3xm7r5<5ZG-0uA`u^7Dm7k4mAsQ(rkoWy*^DZJa~#y6+hNG zh?7{D9$a9LS`a@SvZ5?C{JUHovWU9KI}z8YV4pWftx21v*Q;MpU{+b@>Or(}pwO^fu0qA3_k_Bo2}lIxvmMhucG-o>O=+R6YxZ zjs!o%K1AA*q#&bs@~%YA@C;}?!7yIml1`%lT3Cvq4)%A)U0o1)7HM;mm4-ZZK2`Lj zLo?!Kq1G1y1lk>$U~_tOW=%XFoyIui^Cdk511&V}x#n4JeB7>bpQkYIkpGQRHxH$L z%tS=WHC~upIXSem>=TTv?BLsQ37AO88(X+L1bI<;Bt>eY!}wjYoBn#2RGEP49&ZH-Z_}R_JK_ z>o*_y!pOI6?Vf*{x-XT;^(_0}2twfk`*)_lLl0H-g|}BC?dm7CU|^-gNJ~rx z($>97WTKf71$?2|V$Ybpf~Aj@ZZOcb3#uRq51%4^ts-#RMrJhgm|K3QpCsPGW=2dZ zAr5-HYX!D*o#Q&2;jL%X?0{}yH}j*(JC4ck;u%=a_D6CrXyBIM&O#7QWgc?@7MCsY zfH6&xgQmG$U6Miu$iF(*6d8Mq3Z+en_Fi`6VFF=i6L8+;Hr6J zmT=k0A2T{9Ghh9@)|G5R-<3A|qe_a#ipsFs6Yd!}Lcdl8k)I22-)F^4O&GP&1ljl~ z!REpRoer@}YTSWM&mueNci|^H?GbJcfC_Y@?Y+e4Yw?Qoy@VLy_8u2d#0W~C6j(pe zyO6SqpGhB-;)%3lwMGseMkWH0EgErnd9a_pLaxbWJug8$meJoY@o-5kNv&A$MJZ=U z^fXPLqV6m3#x%4V*OYD zUPS&WHikdN<{#Yj|EFQ`UojD4`Zh*CZO4Cv`w^&*FfqBi`iXsWg%%a< zk@*c%j1+xib(4q^nHHO^y5d8iNkvczbqZ5;^ZVu%*PJ!O?X-CoNP*&tOU!5%bwUEw zQN?P*a=KKlu{`7GoA}DE=#nDibRgecw>-*da~7&wgow}|DyCJq!-Lp8a~(zR@tO1 zgu(4s4HptPGn(HmN2ayYs@g+yx1n`nU3KM{tQHhMHBw7f#gwru$=C()`aKZAl^dYc ze7fC)8EZEXOryk6AD&-4L+4cJ&M@3;;{R)mi4=`ti7IZByr^|_HNsjcNFu?mIE)jD za2j)FPwRY!R_YR-P?URm0Pti*e#5jmfK)6EvaKCT{h)kbJl{AGr1Ekt}pG?^e z*botRf-RsB8q10BTroj{ZP**)2zkXTF+{9<4@$aNDreO7%tttKkR3z`3ljd?heAJEe<0%4zYK?};Ur*!a>PbGYFFi(OF-%wyzbKeBdbkjv^i9mn@UocSS z4;J%-Q$l`zb&r*Pb`U;3@qkc=8QaPE9KwmlVwAf01sa*uI2*N`9U^3*1lLsM9dJ(4 zZBkU}os|5YT#Z;PD8xVv!yo$-n{-n4JM5ukjnTciniiT`(cZ6sD6~67e5_?8am%!w zeCLUxq~7x-!Xg#PgKV&caC@7mu<86am{WaXo(lAemt4~I$utSp(URWpYNo$RvU*$N z#%iiA+h`(E;BUg;=I!#EaxO89bUK3*v5Nc3GPmURC5TqzC|))DsFNtJICH6oBW6#q z+B(N{ey+^mk_{!@ z)VhAWXG=_0j|0f9iJ;c404PiIFqK)(AD05Xh`Fk`r$^b`v+>*g+_+h@r)e+ELJ45) z?20~u<}HQyQ5AsBz(teF9!!_GLXnm{5Z0e{Ki*@!=&3x4-RcjBn##DDzHJ|KSZ5(E z9=tFZ)p~-}x%9sCY27)2i>(E-^OiYT?_)a;yXAGR$y+E`myMd;xDA#_Q49t*E}&ql#H~|x z2J2R1_#2lt91NnF!uqW%_=HlbF?A{B{n>}9$g5QF!bh_a7LTU~Jyz}7>W5{_LAov{ zy2_dmGy)d)&7^bJyUjEw%3xj{cuG0Eo zwL*XQB*Oi=r&HIIecC1%lbE;Y-*5|cL955S+2@uR18JDL<0;;Uc2Q9JEyo1R!!sz_ z#BqnkGfbLP#oQJk3y}nwMd(3Tt^PVA#zXnYF7D0W1)#+`i?@cm}fBkKD z+Mpcuim53|v7;8Tv(KraEyOK`HvJq^;rlNzOjIbW&HJDFqW>doN&j7)`RDv#v|PQ+ z03WnB4Y4X@Fe-@%3;He*FjY1MFmkyv0>64Cp~FIDKQTwmFP~_CxZOf{8gPy}I<=JC zo%_bmue&$UU0|GG%%99eI!m#5Y1MD3AsJqG#gt3u{%sj5&tQ&xZpP%fcKdYPtr<3$ zAeqgZ=vdjA;Xi##r%!J+yhK)TDP3%C7Y#J|&N^))dRk&qJSU*b;1W%t1;j#2{l~#{ zo8QYEny2AY>N{z4S6|uBzYp>7nP_tqX#!DfgQfeY6CO7ZRJ10&$5Rc+BEPb{ns!Bi z`y;v{>LQheel`}&OniUiNtQv@;EQP5iR&MitbPCYvoZgL76Tqu#lruAI`#g9F#j!= z^FLRVg0?m$=BCaL`u{ZnNKV>N`O$SuDvY`AoyfIzL9~ zo|bs1ADoXMr{tRGL% zA#cLu%kuMrYQXJq8(&qS|UYUxdCla(;SJLYIdQp)1luCxniVg~duy zUTPo9%ev2~W}Vbm-*=!DKv$%TktO$2rF~7-W-{ODp{sL%yQY_tcupR@HlA0f#^1l8 zbi>MV~o zz)zl1a?sGv)E}kP$4v3CQgTjpSJo?s>_$e>s2i+M^D5EfrwjFAo(8E%(^ROV0vz0o z-cg0jIk24n!wxZainfH)+?MGu@kg$XgaMY-^H}z^vG~XC7z2;p2Kv`b^3S#b5ssMOJ7724v>S36dD zeypxJ<=E~sD4f5wX060RIF-AR0#{Z z=&y$r8A-e6q18lIF{@O9Mi%dYSYT6erw!@zrl=uj>o(3=M*Bg4E$#bLhNUPO+Mn}>+IVN-`>5gM7tT7jre|&*_t;Tpk%PJL z%$qScr*q7OJ6?p&;VjEZ&*A;wHv2GdJ+fE;d(Qj#pmf2WL5#s^ZrXYC8x7)>5vq_7 zMCL}T{jNMA5`}6P5#PaMJDB2~TVt;!yEP)WEDAoi9PUt89S2Cj?+E0V(=_sv4Vn6b z_kS6~X!G;PKK>vZF@gWpg8Zuh%YX^2UYPdCg7?EH#^gkdOWpy(%RnXyyrhmJT~UJw zAR;%Zgb6z(mS+o9MT|Sc6O({!i0pzk;s9?Dq)%tTW3*XdM3zhPn*`z45$Bg!P4xfy zD*{>30*JsSk?bQ-DgG62v>Vw-w`SA}{*Za7%N(d-mr@~xq5&OvPa*F2Q3Mqzzf%Oe z4N$`+<=;f5_$9nBd=PhPRU>9_2N8M`tT<-fcvc&!qkoAo4J{e3&;6(YoF8Wd&A+>; z|MSKXb~83~{=byCWHm57tRs{!AI<5papN(zKssb_p_WT@0kL0T0Z5#KLbz%zfk?f7 zR!vXBs36XaNcq5usS7<>skM_*P$e*^8y1ksiuokbsGFQ_{-8BAMfu!Z6G=88;>Fxt z|F-RU{=9i6obkTa0k~L#g;9ot8GCSxjAsyeN~1;^E=o5`m%u7dO1C*nn1gklHCBUw z;R(LgZ}sHld`c%&=S+Vx%;_I1*36P`WYx%&AboA1W@P;BvuFW+ng*wh?^aH4-b7So zG?9kFs_6ma85@wo!Z`L)B#zQAZz{Mc7S%d<*_4cKYaKRSY`#<{w?}4*Z>f2gvK`P1 zfT~v?LkvzaxnV|3^^P5UZa1I@u*4>TdXADYkent$d1q;jzE~%v?@rFYC~jB;IM5n_U0;r>5Xmdu{;2%zCwa&n>vnRC^&+dUZKy zt=@Lfsb$dsMP}Bn;3sb+u76jBKX(|0P-^P!&CUJ!;M?R?z7)$0DXkMG*ccBLj+xI) zYP=jIl88MY5Jyf@wKN--x@We~_^#kM2#Xg$0yD+2Tu^MZ1w%AIpCToT-qQbctHpc_ z>Z97ECB%ak;R<4hEt6bVqgYm(!~^Yx9?6_FUDqQQVk=HETyWpi!O^`EZ_5AoSv@VbUzsqusIZ;yX!4CsMiznO}S{4e>^0`c<)c~mC#*{90@+T@%EQ~>bovc8n_$bvqkOU7CrYe8uI5~{3O7EijeX`js z-$LNz4pJA7_V5~JA_Wl*uSrQYSh9Wm($%@jowv^fSPW<~kK&M*hAleywHd?7v{`;Y zBhL2+-O+7QK_)7XOJAbdTV-S`!I)t~GE8z+fV7y;wp#!wj75drv;R*UdSh(}u$%{VSd0gLeFp;h6FkiVz%g=EY3G#>RU;alRy;vQmk*| z@x-ba0XKE%IyL4OYw6IXzMiS(q^UDk=t(#XgkuF`{P?=k8k3r)rmhkv`vg@kiWd34 z-~t+1aV3SabTbG=nQYs>3~E<}{5@0g**LAWi*~SfRZhGcgP{e5T!0M7CU}`f@r8xI z0bx%sI!?5);-wG+Mx&S=NRfIi>V-wP(n&$X0Bhd)qI^ch%96s6&u7qpiK8ijA=X_R zk&|9f$GXf-;VgnrxV83Cp-Q!!sHH`5O^o~qZu!xny1t?(Au(EAn)D??v<1Uo;#m7-M@ovk|()C(`o>QMTp}F?> zakm3bHBKUjH-MHXDow7#Z|@wea1X9ePH;%YA)fCZ9-MD)p^(p!2E`aU9nmJlm;CXQ zkx~$WQ`Yq{1h5k>E>Ex{Z=P=)N*0b8_O({IeKg?vqQ)hk=JHe z5iqUKm!~mLP0fnRwkCO(xxTV@&p+o8wdSP$jZofYP}yEkvSc z5yD-^>04{zTP7X44q9Af&-wgt7k|XtncO&L@y-wFFR44RsPu57FRvIBaI^Pqy_*DV z@i13CsaR5@X@xH=NT3}T`_vsy!a02n80eQqya=-p7#YW`Jc0z!QglGg`1zeg6uXwI zsB~hlNMo)kFL(V3Q1<%8yoI6X7ncn-&&Uh3rL@S(6@wKAXt6Wr=a2ObI7}8$D-FoI z>AJA>WsBEMi5ba6JhJ%9EAi&ocd(ZsD|MsXwu@X;2h#|(bSWu@2{+c7soC`%uo{sMYq&Vyufb)?OI59ds)O+kyE8@G z@tlpNr0UO~}qd0HQve6njJ zda2+l$gdX7AvvGhxM6OToCuQ|Zw|9!g1)O+7>~{KNvASjp9#Cqce-or+y5xdzWL3gLWt2oa+T(I+{j(&bF1laUsJB{fOgE-B}qslaS>C z)TjzG8XecbS%a+?yT!0QmTex?E478;D|sL*oS4C-g0Tq(YoH|eyxJ#1j088C|U-w5id`%Sz7X_w#l+U9+)$|2no<}5J zRb_9@0esSr?n}HvVGbD5@$p$8k4?qOe-GNOk3-K^Mw>Xg+drCKi5@$GTeijpI;;IG ziD<&go`ptLC&^<0jw^l0aY?_pUUK+xp#0Bk66iQ29vpR)VBE{JOJ&OL^gKsN<&t<| zCMLTYMSDG5Ie9O>6Dl#T{@cscz%)}?tC#?rj>iwQ0!YUk~R z$rB-k=fa9x&631Z9Mfqj_GRoS1MzqSMEdaZ2!isP19Sr>qG8!yL(WWF)_&{F)r>KnJGSciSp!P0fqHr+G=fGO02Q#9gHK zpwz+yhpC4w*<9JO@#(MdkZcWbdCO5B!H`Z|nV?UtcBo96$BgX+7VYMwp@b-%;BrJu zMd*K!{1txv{kHKPDs9?WZrz_^o1Tq2P=+=|E=Oy4#WE{>9}*9(apqhmE`&AeBzQgQ zELFLCmb~q|6y0FCt|B}*uI*ayZ#6=$BpGtF{Jfye#Q>FZ?BPnk)*Qmd?rNG^tvFUU z_b&antYsZnUR6Q9tQUy81r$&ovT#fy;(Db4F&M*C=KxQgHDrRcVR#d+ z0(D|*9#u`w_%2o3faI{?dNd9$#5nj1PROHNq z7HJ(;7B1ThyM>a@Fo^lJb2ls2lD`}ocREH|5pKN;$>gFyM6k)kZG;lA;@kSJIqUhf zX%dhcN(Jtomz4(rNng&1br3Xx33EvCWz%o8s;SpRiKEUFd+KJ+u|gn|J85dZ)Exc&=V|Ns8Xs#P>qv6PX&VAJXJ(ILZO!WJd0 z`+|f5HrEj~isRN7?dBHotcPI7;6W48*%J(9 zftl1Tr`bKH*WNdFx+h;BZ+`p!qKl~|Zt5izh}#pU9FQKE97#$@*pf38Hr8A+`N+50U3$6h%^!4fBN zjh^cl#8qW5OZbvxCfYzKHuyeKLF4z^@~+oqlz9(Hx8vypIiUlt!(vs}_t#4@nh$s; z>FYERg*KD#Xs+W4q-V-IBQK!)M1)Aa+h+V+is)z!_=gEn&^ci7<DEEmYcoSh?WdXUsP7O4)&lQXA(BVM5jI8s6;mO}94AC0gG(`>|T)yuV1l~i-ejCCt zoejDhX0nrZDP|x9u4zp%S2UeDzV`o#pBGu1tZ-$<9TIbN=ALwhQ0=9S{8#}Uu8n-~ z5~xIvUhLSz@c@0|me$CdZCpZl(vQw@a0Y4^{T0w_>pOkwI^x4KkBf3qGmm)nG|Ps5 z_XTY~^b^mL&_*yjl~RRIi&eS(>y?y}O4-)nWyTEPpQAb#Xz8SnnfIL+nAcNL9nqV9 zRL|eyF)RKI5-kJO6}>Q89XmgY@b1&!JI>g3ryZ@jN2v3vm7O`AL!BTWNouJzV+$+Y zYY}u%i>K6=IYU2O$2TAyVjGt?wgF9xCj;?EK(8fWu!!~48`3u^W$eUlCh*91PLxu1 zRY(F7Q3s7h$Q-p&L$ucN}it*-9KR z_<wHu?!dav0$P+PI3{J8?{+l|n&2YMLV2 z+hRta$A5WpCXl1RNbYBsX8IGX{2v>U|8_I-JD56K|GexW>}F_e_g_1r?08v8Kz{V$ zT=6aGMk>ibvRO@Yrc@ezaD0%ydHkXGHrR{7>q~~tO7ChJflwa4-xL|@#YIJejC5VT zInU4CjQ9V0+lClQY=vh^s4MadwQmk7li{54Y;Ht}gkZOIh9(vfK?3kXLoD72!lHD# zwI-Jg|IhT=Y#s|tso1PWp;|aJ2}M?Y{ETyYG<86woO_b+WVRh<9eJu#i5jxKu(s~3 z4mz+@3=aNl^xt{E2_xewFIsHJfCzEkqQ0<7e|{vT>{;WlICA|DW4c@^A*osWudRAP zJut4A^wh@}XW4*&iFq|rOUqg*x%1F+hu3U6Am;CLXMF&({;q0uEWG2w2lZtg)prt` z=5@!oRH~lpncz1yO4+)?>NkO4NEgP4U~VPmfw~CEWo`!#AeTySp3qOE#{oUW>FwHkZ3rBaFeISHfiVSB7%}M) z=10EZ1Ec&l;4 zG98m5sU!pVqojGEFh8P{2|!ReQ&hfDEH2dmTVkrS;$dN~G2v-qnxn^A2VeHqY@;P} zudZD5vHtVvB*loIDF1M7AEEvS&h0;X`u}!1vj6S-NmdbeL=r{*T2J6^VA7F`S`CDd zY|=AA6|9Tu8>ND6fQhfK4;L3vAdJPBA}d6YOyKP&ZVi%z6{lbkE|VyB*p1_julR^k zqBwjkqmFK=u&e8MfArjW-(Ei8{rWso1vt5NhUdN|zpXqK{ylJ8@}wq-nV~L4bIjtt zt$&(1FTIs+aw}{&0SO4*sa0H2h&7g}VN5uYjfed5h7eGp$2Wu*@m9WIr0kxOc}fX9eOWh zFKfV>+SD$@kESKYm{F*J90XQjr$!<~v(J%&RMuQM+6CkmnYZDGlOUdq}%)VA& zl#acS%XE2KuX~7IamK`og@C`21~*cEEc#PZM6HT*Veb_l&Ej~j0zL7p0Eo`mMu(=X zJ$v;&Lya75I4C^saKROgfi(fdP0C$GM3WyZn%mm3yEI>|S&O(u{{S<}ihUp#`X&_z zmQBma;82#`C;dR5Sx09e07FvtJLhZ{9R~|$FCdU6TDNUwTc9kNct?8e@o2MpQDrkg zN?G+aYtTjiUPA=RX5o{4RYu}6;)ET>TcgL^VpfIpluJ|lQR(_)>6k%L^FZmoK-Wm- zR5qy0P)hm8yvqOL>>Z;k4U}!s?%1~7v7K~m+gh=0c9Ip_9UC3nwr$%^I>yU6`;2kV z-uJ%y-afzA7;BC7jc-=XnpHK+Kf*tcOS>f5ab2&J&5hIOfXzs=&cz|Qmrpu6Z);`R z0%3^dioK5x?o7t~SK7u5m{dyUZ#QUPqBHYn@jETeG>VU=ieZuJ;mm^j>dZM7))cw?a`w8R z%3M0R=kdOt^W^$Kq5Z%aJ(a$(*qFpy^W}Ij$h+Jnmc9eaP(vB@{@8t zz=RQ$x4XYC#enS$fxh@;cSZ|D%7ug;0z{C8I8h{KocN-cyv3UG_nk99UNS4ki^OFkYea`q`rs zG@qdMI;4ogcd5Tr`di1JBg4I*6CFvCID_2SN5&)DZG&wXW{|c+BdQ4)G9_{YGA@A* zaf}o^hQFJCFtzt&*ua~%3NylCjLtqWTfmA-@zw;@*?d&RE3O8G&d;AVC|rZrU}jx# zC-9SF`9;CbQ(?07o8Q9E12vi)EP@tOIYKEKnO@-o!ggkC)^#L-c40iZtb4Y-cS>$I zTn~+>rn*Ts>*y*z^b3-fAlne+M-*%ecrI^rmKAVv23cB`aWD?JDJ5NIafRvRr*~~C z)99Afs`BPK!5BFT)b_^8GyH*{22}yDq;be`GnPl=vW+ITnaqzl(uYOHhXi}S!P+QZ z4SwfEPuu&z4t#?6Zaw}bvN{;|80DfxCTuOdz-}iY%AO}SBj1nx1(*F%3A-zdxU0aj z`zzw9-l?C(2H7rtBA*_)*rea>G?SnBgv#L)17oe57KFyDgzE36&tlDunHKKW$?}ta ztJc>6h<^^#x1@iTYrc}__pe0yf1OnQmoTjWaCG`#Cbdb?g5kXaXd-7;tfx?>Y-gI| zt7_K}yT5WM-2?bD-}ym*?~sZ{FgkQ9tXFSF zls=QGy?fZ=+(@M>P3Y>@O{f44yU^fP>zNzIQ0(&O$JCd_!p?2;} zI6E1j@`DxzgJvqcE@zgapQ?tophO14`=14DUZ*#@%rRi``pi0lkNgidSsHGjXK8gO{drQoNqR&tRjM4>^DtW`)fiRFO4LE=Z+nCBS~|B3gZsh`Y?-$g z@8@Z$D7C!L9l=SWoE;(+*YirPLWvBd$5Ztn3J3EaGM+#pW#@{3%yksGqy(2Bt5PVE zf*fICtPp77%}5j#0G8<=v=)LR>-a3dxja8cy3m$=MZ2#$8mbLvxE%NptMd+L?mG`v zF1cANFv17DqP^P5)AYHDQWHk*s~HFq6OaJ3h#BUqUOMkh)~!(ptZ2WP!_$TBV}!@>Ta#eQS_{ffgpfiRbyw1f)X4S z_iU`lNuTy86;%!sF3yh?$5zjW4F?6E9Ts-TnA zDyx5p1h$Z3IsHv7b*Q{5(bkPc{f`2Wfxg*Z#IvQ;W_q9|GqXGj<@abo)FyPtzI~i25&o zC!cJR%0!}lLf^L2eAfZg7Z69wp{J?D6UhXr%vvAn?%)7Ngct4Hrs@LZqD9qFHYAWy z4l=2LI?ER&$He2n`RiG&nsfLv?8$Cl)&d8a-~-N`I|&EPa@Y=v@>0Gl?jlt>AUY;H z`**5bpS#VGhdp4pKbf3iEF*>-eXg_$bqt5Dc%q0+)R50>zd^l7sN5R5Z)Ut+oz-8_ zJ`Z9HE9(=wRTD)T=%GZTEi9K5naPzlfE$|3GYGLRCLsnqLi8Sc6y&iskqA&Z$#7Ng z7Q@C0)6k;J$TlQ+VKZ5)-Ff_BNoIMm+~!@Cv1yAUI-U!R)LHc@+nSUzo$GlRb+8W< zYPG%NFfr;!(RlnvBbN~~EpT6Xj5*^Z&73tdIQ$LZu`vkfzdTKa5|JJtQ_rm4g$9LO zKtgYVdW=b<2WGM3I_j|Rd8gZ3j;)S#AT(aP^d>9wrtQS_+K>pZDX^?mN!Z>f^jP@1 zlJ;i79_MgOAJa`%S9EdVn>ip{d!k6c5%zizdIoB9Nr!n`*X#%6xP1?vHKc6*6+vKx zmEt|f^02)S_u_wlW_<`7uLQU%{wdH0iojOf_=}2=(krE<*!~kn%==#0Zz`?8v@4gP zPB=-O-W=OO3tD19%eX>PZj3YfrCt0sEjgTd#b$buAgBri#)wW14x7QcHf2Cneuizz z368r7`zpf`YltXY9|2V{stf8VCHgKXVGjv$m!hdDf0gi`(Q!(Pyg~FO28Vr#!BYP| zI)qG2?Ho=1Us9dTml}-ZOR?g5Vk)f+r=dbCN*N1=qNfG>UCLeA8pd3Ub-pRx1b3FA zEn`CIMf`2Mt3>>#3RkE19o}aMzi^C`+Z>8iIPHSdTdmjCdJBtNmd9o0^LrJc9|U9c zD~=FUnSyghk7jScMWT|SHkP(&DK$Z=n&lGm+FDTpGxfoIyKV)H6^nY~INQ#=OtIT! zyB*J=(#oHf=S)MNOncW->!c0r0H#=2QzobO&f@x&Y8sYi-)Ld;83zO$9@nPPhD}yt z{P`*fT@Z(?YAmF{1)C;o?G@dfd2$c+=Av*|;P@Yz1KnclB-Z-fJQ-=+T*g>0B7!g# zQH{dHt_%wj=wlmT&m59)TQ~xK)gB6f^EY$=1zcbGf~Q>p_PzDCHR6lndGmqPY2)&w z$Th^K%1v@KeY-5DpLr4zeJcHqB`HqX0A$e)AIm(Y(hNQk5uqovcuch0v=`DU5YC3y z-5i&?5@i$icVgS3@YrU<+aBw+WUaTr5Ya9$)S>!<@Q?5PsQIz560=q4wGE3Ycs*vK z8@ys>cpbG8Ff74#oVzfy)S@LK27V5-0h|;_~=j1TTZ9_1LrbBUHb?)F4fc)&F7hX1v160!vJc!aRI>vp*bYK=CB(Qbtw7 zDr2O^J%%#zHa7M5hGBh#8(2IBAk}zdhAk$`=QYe^0P6Bb+j5X)Grmi$ z6YH?*kx9hX>KCI04iaM_wzSVD+%EWS)@DR&nWsSBc2VIZ>C(jX((ZiV0=cp}rtTO&|GMvbmE4FpBF5Rd z6ZG=>X&>N3?ZN2^11pXEP4L?XUo`qrwxgQm4X~RCttXmZAhnhu4KDK=VkKq?@@Q_Z za`*xyHrsAEsR zV(7)2+|h)%EHHLD3>Qg{>G|ns_%5g5aSzA#z91R zMDKNuIt@|t?PkPsjCxUy&fu^At*yUYdBV!R_KOyVb?DO&z$GLJh9~b|3ELsysL7U6 zp24`RH+;%C(!bWHtX&*bF!l-jEXsR_|K~XL+9c+$`<11IzZ4>se?JZh1Ds60y#7sW zoh+O!Tuqd}w)1VxzL>W?;A=$xf1Os={m;|NbvBxm+JC@H^Fj$J=?t2XqL|2KWl$3+ zz$K+#_-KW(t)MEg6zBSF8XqU$IUhHj+&VwsZqd7) ztjz$#CZrccfmFdi_1$#&wl~A*RisBaBy~)w|txu1QrvR1?)2mb&m2N$C(5MS%hSX)VJnb@ZGXB5^%(<#1L@ zL^>fBd+dEe`&hxXM<0A9tviIs^BDkByJdc~mtTYr!%F7Q1XnK2$%h$Ob30*hSP$Bt zDd#w{2Z%x^Wpv8!)hm>6u01mY!xmPgwZ#Q0148)SxJc3Udt!-&}eRO^LN ze26pQB!Jhg&Z>#FD>`C`sU44><=v>O>tJdLs!HPpV#AM32^J@Za-9J(CQjKxpzXao zQfRkWP%g9P8XV21MmoHfx{DICLSc*t4qVeQL9t}&Pz0rM}YTba@XsD=XMW@FxFM{QYQJHvM(JsUSa3mcTUl9^qcVA zBveO--fqw%{#QGR1vy;x88+qMcgzmcYc#8U`CPPt6bl?uj%w_`b~9JliftnOa|ziW z|6(q&STs_*0{KNa(Z79@{`X&JY1^+;Xa69b|Dd7D&H!hVf6&hh4NZ5v0pt&DEsMpo zMr0ak4U%PP5+e(ja@sKj)2IONU+B`cVR&53WbXAm5=K>~>@0Qh7kK*=iU^KaC~-ir zYFQA7@!SSrZyYEp95i%GCj*1WgtDId*icG=rKu~O#ZtEB2^+&4+s_Tv1;2OIjh~pG zcfHczxNp>;OeocnVoL-HyKU!i!v0vWF_jJs&O1zm%4%40S7_FVNX1;R4h^c1u9V@f z`YzP6l>w>%a#*jk(Y82xQ@`@L(*zD&H>NY`iH(iyEU5R$qwTKC5jm4>BikQGHp^)u z-RQ`UCa70hJaYQeA=HtU1;fyxkcB2oY&q&->r-G9pis)t$`508$?eDDueFdW=n5hJ z08lH$dKN$y#OEE@k{#|<%GYY=_c~fHfC@pD54KSP9{Ek@T47ez$;m$}iwR}3?)hbkwS$@p2iVH0IM$lB*XYA+#}-re|UNzCE)SOYwy z=Y!fkG4&I%3J(_H#UsV#SjHulRIVcpJ`utDTY{k&6?#fzt~@Om=L(vs6cxAJxkIWI z@H7)f2h%9!jl@C!lm+X4uu;TT6o0pd7 zteFQ(ND@djf#o2kTkjcgT=dHs7ukmP0&l8{f;o3JuHGd2Op*?p7?Ct=jA*tIg{MZk z$2Lsc0e8Tdcwrjx|_Ok?9uB3Il|^2FF%X#ck}WoIvrzQXN%kT$9NI{79Wm~gZ3`8I+O`)`n30feZ( zDO-fl6IG3c^8S;Y_M-)+^CmM0tT^g0?H#>H8!oC8W%oU!~3|DJ?)~LT9*&GAQG13zOGq6gs*={cu|(V7{R$y@{-iV*9q@AD(#Ktb}J&3&k|5Djs$)9WM7!6#EaJ_ilvbfUvyh8c?-{n zfuFrC0u6}UJZ7aj@(cNG_(CKgjQQTA-UK@-MVmick zot}6F%@jhq(*}!rVFp5d6?dg|G}M*moyLriI!PQDI;E1L1eOa6>F9E6&mdLD>^0jJ z09l?1PptuV65gm=)VYiv<5?*<+MH~*G|$~9Z3XEy@B1-M(}o&*Fr9Sv6NYAP#`h{p zbwbUE3xeJ;vD}QMqECN)!yvDHRwb7c1s6IRmW!094`?Fm!l~45w)0X`Hg+6Y0-xf# zSMemBdE)Q=e^58HR{kWrL5-H0X6pDu%o{0=#!KxGp0A;6{N5kI+EoY_eTE%2q|rwm zekNeLY-R?htk!YP2|@dbd8TWG4#G)=bXlE{^ZTb^Q$}Er zz)Fp)ul24tBtQFIegdI37`K$VR3tVdi<(fIsu{#QMx=$&CK9M8oN%3Mk;>ZPd-;Q- zn|sSKSnc-S0yrw#TlA$+p{J~u=u98s>IoL@cNLOxH=+1m?;t1bR$vR=M$US&Z8DO3 z_&zhQuId1$wVNsS=X?&s(ecIi#00o{kuPs6kpYkL$jMyGW8U7mlCVaZeEL=HsIxqm zFRLxWin8B>!Dc#9Z#t0RNQiR-@5J+=;tC7|1D*~rxcwHa5iIVD@99cCFE@BukUC-S z^iJdt?dwU)kH2VY9?|zVShMbZctzFRz5Q4tiXa^>@U%jDYq}$rSyc#p2wXr}mc0qq z^lT>$y)N(Qg0dwmEwTopneoU(y)>Mj+f{iHM0o|>ZtCg-itPj4addYz??aE)Rp&hk z_SI)%XeSf=SjZq18h!Cc>Xy&EynnxdHQ){(x@g|ZA%`3LU^KzX02c5N;F#tEk1)7v z(|V9tO3>?^X|kQ*rRBf4>mWW2$-Lx})|M7z125&VHcxsCqB!<$l1F$zCrJ+nm0f3Z z%Hq^=SKpHyV2@Y*Cu2x>fXC0SscnR*($zEB{KOniJcpn@e`PMH*_Q6*0Z^8RNCEvZ z+UU9!927p9YZ&g=bnUvQUZcdisyn;-4;ACXOe-Xor9K8Qbp{ldE17+G@VQT+9ZJQ*9dZoXfU2ue|mMhrrZk2R7&~YjFW4`BTq45UwVc6JORKU)wBCTanITh0GD}s$`C5pb(9{b9 znwee6j%?-UV)_7opOioCf5@C?@w^@g& z&68+oMmV;5JW@TT63&CSDrfYL2$L)pVseDtAwPwleEM3F^-Ufn3PpfxFmx6o zQ`Wq9x#d$e`VKn5LOXNsrqhGao7~|s(u~drPrZ+;aP!C%z4NskZstCbAibD}O%8Ij zb~C(taxco~WzJLxhL1T}3ctXMbV6}_z=IZN9L0|SxLSe`$X`<)BhM`$1&&)e_}fCh z=idVL<+u6Vn{&ksP*ZLlMo$fC`dtzF_?~L?4Rril2G4%v5^7sUa^&8aMtMX&mtapl zD(dW|cisM3fqMaB`8?QbkyiUl2g>hMB5EoS&IB8TdoC~)b$nT=`%GgU`k-)+8}`)F*~I~DXMaTP%kZftx11~?iALs5J+&Rom#p%Y z>dH}-euH4u=_V3hc6^*2WMtL!9%yRTJ93p}@aV0zdY*?xchFI>m+UivV=;aMFp0P~ zwB8P)wvV6D-GL?6hJ#g7Hy7=2i^&Od#S=j!;Rc_yjO!*4aN7{vqzg2t-R|Dav%_NDk z`H_FVlSi==(~f-#65VmQ{EE92x<03lwo5p)s=ZJ^L7PlS>132Whr zR6v~t(#I+(`usYLCoO;Rt8j&b^5g_xgs*98Gp|N}b>-`HtVm)MscD)71y?(K6DRCZV26RsHPHKk)EKKZA%C99t3$t^B0-k5@?E>A-YMbFe?>ms?J?_guHHNU(;id*>xH zTrtam+Aq?n@-y@uY@A?hy?1qX^eLu_RaH4Ave?A8NapgQF=C%XI7wlcCf4<6BRo_% zBXxxc*A6-3CruF?3i8HOdbc%>N=-iiOF+9HX|ht6SCkz;A^am&qi_I&qk1B(x<=(m z>QG)nswCOLl_1{SZ@_eE#m^qb6#6DoMsB*)`17ui+XvF%(}|J4G$z2G*;E!1ERnAH z@q%=#uV6kBddqy4=g>!VTV)9*1=i{wJ}Ep!I*?)uJdA(LwE?(!?;}_u=^M2NShWC_ z*7l4aBJ=!QVU2-iehgb`$vOI8zkm{W%QO~?xOD;NgI;Iqa3#^$^U5D&McReLe&qs# zR<^@QpR4#W~Laz+QBsPt@3L#KF`Yr8}jgHe;5(cfpQ=;Zjtbt;c%y^#-m=hqOT z;KAYakW+$w0&F}>K10&SiPcD9SrDOuczj@U#W})5jGU-_htU`U6Q%wdy((%?J}y+$ z=$4jw1N nJo)qTxG{D(`3*#8tY|67hJRF;)r6F|#I`Ar6I0aafRa=kr-Z0I^}9xf^u;G5iEQCbpv3b#S#%H|HYHsQaHK$! zU#3Fpz8*^pK%RRmX<_09eIVziB0jOgPgFnI-*QcwEBtBiO#v!>{W1cLNXyw3D9M|A z*oGy(u8BkDA1c;MsXmpK^-~pl=We^RYnhZ4bz*)Q)C2G+E3tgx9PzU0T>c|1ilS!T zyE=bz`=wskDiOi!@!l?Y))#%{FM`}7r~X)i1)1*c6_2Q!_1{)fp%cS|YF+Q-CB%d< z=zYus`Vt@Mx*a7V)=mpLS$-5viaKgNB=+zN657qy0qR94!cTtX-Z%KBCg4OKw7b=t zr=`7q5Ox=lJ%!G5WIyNQC1xpqYU0{!I$hyrk!6%De$gp<_*Gc?ES(OwY8U^)Kjgc{ zSlhpXDb|;{+y9`u{EuMz54rlky2~p6xX2>MV6BZ&k`$q%q7v(xYps2wr9e8^4<;CB zc)eAT~B^rjzO6<4BDDH;il6 zFsM8jL+agQ;zazW(uiQjM%fPf2N~_p{cy29XP11_lQFpt`t#9nlk}>fv((FZt-dBa zuMIc4HmPHW04n0TTG9ug9;&OV9euL$Ib|+M7}}L~z4e%%%b|r~6OQj(S2d7XfYn#xp8;KQ55UYu#gY*De5j6Cc z#R%?rqwpy7I1(kpU7B*Pq=etXeYUn04jg%ZPjYqQNa$==yTG=6KX+=;i2Xg+kjV2T*Gc!(ef z`Q4fR*TA=M5-}z+s%YO+!K{k}S**ic&>o4_Tmv$EQTOp7F6TXPCj-UTXy?OQ=%*y62Qajk{rXbR%jMCOFMiVE3KekQa4xR}B%=iPtd8BXo~q$OX_ zSp910{Ew;m|GATsq_XiJ3w@s(jrj^NDtr(Dp!`Ve!Oq?|EJ9=vY2>IfrV{rT%(jiY zi}W@jA2iqd=?q>s;3%?@oi7~Ndo3Ge-2!zX58j(w&zVlPuXm3rcHb7O0RsM|!Ys(b zh(=*&Aywo3vuJoWZnU!u2_4bNkDTc&&bCYc%T zM~~xYxS#3KXFzQ@OXdc%9QDOxqiTd_> zT;(DX9{5dIuC4pO_xy+3{Ov)1I7j!Z)6&nHUvTRP>VU5dm#849icG)cvl0QOPkCIzG^lOp4#UcNr`VhBp(Ha%8@KPlvT*5u!v_$b#b~%sn3K{mu zaxeD%Q~{;Lw03ZAq(Pc-IVj>n*h3l2{sqioCMGatQY0kx zi`1(WWDQ=;gmLSGptEQ%UFC)th@|71<8eiRtX&Mx@#1q#nMF_BMfQdS>!!Qkx2o}= zuqRi?`UOX5P3fP%M+71Q$ctH4Av}bXED#fQ`KR4!b~60nsAv^*M7c-x`|~B}XIuq% zlqIJOf>WvlhQ@Uw$du|14)tZ?; zPNZ|xZSwp1y+d4sut8E4*l2JWR|~o0A9vD-?zC-w zDc@=wE1YKb*OMSi_Kx}&w;#h3>sHp|8^hnA3w?-WK)X?@Z2dgV7`9Cupf-B2RE4x^ zwlw+~!V9C^tyb`J;m2}ksD`w}G9`yu(^--{SQ+wt^Fu4Li~Fft!3QO`upSkAU?o;# z(1Q%GUVWbbkTK-M=T+ULkk3s6Dc9`G4CO6|=&-S&D+rbJQ$`Y-xL~ol;kc(l)VbU>{&>bV+*?ua;$bnDc29RW+Ig16)Vf6=L|fMR_P2b7>6}0 zdlB#-gj|j*C~M=F^2=K*k~=tl6YM3SXXi&K-`EvEXnWz&4D-^hQRBJI3gKKDj^6|> z*WhHSim1qAffNt60Mve9lfw^+&0bx-AM0%j>QP3%W=S@(l=(nrJ678mRQ(#+sI@d{ zdb#5fo#T;hK7xJ=M58wZf|?DHwD%!OZ3JrTGV5#{cfQwuiMvz%!CQ}CubJ7`z?@rSF<+KHNV2goc)a6hP0oHB@3LLKSH2w{um&J*z1Ka2 zLIR>lvOvh>Oxe%?3A@v<_T|}${zf_&@C~^FCo#jB(W9VLO?DX{)n(BQ0(V0`mI|9Y z#U3WwxixJkU_NTvA>5q(A@r2dnEXJp#6B=pww$XGU}~1~c``UKqQb=^*2P|4Dq*_! zhY^i61Sy%T5$Td0O6^C>h(xVvT!}Y##WeT8+s+Uuz=7)~V$>!zU;%d>H)rm*6^IrsCma%|cifwDLk_ z!^W2voQ)D;I$=v2E>iSaBw!d7aD+|LWl2iD!cBw`Q5p1~fk_xGiPi8e^mY&#viTAk zmaKL8m;JQ4bY(n6uBZt02z#noMMxTfF-RzjKre-c+@B)#J3pN-Zv7F}JtAwNk3j?OkpVCL6W1)Q$FLAj zGI!tX;g`O{%pt=0|q54Jyj##w*4e*|_;Us2Tn?!#^R(>u}|FAw1G_ z#wQsagnj9$TAC`2B_XgB$wNq~Sxgl?#0+QWWcB{G`c6~&SosbtRt}Tukw`TQ!oG1= zYyL(y<;Wh+H24>=E}Gs=Hs2%fg;&Qdvr74{E!R?Bd zIRQ?{{xkLJ_44P@y3^#(Be%(pk%$liKbUUo76wSoVfJmt9iTKL3z{uW6L&?jYg>EY zsx{kRiW@q%<$VZvbS(TKKTO4{Ad6l^IeY(F^3}=mX9|FZmQ`~RErNxlBPl3ast}W$T4V?SW=6kIGn@-^`qJv| zZXwhK4Kl1a4E}nLI`rdOi?^pd6;LZ-|8G&INHgOeC5q{_#s+SXb0r(;5ryHFsoTJD zx$VtNDh=-Tx3t!NTlk=hgAaSM)#U}e>_-Ex(|JoX*hWmBPPdTIa-2(BIOUJ|Iddy| zwY*J%z%W$}*;uSoB!BIJB6N6UhQUIQE_yz_qzI>J^KBi}BY>=s6i!&Tc@qiz!=i?7 zxiX$U`wY+pL|g$eMs`>($`tgd_(wYg79#sL4Fo+aAXig?OQz2#X0Qak(8U8^&8==C z#-0^IygzQfJG4SWwS5vko2aaOJn*kM+f1-)aG{T43VJAgxdP(fJ4&U{XR90*#a)G8+clOwdF?hJ?D) zmxu>0>M|g_QRHe_7G|q6o`C>9x4xd$Gl7lAuR~+FtNid=%DRsnf}YI*yOToWO%xnP zY*1G5yDnTGv{{xg5FhWU65q3-|-(+-rJ2WCeSJn(7Az>ej4Jp9+l-GyZ_| zJ8}>iA4g|}q1AhEEv#uWR&$g&Uyht?fVU(qk(j?^D`))s>oG08pow!f>P1u71P%oL2)UC4GeS87&G?{)NE;D=my1Q9{~;y zJULE=bG6jXE28Y11YmoZoo945`MM*`v%5b=_02*0cwzDve#3(4M}NPt`)?SCa|7*q z-94ks(R6WH-l9fE4m4}10WSu&O`|;ZCIT%vL$_pbABY!}s33@~gIvZ0H4co|=_-T$ zF#lC7r`89_+RL9wYN=E3YwR?2{$^ki(KKd>smX(Wh*^VmQh|Ob5$n_%N{!{9xP~LJO0^=V?BK8AbCEFBhDd$^yih$>U z(o{RReCU{#zHSEavFNdc8Yt<%N9pd1flD{ZVSWQu*ea1t#$J5f6*6;tCx=&;EIN^S}*3s%=M#)`~=nz!&Q0&{EP|9nzWyS<#!QxP;!E8&3D}?QKh^ zqGum|+;xu9QE=F#fe2ws5+y1Igr&l`fLyLKry=1}(W+2W`waeOR`ZXlW1B{|;4sE3 zn^ZVlR11hiV~p<~TaSen8I~ay#7Ql=-_|U@$8yjZsZ=Vi+^`JV2+kn+oiSUi%omO_+7}saXnJ9 z5ETilbag(g#jZPopCgJu+n@(i7g}3EK2@N zd64$77H5a`i%b%a^iRjMaprwzWz(`=7E6QY)o)gek7H)yZ-BLw^6FAoHwTj9nJtWc ztKaytMlWGLg29W{?gr|rx&snb@XyvR_}x3fmC>d=-nQp5ab3*whTw}DfUcKlMDDx` z-%?ek^*|Kqooy#>2lfklZ|jN4X$&n6f)RNNPl(+0S>t(8xSeOGj~X0CGRrWmm(WXT z))DDW_t&y$D#2`9<-+JT0x1==26*gpWPV~IF=rePVF%e-I&y$@5eo~A+>yZ&z6&7> z*INESfBHGNegTWga&d@;n;FSCGyW?}e_Qw#GTLHo*fWxuuG@I~5VA!A1pOdRTiPA~ z^AGe(yo=9bwLJD}@oDf$d+34~=(vIuPtOKiP}obDc|?@hY}J*@V|UynBeAkYa?S{@ z_f$U=K+>deTAi&=a*xv>Ruyw$UsTWY=Yn=xjf;s)6NQu>_niQ_idmzIwuL`Scf)f= zyzK?D5a5)^D@H&qN%F6Zd0JeXX*Knbe~VLe^gi|?JK67&mB4jrapV-$`hCQT;C{%T z*pjxB+Y|~LD9bmMN%Iq}S$F$x1yWU7@GcR91V8h;!O2I5MN_rq*gRx(k8T!1WSDTp zr9eJO4$~H94aG^6k5p8k=kFJ>4lnY0q_Bsa$@vTRW6uY?slH|Qt)Yu6Yun&pfJ zBi!h;6x?FDs&79#PT*HSCEUsKws#s%TFy*=2PAfb`>gEPBn+D-WdfXA?MkB=<8kb_ z1+4D11mdHG0EcAyg4dneLtfJ8)RyHQl@6hWJNe(d_EjyCHf7%Xsd)S4A-4COz{G@% z5xQ!P>AS@H@;4Ws)N91)3A6PleMe2<& z!(zv#%Uc?N`(Xmm)OJPYt)BM`nRjoWA&P0Yxl@c9Y02zlPH1J5l$nhPrMwu=atkz4 z)a-1+OEL;d@ctx=s<<+3Sv1VYy0RYmiji|#hy$66#`5;u~BkH4^$EGZ-Y4xyZ=%3KuaeLYKAUr$xMtIh_5mga> zPz<#G0mQ7IxEw-yO}BueN}RaFlg$RwCDB)vLF$wDu%qZyLYsPKdcbHD23$qn9i#JFqIo#OK?u7db2-$GatzO!On87%}Br};~#}n zziVB;qf_4(K$u>Qyz$ln_kBGS!CD-t4Y}9oxL@7@Sx*?NOAzdeINUD>Hl#*V%pfA; zSA`==YatS*G*crJ3`3ll4)vKss&)UtY#7ZxiVoG%9(4<%`WWcjX2jV(^g7Yhj+h5J z$5=?S=tuCyEt74^6jo@6y|@~N>&cVfFNtaRl=)Gm!vR;Bc$3-;ySCI$%kdmjQ|si` z{$q_YCe6vjy6re9jGN|`43D``)1PODtz0)vhV4XV36nVpOnMx2uM%qZ<3TtcI%>BQ zf0(J`{JqPPJxw>k#&nIvoZ5e9Sno)B2r+E0G} z@&M|zf4E0Q$O*NBR2I;?i7N} z@2^Su#`%qeX}m3cbSojiLk#84kvW1fICNPS`OyT0SpUoA0(s^2m~J<^eKE!dhJx_N zG_T}0&(<*an>oF=@?6?55g&IxSgY3?7|@pmDRE6gJyJNPH6un~%0hZ@?h=hI6O$b^ z)29#<4$E)cE-5IFbRpk9JVrw$$966UDyw;Iym4OY4Fc!&s1ZH4BJ1-$9<)Zt1c)N- zU^&9hsk6z?3%<9kGKHW|6~k;&cghtWz`oz`_YjVuvy;B;T67=L2c6=8`7WyTBv*QH zNv*bo1#KOk{O&)@&pkd*?v+kcJ8tM>AGx$~WMhH{L40_N=bkrVg+^p!H)IqXCQf2_ z0fPig=8CEo>p4vE(nc^DKbZ|9_Xo}$i4zJ`jVh95; z5%aNP3@``=EJ=Vt9U`y+$YtX;%OPzgZ_3+;+mh{p#W&y4-%%Bf`LhOy-*kB0qnB^m z_nBTz_b?-`F$*ymByshU>D)za2g`0j^ioo;A#QeL@x3@|+_!=YXA5f6Xg(Ack&WOg zJ<2i|Fd6OmyH!@YSMVxb;=M)ZDhBt)4`5T*>cUXWPG#%@$&*>K&u3#|`fm2mj*FKVf?du{xZ}WKWETTFhq6_fO$PS5(ItF=3~pFp~*j z!ys1<4EL1)#{`mz@gW|t-FpPkd%pK)n_Rb)F;z7cQ6dym_>YI3&e!=!m006oS3Mjq{q ze%hNzW=G0jpfl2K(x`CDuZCsJV*hm9T~%5n7R_g}VFpk`G((D^MWVMAmRp--T{`P; zwMgD<;e`fm`g3|fPns|6qnd{|FCHY*YAguXH(?%sx%4+Gu|Y)_8mk4EljxmP+MP`* z`SUbI{TCIN2OV+$y#g->Jqv#$wL;}4xJmah#$0`v^ughM_XjTA$B}ux)JZuY5-GW4 zKy440I+w=ZtE-_i+0xImq}vyzD68?8;94-5L~_O6Ty>X3itdA-x?6P(c4jkr+f!H( zUDeqiG>3bn^Sf8(`_YwqPeJ9&-@OCQZm4X{FfRMeBtN4E9Ca@;GVpU*L>lVb;@=PH zTQvTr?^jKyCKh&ZVOI*<y%T*Aw(XCPrFC=39*y$A`FSzxBiQ#W+uW10d8&gYp4{teh;^p@anft+z$5!Hv&@h0X-@xJG>hbTCxjDwMiWK@1b%8wYL6BrV zT41m}tX8g-`P@vj4T!Mlk8F0S!MA`^J=SCy9-jdwDe^hVDa`WwyI^H@ryt=F5y6>b zT8&iI6&j8edAfX^ycgWbnMZQ26Q~`LmdEScKC8|~$Jgyw(>18NAQ$9AwCRmri!96L zp^)b0P2CR-9S%cG$#rU}MXnx21T#031o>2VrDs@sa-FpjfvgLPW>Q&LHUoNOtmkt# zoDZ=5OGp{^vO~=p29^`aXd8K?(+f-bW`N$U;-o;%f?RcR!k02Nod2h^^8ly%Z67#E zC3|IOuj~^YBO=Fklo@3mvd6I{Z*&FZ>iq* zxh|JuJoo2$p8MJ3zO@dQ;%1#~Mrm48 zB0053{1bDi_a@jo<4!@!`w4}B(&Qb`~IeSBh zu+_yIYl2Wgk+?x4pCmAM>x_SqBPUj#c`C`k>_fp@qPlAAwD$!zOxRkL7;=|nu(#ut zyF^;&hm-D_;ji{d6rOloACu5*NkF4IC3@rifMG(|^Skv$H&^YnYL*rpw=UCi;JOuz zN*NX(7wZXS4tF@6PIWAs%*j!$RoL*3sh)}iry%thDvN5AUM888q_(>|Tzt|Yea3AyMYBgm$H_`F^v2%)bux)3s znFIEBDK;-JS5SH|;1?afJb<*=c5puu=w%tv#ihn*R!^Hd$KWAp4$#`joJ*)$kNtZ z2Al6h>Z>(u?3tmzA4^d+jLKx{97!Pb4;CX&u;M||**7zXI7hO6nrdMx*Xa=|-`#1^ zBQ?Ha&7cd7hN=%y4yUp?zl8~Lo;%mQrDe8!ce-W_K94FFMN*g(w8q-_K5S+c0{o29X&PzpV;UJE^!xnFc%b@>kvW4m#xiOj-L*DadC&2N#0Us z;<-(m1WB7$=j6hjcPC6JB)D3T2#IC`ibu#yi!uK7W2!j|Z>~RaJ*&XXy#ytIk2DIp z5?Qd^s90_?ILjU#>ZWk5HXts}grg_!Gmgm!d?eLGR7xEP zvTCrslV~94ym5_i<5oqy(@@?wN}lIdtiY8=?|Ng!XeYnly`@9wCGx2S$3x|0x8T2h zz7A85Vb2>s44rKpI_4Y7_Pnd2^mYj2%^jM|Du>u4`^Psda^JIP%*DK6bo`Vf&f{!% zDTYCwF5Nhi=)QhU2$@eQv&ZzxsX+Hl+gP6kW|e!n9IU2>Vh~cioI{>4WvR}t*4Hpz z%5z?HjLGoka}Q3AbX9AkY|Yjf^M(>@tBAI9JO5pDCQu0R3Nns>)LC#vB2p96C*?K? zvX$un$sBDx$1=+NNj*@Oa@u*b@O*XBr_sg@8sCUq-|LK!MUmC)epklrv}5O_^<{NP zX16|c$9Wtbks3y7geI^tF5oRZJu;v zwkW8j+8Ccxo9stEDOT_Go&j%$KCgVO7pm+^%PKEPBZqbMw%s@732XS{cX+wCSjH1s z5)bc=g**<^NNsroY` z?}fHHlgu^B?2r{^^gQ&j zbF~T((>|Yg&C5WKL8DCnl1}Z3!YHFW2S1|;Xr0`Uz-;=FxEwYc4QpeAtnm7^f~uzX zl;xA!?>MLR?tL80Iudm;mi{!ewL91KhG7Hsa-XepKi<2mc6%zf0GwtbfJ1Zf-<@Xu z#|XWDzv|04t)&9Id!UxAAkN{t5qC%%8-WV3i;3duS19%m2||Y{!3pR1=g|zQYAMqc zff)_2nj-O4wfxy;UNM?|Uieo!^J$A*uDe>@V(NKH;KS;Y_dtE8${p>RdcrW;=2*fj4~d?OG0l-(g?ik}vz} z)5-wDppVts>K-=|@{=!53?=8)Jw#RGpS_FWpbwtn}{v!JEJ$q-sr7F6&OPBuI# zuVNFMPte79XgEu!P&qRq8u4J>r%$l-IQ00Lin90(_KtC)aR_de zxN=pY2<1b29_^AG2WJIGmmX4rv3$!`l15{e(H!1^+x9voZ6;882YAE12q7+lgy+>) zj|s0CyzI9=Mo!R}&LXB`&DYpZ7c?0r(&KNV+~TULd0y^e;G{KVR4nL0KvU9mr8&$^ zxrM-9P8zE`J?aZ(iB~Rz<{vvnk2HaZU#K$aVFfYnbAXVUOLU#As5JvS%+26 zi$sNuPY}dLGUS$0g&;oBqhzv2dY`l3@6Na403M!Sh${B|7(y|_cONa;6BrtUe@ZzV z7SThtHT8k?Rwc)(Z}@BP#H@JJHz&GR&M=E@P9KJ89yQKmRh&I~%vbL1L-K3E>7>CH z)Y!=jXVb1iPrAoAZZ3}3wU*5~nrV!ZjL5zqJ<@NwjHCZC>68Cc<{&E_#S;E*jOdjtg?uKN|l`P8sjz&Qf7a^z9 z;{3-8T+H4y99_zc;JYIvs!sk$G}` z??mt*Mm9Z@glCZb!X?!xXD-21sFDPEpZOK{sbQseQ$%6~b;n+*z0hRoR}0Pe>B|#t z$XrVcXv8M|q*Z8MY&r9J0A=d^1bHpjrUXu)qEj~$%%=gZp`^~%O*lzxUquG^p6;n; z^(3HL+hx4gRP?4N*b2p9!^|2~rcw3!9nQj$vmZusbXYz_x^AVc`3qBFm(jS9ueU5h z^AnNnbswfQ2Jq=W=T+p-V|nQco@bOAH$pLQZ+BKH8E$iM>IDz z3|wc?QP`yI=X5YTlp8h}%p6{Deq?S0QD$Ug>ih1SdPZg237Rl{S~=Ha4~-ckMoIWMn+X@@`V6 z#HHZj>MQbt$Qqp*9T(cjc^lxZ7UO(>PwzF-qEr(wo`vaulxdall|KP`7p4gd`23&Jy=#sAes*0diLB(U$Nx46VQvP)8idSs8^zaV91xw*O-JMH=)FoJshRob|_)O)ojtfP))WHCr(;*2;VMQ75^ zfN@a^f#o<|*9X;3IcGodLUz-3i~FAu+zI4c5h+nW^h_!^)b*B_xw-l4O$TB(ixaqW ziMoa%i=BeS<-F45kMO;Tw|FWa`G2c!SuOA3CbowPhF6csf1|&qqugUrj;UgGHm| z;j^yoH?MZhR;AYOW_XW2Lg2j%%ejL)B@*bUMD`g<#Z${1+fa57r7X82 zcqY-cfPnK%Y^3@szRner zt)bBToYCph6Jv*W+&t?&9FG4(Iu2w46 z4B#AcFy_^J@f*6<{>CN}Sj969*DYV*e7<61U>GoN{tz!Do90+jApFueVY_IW(MQF; zl?4yA_(MvMwN&pWKVyg{3uU_+y6RMdot2vu%mC?st=N0pf-~JZXE?3JFf)j<{1xsU z`2ephz)#HzsWEP!inHm2hI(V(~@W zY7gGU-lO52cHD&SY)>QHgy$=>^X%u0TQZfCizro!*weMyvZC=;MWOawdAx~`3C*W` z%^#^$uRP;gyqEE0<(i8xcQY$oc+6mY#z{-XFxsO1(cN8Y)>p;^q9|5bk`Z*p|c!?(rErw#y;yT(%@c7trQBv6cj)$3>pI z>tz+;IB?D=aQV=s(n)o63*yn8dX1m7#Z4G{%fF@K2o5n3jxR~mU?nzMi#;}8e#(>{ zy{Z4!AI)jZ8TY;nq1aq}tq;~=zzoTv)er06oeX3;9{uP{LWR*2%9cmE%S^`~!BW>X zn3PZFTf3g*dG68~^1*q@#^Ge(_8puPEFLD8OS|0b2a{5e=N4S%;~f3tC>F6UxK#v9 z)N-#Mv8=ePCh1KsUKD1A8jF_%$MPf|_yCN9oy%*@um6D{w*2|4GY zb}gafrSC+f=b*W{)!a!fqwZ9)K>fk=i4qf!4M?0v{CMNTo2A9}mQzV=%3UT&i{3{W z>ulG#M!K7%jPf6Mjff9BMslgQq3zIogY);Cv3v;&b#;^=sh#(Bn%W)H*bHNaLwdpq z85%fUTUJJNjYO_426T2TBj0D{6t zw&S_HZ|C?pI_2q(9Fas&@uJs6nVX;P*5K#6p|#)_(8PM-{L(;2wl`ma{ZAd5gA)?y z>0GSLoK<*FwW+G8@-M3vcffg7I(qm7lzF)n`Q9iCvp*mn7=|CjlpG{x z&r0n}XLWZ!>=lynUr7D`6n`7a_ZgT< zm!i;&?Fb0Q2QmqmCHfZ7ex=_tU~(7b)L?RIvPyEAU=gLIZ-VTAA~WR00yKyTXg^(G zqWLZJs!FnQYMOH3*fN&Tn(IKMLf{Ki?pRo8zZJ6YVyj)y0^)-sR}2-)%mI(Aw2AgT zbbp1T{qB(OSNJd0cVBH^tI>HR(q+#*lmi@LWe*rZz&M2h1L_=50uZ1e*n#E*`6?aw zj`ka&JpceRGe@}Ey1)Q~O}0qHRg4K_u>4e1arvJ7Q9!=t5AuzG`n=a-f0}{+lnCE#zu$`oVn44eS&T?N*wz~t~E&oQDBrB_MSg z_yVrQehWbD0xHX|v-hpselAu;O7s;P*!uAT`dr~}Lie=tknaGoiU?;*8Cwgala-65 zosOB4mATbdXJFujzgA4?UkCKE093A1KM?W&Pw>A?IACqg1z~IZYkdP70EeCfjii(n z3k%ax?4|rY(87N&_vhsyVK1zp@uils|B%`(V4e3%sj5f|i(eIhiSg-fHK1Pb0-mS^ zeh?WA7#{hhNci5e;?n*iVy|)iJiR>|8{TN3!=VBC2dN)~^ISSW_(g<^rHr$)nVrdA z39BMa5wl5q+5F@)4b%5-> zA^-P20l_e^S2PTa&HE2wf3jf)#)2ITVXzndeuMpPo8}kphQKhegB%QO+yBpDpgkcl z1nlPp14#+^bIA7__h16pMFECzKJ3p4`;Rf$gnr%{!5#oG42AH&X8hV8061%4W91ku z`OW_hyI+uBOqYXkVC&BqoKWmv;|{O|4d#Nay<)gkxBr^^N48(VDF7Sj#H1i3>9138 zkhxAU7;M)I18&d!Yw!V9zQA0tp(G4<8U5GX{YoYCQ?p56FxcD-2FwO5fqyx@__=$L zeK6Sg3>XQv)qz1?zW-k$_j`-)tf+yRU_%fXrenc>$^70d1Q-W?T#vy;6#Y-Q-<2)+ z5iTl6MA7j9m&oBhRXTKr*$3gec z3E;zX457RGZwUvD$l&8e42Qb^cbq>zYy@ive8`2N9vk=#6+AQlZZ7qk=?(ap1q0n0 z{B9Fte-{Gi-Tvax1)M+d1}Fyg@9X~sh1m|hsDcZuYOnxriBPN;z)q3<=-yBN2iM6V A?*IS* literal 0 HcmV?d00001 diff --git a/samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.properties b/samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..7d02699a --- /dev/null +++ b/samples/springboot4/pet-store-native/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/samples/springboot4/pet-store-native/Dockerfile b/samples/springboot4/pet-store-native/Dockerfile new file mode 100644 index 00000000..ec8eb4a0 --- /dev/null +++ b/samples/springboot4/pet-store-native/Dockerfile @@ -0,0 +1,37 @@ +FROM public.ecr.aws/amazonlinux/amazonlinux:2023 + +RUN yum -y update \ + && yum install -y unzip tar gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \ + less libcurl-devel openssl openssl-devel readline-devel xz-devel \ + zlib-devel glibc-static zlib-static \ + && rm -rf /var/cache/yum + +# Graal VM +ENV GRAAL_VERSION 25.0.1 +ENV ARCHITECTURE aarch64 +ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz +RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz +RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm +ENV JAVA_HOME /usr/lib/graalvm + +# Maven +ENV MVN_VERSION 3.9.9 +ENV MVN_FOLDERNAME apache-maven-${MVN_VERSION} +ENV MVN_FILENAME apache-maven-${MVN_VERSION}-bin.tar.gz +RUN curl -4 -L https://archive.apache.org/dist/maven/maven-3/${MVN_VERSION}/binaries/${MVN_FILENAME} | tar -xvz +RUN mv $MVN_FOLDERNAME /usr/lib/maven +RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn + +# Gradle +ENV GRADLE_VERSION 7.4.1 +ENV GRADLE_FOLDERNAME gradle-${GRADLE_VERSION} +ENV GRADLE_FILENAME gradle-${GRADLE_VERSION}-bin.zip +RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip +RUN unzip gradle-${GRADLE_VERSION}-bin.zip +RUN mv $GRADLE_FOLDERNAME /usr/lib/gradle +RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle + +VOLUME /project +WORKDIR /project + +WORKDIR /pet-store-native diff --git a/samples/springboot4/pet-store-native/README.md b/samples/springboot4/pet-store-native/README.md new file mode 100644 index 00000000..57994a4e --- /dev/null +++ b/samples/springboot4/pet-store-native/README.md @@ -0,0 +1,39 @@ +In this sample, you'll build a native GraalVM image for running Spring Boot 4.0 and Spring Framework 7.0 web workloads in AWS Lambda. + +**Important**: Spring Boot 4.0 requires GraalVM 25 for native image compilation. GraalVM 21 is not compatible. + +## To build the sample + +You first need to build the function, then you will deploy it to AWS Lambda. + +Please note that the sample is for `x86` architectures. In case you want to build and run it on ARM, e.g. Apple Mac M1, M2, ... +you must change the according line in the `Dockerfile` to `ENV ARCHITECTURE aarch64`. +In addition, uncomment the `arm64` Architectures section in `template.yml`. + +### Step 1 - Build the native image + +Before starting the build, you must clone or download the code in **pet-store-native**. + +1. Change into the project directory: `samples/springboot4/pet-store-native` +2. Run the following to build a Docker container image with GraalVM 25 which will include all the necessary dependencies to build the application + ``` + docker build -t al2023-graalvm25:native-web . + ``` +3. Build the application within the previously created build image + ``` + docker run -it -v `pwd`:`pwd` -w `pwd` -v ~/.m2:/root/.m2 al2023-graalvm25:native-web mvn clean native:compile -Pnative + ``` +4. After the build finishes, you need to deploy the function: + ``` + sam deploy --guided + ``` + +This will deploy your application and will attach an AWS API Gateway +Once the deployment is finished you should see the following: +``` +Key ServerlessWebNativeApi +Description URL for application +Value https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/pets +``` + +You can now simply execute GET on this URL and see the listing fo all pets. diff --git a/samples/springboot4/pet-store-native/mvnw b/samples/springboot4/pet-store-native/mvnw new file mode 100755 index 00000000..8d937f4c --- /dev/null +++ b/samples/springboot4/pet-store-native/mvnw @@ -0,0 +1,308 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.2.0 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "$(uname)" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin ; then + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" + else + javaExecutable="$(readlink -f "\"$javaExecutable\"")" + fi + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$(cd "$wdir/.." || exit 1; pwd) + fi + # end of workaround + done + printf '%s' "$(cd "$basedir" || exit 1; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" + fi +} + +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" +else + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + fi + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; + esac + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget > /dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + fi + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi +fi + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +# shellcheck disable=SC2086 # safe args +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/samples/springboot4/pet-store-native/mvnw.cmd b/samples/springboot4/pet-store-native/mvnw.cmd new file mode 100644 index 00000000..f80fbad3 --- /dev/null +++ b/samples/springboot4/pet-store-native/mvnw.cmd @@ -0,0 +1,205 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.2.0 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/samples/springboot4/pet-store-native/pom.xml b/samples/springboot4/pet-store-native/pom.xml new file mode 100644 index 00000000..1946401f --- /dev/null +++ b/samples/springboot4/pet-store-native/pom.xml @@ -0,0 +1,140 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 4.0.0 + + + com.amazonaws.serverless.sample + pet-store-native-springboot4 + 0.0.1-SNAPSHOT + pet-store-native-springboot4 + Sample of AWS with Spring Boot 4.0 Native + + 17 + + + + org.springframework.boot + spring-boot-starter + + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + [2.0.0-SNAPSHOT,),[2.0.0-M1,) + + + + org.crac + crac + runtime + + + com.fasterxml.jackson.core + jackson-databind + 2.18.2 + + + com.amazonaws + aws-lambda-java-events + 3.15.0 + + + com.amazonaws + aws-lambda-java-core + 1.2.3 + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + native + + + + org.springframework.boot + spring-boot-maven-plugin + + -agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image/ --enable-preview + + + + + org.graalvm.buildtools + native-maven-plugin + + pet-store-native + + --enable-url-protocols=http + -march=compatibility + + + + + + build + + package + + + test + + test + + test + + + + + maven-assembly-plugin + + + native-zip + package + + single + + false + + + + + src/assembly/native.xml + + + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + \ No newline at end of file diff --git a/samples/springboot4/pet-store-native/src/assembly/java.xml b/samples/springboot4/pet-store-native/src/assembly/java.xml new file mode 100644 index 00000000..bd4961b5 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/assembly/java.xml @@ -0,0 +1,31 @@ + + java-zip + + zip + + + + + target/classes + / + + + src/shell/java + / + true + 0775 + + bootstrap + + + + + + /lib + false + runtime + + + \ No newline at end of file diff --git a/samples/springboot4/pet-store-native/src/assembly/native.xml b/samples/springboot4/pet-store-native/src/assembly/native.xml new file mode 100644 index 00000000..9bd97a5b --- /dev/null +++ b/samples/springboot4/pet-store-native/src/assembly/native.xml @@ -0,0 +1,29 @@ + + native-zip + + zip + + + + + src/shell/native + / + true + 0775 + + bootstrap + + + + target + / + true + 0775 + + pet-store-native + + + + \ No newline at end of file diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/DemoApplication.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/DemoApplication.java new file mode 100644 index 00000000..3f1d4255 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/DemoApplication.java @@ -0,0 +1,12 @@ +package com.amazonaws.serverless.sample.springboot4; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) throws Exception { + SpringApplication.run(DemoApplication.class, args); + } +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/HelloController.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/HelloController.java new file mode 100644 index 00000000..4f0abad7 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/HelloController.java @@ -0,0 +1,17 @@ +package com.amazonaws.serverless.sample.springboot4; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + public HelloController() { + System.out.println("Creating controller"); + } + + @GetMapping("/hello") + public String something(){ + return "Hello World"; + } +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java new file mode 100644 index 00000000..7576b789 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java @@ -0,0 +1,82 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.controller; + + + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import com.amazonaws.serverless.sample.springboot4.model.Pet; +import com.amazonaws.serverless.sample.springboot4.model.PetData; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @PostMapping(path = "/pets") + public Pet createPet(@RequestBody Pet newPet) { + System.out.println("==> Creating Pet: " + newPet); + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @GetMapping(path = "/pets") + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + System.out.println("==> Listing Pets"); + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @GetMapping(path = "/pets/{petId}") + public Pet listPets() { + System.out.println("==> Listing Pets"); + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..705683ae --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot4.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot4.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java new file mode 100644 index 00000000..ddc63025 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java new file mode 100644 index 00000000..b7e95ca9 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java new file mode 100644 index 00000000..66bdd366 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot4/pet-store-native/src/main/resources/META-INF/.gitignore b/samples/springboot4/pet-store-native/src/main/resources/META-INF/.gitignore new file mode 100644 index 00000000..0726bbaa --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/resources/META-INF/.gitignore @@ -0,0 +1 @@ +/native-image/ diff --git a/samples/springboot4/pet-store-native/src/main/resources/application.properties b/samples/springboot4/pet-store-native/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/samples/springboot4/pet-store-native/src/shell/java/bootstrap b/samples/springboot4/pet-store-native/src/shell/java/bootstrap new file mode 100644 index 00000000..e30ee22e --- /dev/null +++ b/samples/springboot4/pet-store-native/src/shell/java/bootstrap @@ -0,0 +1,7 @@ +#!/bin/sh + +cd ${LAMBDA_TASK_ROOT:-.} + +java -Dspring.main.web-application-type=none -Dlogging.level.org.springframework=DEBUG \ + -noverify -XX:TieredStopAtLevel=1 -Xss256K -XX:MaxMetaspaceSize=128M \ + -cp .:`echo lib/*.jar | tr ' ' :` com.amazonaws.serverless.sample.springboot4.DemoApplication \ No newline at end of file diff --git a/samples/springboot4/pet-store-native/src/shell/native/bootstrap b/samples/springboot4/pet-store-native/src/shell/native/bootstrap new file mode 100644 index 00000000..0156b090 --- /dev/null +++ b/samples/springboot4/pet-store-native/src/shell/native/bootstrap @@ -0,0 +1,5 @@ +#!/bin/sh + +cd ${LAMBDA_TASK_ROOT:-.} + +./pet-store-native -Dlogging.level.org.springframework=DEBUG -Dlogging.level.com.amazonaws.serverless.proxy.spring=DEBUG diff --git a/samples/springboot4/pet-store-native/template.yaml b/samples/springboot4/pet-store-native/template.yaml new file mode 100644 index 00000000..d0b63d9a --- /dev/null +++ b/samples/springboot4/pet-store-native/template.yaml @@ -0,0 +1,33 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Serverless Java Container GraalVM with Spring Boot 4 +Resources: + ServerlessWebNativeFunction: + Type: AWS::Serverless::Function + Properties: + MemorySize: 512 + FunctionName: pet-store-native-springboot4 + Timeout: 15 + CodeUri: ./target/pet-store-native-springboot4-0.0.1-SNAPSHOT-native-zip.zip + Handler: NOP + Runtime: provided.al2023 + Architectures: + - arm64 + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL +Outputs: + ServerlessWebNativeApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: ServerlessWebNativeApi + \ No newline at end of file diff --git a/samples/springboot4/pet-store/README.md b/samples/springboot4/pet-store/README.md new file mode 100644 index 00000000..40955e96 --- /dev/null +++ b/samples/springboot4/pet-store/README.md @@ -0,0 +1,36 @@ +# Serverless Spring Boot 4 example +A basic pet store written with the [Spring Boot 4 framework](https://projects.spring.io/spring-boot/) and Spring Framework 7.0. The `StreamLambdaHandler` object is the main entry point for Lambda. + +The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. + +## Pre-requisites +* [AWS CLI](https://aws.amazon.com/cli/) +* [SAM CLI](https://github.com/awslabs/aws-sam-cli) +* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) + +## Deployment +In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package +``` +$ sam build +``` + +This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. + +To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen + +``` +$ sam deploy --guided +``` + +Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL + +``` +... +--------------------------------------------------------------------------------------------------------- +OutputKey-Description OutputValue +--------------------------------------------------------------------------------------------------------- +PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +--------------------------------------------------------------------------------------------------------- + +$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets +``` \ No newline at end of file diff --git a/samples/springboot4/pet-store/build.gradle b/samples/springboot4/pet-store/build.gradle new file mode 100644 index 00000000..298feedf --- /dev/null +++ b/samples/springboot4/pet-store/build.gradle @@ -0,0 +1,30 @@ +apply plugin: 'java' + +repositories { + mavenLocal() + mavenCentral() + maven {url "https://repo.spring.io/milestone"} + maven {url "https://repo.spring.io/snapshot"} +} + +dependencies { + implementation ( + implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' + }, + 'com.amazonaws.serverless:aws-serverless-java-container-springboot4:[2.0-SNAPSHOT,)', + 'com.fasterxml.jackson.core:jackson-databind:2.18.2' + ) +} + +task buildZip(type: Zip) { + from compileJava + from processResources + into('lib') { + from(configurations.compileClasspath) { + exclude 'tomcat-embed-*' + } + } +} + +build.dependsOn buildZip diff --git a/samples/springboot4/pet-store/pom.xml b/samples/springboot4/pet-store/pom.xml new file mode 100644 index 00000000..eb842480 --- /dev/null +++ b/samples/springboot4/pet-store/pom.xml @@ -0,0 +1,160 @@ + + + 4.0.0 + + com.amazonaws.serverless.sample + serverless-springboot4-example + 2.0-SNAPSHOT + Spring Boot 4 example for the aws-serverless-java-container library + Simple pet store written with Spring Framework 7.0 and Spring Boot 4.0 + https://aws.amazon.com/lambda/ + + + org.springframework.boot + spring-boot-starter-parent + 4.0.0 + + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + com.amazonaws.serverless + aws-serverless-java-container-springboot4 + [2.0.0-SNAPSHOT,),[2.0.0-M1,) + + + + com.fasterxml.jackson.core + jackson-databind + 2.18.2 + + + + + + shaded-jar + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + false + + + + package + + shade + + + + + org.apache.tomcat.embed:* + + + + + + + + + + + assembly-zip + + true + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + default-jar + none + + + + + org.apache.maven.plugins + maven-install-plugin + 3.1.4 + + true + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.8.1 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/lib + runtime + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.7.1 + + + zip-assembly + package + + single + + + ${project.artifactId}-${project.version} + + src${file.separator}assembly${file.separator}bin.xml + + false + + + + + + + + + + + diff --git a/samples/springboot4/pet-store/src/assembly/bin.xml b/samples/springboot4/pet-store/src/assembly/bin.xml new file mode 100644 index 00000000..1e085057 --- /dev/null +++ b/samples/springboot4/pet-store/src/assembly/bin.xml @@ -0,0 +1,27 @@ + + lambda-package + + zip + + false + + + + ${project.build.directory}${file.separator}lib + lib + + tomcat-embed* + + + + + ${project.build.directory}${file.separator}classes + + ** + + ${file.separator} + + + \ No newline at end of file diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java new file mode 100644 index 00000000..13a80b32 --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/Application.java @@ -0,0 +1,49 @@ +package com.amazonaws.serverless.sample.springboot4; + +import com.amazonaws.serverless.sample.springboot4.controller.PetsController; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.HandlerAdapter; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.HandlerMapping; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +@SpringBootApplication +@Import({ PetsController.class }) +public class Application { + + // silence console logging + @Value("${logging.level.root:OFF}") + String message = ""; + + /* + * Create required HandlerMapping, to avoid several default HandlerMapping instances being created + */ + @Bean + public HandlerMapping handlerMapping() { + return new RequestMappingHandlerMapping(); + } + + /* + * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created + */ + @Bean + public HandlerAdapter handlerAdapter() { + return new RequestMappingHandlerAdapter(); + } + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java new file mode 100644 index 00000000..61cde4fa --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/StreamLambdaHandler.java @@ -0,0 +1,50 @@ +package com.amazonaws.serverless.sample.springboot4; + + +import com.amazonaws.serverless.exceptions.ContainerInitializationException; +import com.amazonaws.serverless.proxy.internal.testutils.Timer; +import com.amazonaws.serverless.proxy.model.AwsProxyRequest; +import com.amazonaws.serverless.proxy.model.AwsProxyResponse; +import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; +import com.amazonaws.serverless.sample.springboot4.filter.CognitoIdentityFilter; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; + +import jakarta.servlet.DispatcherType; +import jakarta.servlet.FilterRegistration; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.EnumSet; + + +public class StreamLambdaHandler implements RequestStreamHandler { + private static SpringBootLambdaContainerHandler handler; + static { + try { + handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); + + // we use the onStartup method of the handler to register our custom filter + handler.onStartup(servletContext -> { + FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); + registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); + }); + } catch (ContainerInitializationException e) { + // if we fail here. We re-throw the exception to force another cold start + e.printStackTrace(); + throw new RuntimeException("Could not initialize Spring Boot application", e); + } + } + + public StreamLambdaHandler() { + // we enable the timer for debugging. This SHOULD NOT be enabled in production. + Timer.enable(); + } + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + handler.proxyStream(inputStream, outputStream, context); + } +} diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java new file mode 100644 index 00000000..cb80068b --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/controller/PetsController.java @@ -0,0 +1,77 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.controller; + + + +import com.amazonaws.serverless.sample.springboot4.model.Pet; +import com.amazonaws.serverless.sample.springboot4.model.PetData; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.security.Principal; +import java.util.Optional; +import java.util.UUID; + + +@RestController +@EnableWebMvc +public class PetsController { + @RequestMapping(path = "/pets", method = RequestMethod.POST) + public Pet createPet(@RequestBody Pet newPet) { + if (newPet.getName() == null || newPet.getBreed() == null) { + return null; + } + + Pet dbPet = newPet; + dbPet.setId(UUID.randomUUID().toString()); + return dbPet; + } + + @RequestMapping(path = "/pets", method = RequestMethod.GET) + public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { + int queryLimit = 10; + if (limit.isPresent()) { + queryLimit = limit.get(); + } + + Pet[] outputPets = new Pet[queryLimit]; + + for (int i = 0; i < queryLimit; i++) { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setName(PetData.getRandomName()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + outputPets[i] = newPet; + } + + return outputPets; + } + + @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) + public Pet listPets() { + Pet newPet = new Pet(); + newPet.setId(UUID.randomUUID().toString()); + newPet.setBreed(PetData.getRandomBreed()); + newPet.setDateOfBirth(PetData.getRandomDoB()); + newPet.setName(PetData.getRandomName()); + return newPet; + } + +} diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java new file mode 100644 index 00000000..705683ae --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/filter/CognitoIdentityFilter.java @@ -0,0 +1,69 @@ +package com.amazonaws.serverless.sample.springboot4.filter; + + +import com.amazonaws.serverless.proxy.RequestReader; +import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +import java.io.IOException; + + +/** + * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context + * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container + * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot4.StreamLambdaHandler} class. + */ +public class CognitoIdentityFilter implements Filter { + public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; + + private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); + + @Override + public void init(FilterConfig filterConfig) + throws ServletException { + // nothing to do in init + } + + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); + if (apiGwContext == null) { + log.warn("API Gateway context is null"); + filterChain.doFilter(servletRequest, servletResponse); + return; + } + if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { + log.warn("API Gateway context object is not of valid type"); + filterChain.doFilter(servletRequest, servletResponse); + } + + AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; + if (ctx.getIdentity() == null) { + log.warn("Identity context is null"); + filterChain.doFilter(servletRequest, servletResponse); + } + String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); + if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { + log.warn("Cognito identity id in request is null"); + } + servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); + filterChain.doFilter(servletRequest, servletResponse); + } + + + @Override + public void destroy() { + // nothing to do in destroy + } +} diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java new file mode 100644 index 00000000..ddc63025 --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Error.java @@ -0,0 +1,29 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +public class Error { + private String message; + + public Error(String errorMessage) { + message = errorMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java new file mode 100644 index 00000000..b7e95ca9 --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/Pet.java @@ -0,0 +1,55 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + +import java.util.Date; + + +public class Pet { + private String id; + private String breed; + private String name; + private Date dateOfBirth; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBreed() { + return breed; + } + + public void setBreed(String breed) { + this.breed = breed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateOfBirth() { + return dateOfBirth; + } + + public void setDateOfBirth(Date dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } +} diff --git a/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java new file mode 100644 index 00000000..66bdd366 --- /dev/null +++ b/samples/springboot4/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot4/model/PetData.java @@ -0,0 +1,117 @@ +/* + * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ +package com.amazonaws.serverless.sample.springboot4.model; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + + +public class PetData { + private static List breeds = new ArrayList<>(); + static { + breeds.add("Afghan Hound"); + breeds.add("Beagle"); + breeds.add("Bernese Mountain Dog"); + breeds.add("Bloodhound"); + breeds.add("Dalmatian"); + breeds.add("Jack Russell Terrier"); + breeds.add("Norwegian Elkhound"); + } + + private static List names = new ArrayList<>(); + static { + names.add("Bailey"); + names.add("Bella"); + names.add("Max"); + names.add("Lucy"); + names.add("Charlie"); + names.add("Molly"); + names.add("Buddy"); + names.add("Daisy"); + names.add("Rocky"); + names.add("Maggie"); + names.add("Jake"); + names.add("Sophie"); + names.add("Jack"); + names.add("Sadie"); + names.add("Toby"); + names.add("Chloe"); + names.add("Cody"); + names.add("Bailey"); + names.add("Buster"); + names.add("Lola"); + names.add("Duke"); + names.add("Zoe"); + names.add("Cooper"); + names.add("Abby"); + names.add("Riley"); + names.add("Ginger"); + names.add("Harley"); + names.add("Roxy"); + names.add("Bear"); + names.add("Gracie"); + names.add("Tucker"); + names.add("Coco"); + names.add("Murphy"); + names.add("Sasha"); + names.add("Lucky"); + names.add("Lily"); + names.add("Oliver"); + names.add("Angel"); + names.add("Sam"); + names.add("Princess"); + names.add("Oscar"); + names.add("Emma"); + names.add("Teddy"); + names.add("Annie"); + names.add("Winston"); + names.add("Rosie"); + } + + public static List getBreeds() { + return breeds; + } + + public static List getNames() { + return names; + } + + public static String getRandomBreed() { + return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); + } + + public static String getRandomName() { + return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); + } + + public static Date getRandomDoB() { + GregorianCalendar gc = new GregorianCalendar(); + + int year = ThreadLocalRandom.current().nextInt( + Calendar.getInstance().get(Calendar.YEAR) - 15, + Calendar.getInstance().get(Calendar.YEAR) + ); + + gc.set(Calendar.YEAR, year); + + int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); + + gc.set(Calendar.DAY_OF_YEAR, dayOfYear); + return gc.getTime(); + } +} diff --git a/samples/springboot4/pet-store/src/main/resources/logback.xml b/samples/springboot4/pet-store/src/main/resources/logback.xml new file mode 100644 index 00000000..14a3a84f --- /dev/null +++ b/samples/springboot4/pet-store/src/main/resources/logback.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/samples/springboot4/pet-store/template.yml b/samples/springboot4/pet-store/template.yml new file mode 100644 index 00000000..789057a5 --- /dev/null +++ b/samples/springboot4/pet-store/template.yml @@ -0,0 +1,35 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Example Pet Store API written with SpringBoot4 with the aws-serverless-java-container library + +Globals: + Api: + # API Gateway regional endpoints + EndpointConfiguration: REGIONAL + +Resources: + PetStoreFunction: + Type: AWS::Serverless::Function + Properties: + Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest + Runtime: java25 + CodeUri: . + MemorySize: 1512 + Policies: AWSLambdaBasicExecutionRole + Timeout: 60 + Environment: + Variables: + MAIN_CLASS: com.amazonaws.serverless.sample.springboot4.Application + Events: + HttpApiEvent: + Type: HttpApi + Properties: + TimeoutInMillis: 20000 + PayloadFormatVersion: '1.0' + +Outputs: + SpringBootPetStoreApi: + Description: URL for application + Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' + Export: + Name: SpringBootPetStoreApi From 1c9508142e15d37b1ccfacb050bf4b6fc329cc36 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 23 Jan 2026 10:10:43 -0800 Subject: [PATCH 1167/1214] update SB3 to current version and correct architeture in native dockerfile --- aws-serverless-java-container-springboot3/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 4 ++-- samples/springboot3/pet-store-native/Dockerfile | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 3ababeb9..ed20a5de 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.3 + 2.1.5 .. 4.0.0 @@ -30,12 +30,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.5 com.amazonaws.serverless aws-serverless-java-container-core - 2.1.3 + 2.1.5 tests test-jar test diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index f4c56c05..52eecd58 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,12 +4,12 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.3 + 2.1.5 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.3 + 2.1.5 maven-archetype diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile index 7d5833bf..4fb614e3 100644 --- a/samples/springboot3/pet-store-native/Dockerfile +++ b/samples/springboot3/pet-store-native/Dockerfile @@ -8,7 +8,7 @@ RUN yum -y update \ # Graal VM ENV GRAAL_VERSION 21.0.2 -ENV ARCHITECTURE aarch64 +ENV ARCHITECTURE x64 ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm From 9dc32c66e3346993a35e0b3dae4261c771873e27 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 26 Jan 2026 14:24:57 -0800 Subject: [PATCH 1168/1214] update README to add new brancjh for springboot3 support --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7da76ea..85a906b2 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ Currently the following versions are maintained: | Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | |---------|--------|-----------------------------|-----------------|------------------------|----------------|---------------| | 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | -| 2.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | -| 3.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 4.x | :x: | :x: | +| 2.x | [2.0.x](https://github.com/aws/serverless-java-container/tree/2.0.x) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | +| 3.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 3.x | :x: | :x: | Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: * [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) From 3d78da9a16c516098252f5a02b92e134d127943d Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 27 Jan 2026 09:44:37 -0800 Subject: [PATCH 1169/1214] add updated 2.1.x maintenance branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85a906b2..f34adda6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Currently the following versions are maintained: | Version | Branch | Java Enterprise support | Spring versions | JAX-RS/ Jersey version | Struts support | Spark support | |---------|--------|-----------------------------|-----------------|------------------------|----------------|---------------| | 1.x | [1.x](https://github.com/aws/serverless-java-container/tree/1.x) | Java EE (javax.*) | 5.x (Boot 2.x) | 2.x | :white_check_mark: | :white_check_mark: | -| 2.x | [2.0.x](https://github.com/aws/serverless-java-container/tree/2.0.x) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | +| 2.x | [2.1.x](https://github.com/aws/serverless-java-container/tree/2.1.x) | Jakarta EE 9-10 (jakarta.*) | 6.x (Boot 3.x) | 3.x | :x: | :x: | | 3.x | [main](https://github.com/aws/serverless-java-container/tree/main) | Jakarta EE 11 (jakarta.*) | 7.x (Boot 4.x) | 3.x | :x: | :x: | Follow the quick start guides in [our wiki](https://github.com/aws/serverless-java-container/wiki) to integrate Serverless Java Container with your project: From 012c9240f311184caf1402f6c3436228b9c5dea9 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 2 Feb 2026 10:47:52 -0800 Subject: [PATCH 1170/1214] add project version variable to pom files --- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 4 ++-- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- samples/springboot4/pet-store/pom.xml | 8 +------- 6 files changed, 9 insertions(+), 15 deletions(-) diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 8fcc07c4..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -24,12 +24,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} tests test-jar test diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index d85534fa..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -25,12 +25,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} tests test-jar test diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index e12ac19b..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -42,12 +42,12 @@ com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} tests test-jar test diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index da0c0540..32f22560 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -29,7 +29,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} tests test-jar test diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 4dd847a3..777eb7f3 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -30,7 +30,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - 3.0.0-SNAPSHOT + ${project.version} tests test-jar test diff --git a/samples/springboot4/pet-store/pom.xml b/samples/springboot4/pet-store/pom.xml index eb842480..85be6e96 100644 --- a/samples/springboot4/pet-store/pom.xml +++ b/samples/springboot4/pet-store/pom.xml @@ -43,13 +43,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot4 - [2.0.0-SNAPSHOT,),[2.0.0-M1,) - - - - com.fasterxml.jackson.core - jackson-databind - 2.18.2 + [3.0.0-SNAPSHOT,) From b09a39f9a43703db33aa7e5dab95313c446c4df2 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 3 Feb 2026 13:07:29 -0800 Subject: [PATCH 1171/1214] remove hardcoded project version from archetype poms --- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- .../src/main/resources/archetype-resources/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml index 32f22560..6f51a9c4 100644 --- a/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-jersey-archetype/src/main/resources/archetype-resources/pom.xml @@ -24,7 +24,7 @@ com.amazonaws.serverless aws-serverless-java-container-jersey - 3.0.0-SNAPSHOT + ${project.version} com.amazonaws.serverless diff --git a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml index 777eb7f3..3a03375c 100644 --- a/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-spring-archetype/src/main/resources/archetype-resources/pom.xml @@ -25,7 +25,7 @@ com.amazonaws.serverless aws-serverless-java-container-spring - 3.0.0-SNAPSHOT + ${project.version} com.amazonaws.serverless diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 73d407dd..74372fe5 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -28,7 +28,7 @@ com.amazonaws.serverless aws-serverless-java-container-springboot3 - ${project.version} + 2.1.5 com.amazonaws.serverless From d26bec20fed8a9566272446c40be4e5ff7abddcb Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 3 Feb 2026 13:24:49 -0800 Subject: [PATCH 1172/1214] update readme with springboot4 wiki --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f34adda6..15fc7c60 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Follow the quick start guides in [our wiki](https://github.com/aws/serverless-ja * [Spring quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring) * [Spring Boot 2 quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring-Boot2) * [Spring Boot 3 quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring-Boot3) +* [Spring Boot 4 quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spring-Boot4) * [Apache Struts quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Struts) * [Jersey quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Jersey) * [Spark quick start](https://github.com/aws/serverless-java-container/wiki/Quick-start---Spark) From 26dac667cb739d8c1e31cf7c1b20c4ad2ebe4231 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 12 Feb 2026 14:52:40 -0800 Subject: [PATCH 1173/1214] improve HttpServletRequest for Springboot4 --- .../spring/AwsSpringHttpProcessingUtils.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 15984bc4..b2bac134 100644 --- a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -120,11 +120,33 @@ private static HttpServletRequest generateRequest1(String request, Context lambd SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { AwsProxyRequest v1Request = readValue(request, AwsProxyRequest.class, mapper); - // Use AWS container's servlet request instead of Spring Cloud Function's - AwsProxyHttpServletRequest httpServletRequest = new AwsProxyHttpServletRequest(v1Request, lambdaContext, securityWriter.writeSecurityContext(v1Request, lambdaContext)); - httpServletRequest.setServletContext(servletContext); - return httpServletRequest; + ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v1Request.getHttpMethod(), v1Request.getPath()); + + populateQueryStringParametersV1(v1Request, httpRequest); + populateMultiValueQueryStringParametersV1(v1Request, httpRequest); + + if (v1Request.getMultiValueHeaders() != null) { + MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); + httpRequest.setHeaders(headers); + } + populateContentAndContentType( + v1Request.getBody(), + v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE), + v1Request.isBase64Encoded(), + httpRequest + ); + if (v1Request.getRequestContext() != null) { + httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); + httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); + } + httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); + httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); + httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); + httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, + securityWriter.writeSecurityContext(v1Request, lambdaContext)); + return httpRequest; } + From 7bdce8e49fc904b16cabd8831c6e32939014c224 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 17 Feb 2026 13:10:56 -0800 Subject: [PATCH 1174/1214] add null check to generateRequest1 --- .../serverless/proxy/spring/AwsSpringHttpProcessingUtils.java | 4 +++- .../serverless/proxy/spring/AwsSpringHttpProcessingUtils.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index 0f6270b3..c94de305 100644 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -124,13 +124,15 @@ private static HttpServletRequest generateRequest1(String request, Context lambd populateQueryStringParametersV1(v1Request, httpRequest); populateMultiValueQueryStringParametersV1(v1Request, httpRequest); + String contentType = null; if (v1Request.getMultiValueHeaders() != null) { MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); httpRequest.setHeaders(headers); + contentType = v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); } populateContentAndContentType( v1Request.getBody(), - v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE), + contentType, v1Request.isBase64Encoded(), httpRequest ); diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java index b2bac134..b2c05465 100644 --- a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java @@ -125,13 +125,15 @@ private static HttpServletRequest generateRequest1(String request, Context lambd populateQueryStringParametersV1(v1Request, httpRequest); populateMultiValueQueryStringParametersV1(v1Request, httpRequest); + String contentType = null; if (v1Request.getMultiValueHeaders() != null) { MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); httpRequest.setHeaders(headers); + contentType = v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); } populateContentAndContentType( v1Request.getBody(), - v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE), + contentType, v1Request.isBase64Encoded(), httpRequest ); From 87bda8f1fadb852c19c2a193169e6b4c5f723f03 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 17 Feb 2026 14:56:54 -0800 Subject: [PATCH 1175/1214] add attribute and null tests to http process test in SB3/4 --- .../AwsSpringHttpProcessingUtilsTests.java | 45 +++++++++++++++++++ .../AwsSpringHttpProcessingUtilsTests.java | 45 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 94232cbf..60d7e906 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.model.AlbContext; @@ -218,6 +219,10 @@ public static Collection data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT}); } + public static Collection v1Data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT, ALB_EVENT}); + } + @MethodSource("data") @ParameterizedTest public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { @@ -268,6 +273,46 @@ public void validateRequestResponse(String jsonEvent) throws Exception { } } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateLambdaContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY)); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateSecurityContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY)); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateNullMultiValueHeaders(String jsonEvent) throws Exception { + Map event = mapper.readValue(jsonEvent, Map.class); + event.put("multiValueHeaders", null); + String modifiedEvent = mapper.writeValueAsString(event); + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); + assertNotNull(request); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateBase64EncodedBody(String jsonEvent) throws Exception { + String base64Body = java.util.Base64.getEncoder().encodeToString("test body".getBytes(StandardCharsets.UTF_8)); + Map event = mapper.readValue(jsonEvent, Map.class); + event.put("body", base64Body); + event.put("isBase64Encoded", true); + String modifiedEvent = mapper.writeValueAsString(event); + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); + assertNotNull(request); + } @EnableAutoConfiguration @Configuration diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index b0271b7b..3ed34112 100644 --- a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Collection; +import java.util.Map; import com.amazonaws.serverless.proxy.RequestReader; import com.amazonaws.serverless.proxy.model.AlbContext; @@ -219,6 +220,10 @@ public static Collection data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT}); } + public static Collection v1Data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT, ALB_EVENT}); + } + @MethodSource("data") @ParameterizedTest public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { @@ -256,6 +261,46 @@ public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { } + @MethodSource("v1Data") + @ParameterizedTest + public void validateLambdaContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY)); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateSecurityContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY)); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateNullMultiValueHeaders(String jsonEvent) throws Exception { + Map event = mapper.readValue(jsonEvent, Map.class); + event.put("multiValueHeaders", null); + String modifiedEvent = mapper.writeValueAsString(event); + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); + assertNotNull(request); + } + + @MethodSource("v1Data") + @ParameterizedTest + public void validateBase64EncodedBody(String jsonEvent) throws Exception { + String base64Body = java.util.Base64.getEncoder().encodeToString("test body".getBytes(StandardCharsets.UTF_8)); + Map event = mapper.readValue(jsonEvent, Map.class); + event.put("body", base64Body); + event.put("isBase64Encoded", true); + String modifiedEvent = mapper.writeValueAsString(event); + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); + assertNotNull(request); + } + @EnableAutoConfiguration @Configuration @EnableWebSecurity From 1a699a178e2a4df23f5a358365f7f06fe642a102 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 17 Feb 2026 15:27:40 -0800 Subject: [PATCH 1176/1214] add further testing for v2 requests --- .../AwsSpringHttpProcessingUtilsTests.java | 32 ++++++++++++- .../AwsSpringHttpProcessingUtilsTests.java | 47 ++++++++++++++++++- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 60d7e906..066b616f 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -223,6 +223,10 @@ public static Collection v1Data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, ALB_EVENT}); } + public static Collection v2Data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT_V2}); + } + @MethodSource("data") @ParameterizedTest public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { @@ -282,7 +286,7 @@ public void validateLambdaContextAttribute(String jsonEvent) { assertNotNull(request.getAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY)); } - @MethodSource("v1Data") + @MethodSource("data") @ParameterizedTest public void validateSecurityContextAttribute(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); @@ -301,7 +305,7 @@ public void validateNullMultiValueHeaders(String jsonEvent) throws Exception { assertNotNull(request); } - @MethodSource("v1Data") + @MethodSource("data") @ParameterizedTest public void validateBase64EncodedBody(String jsonEvent) throws Exception { String base64Body = java.util.Base64.getEncoder().encodeToString("test body".getBytes(StandardCharsets.UTF_8)); @@ -313,6 +317,30 @@ public void validateBase64EncodedBody(String jsonEvent) throws Exception { HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); assertNotNull(request); } + + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY)); + } + + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiStageVarsAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); + } + + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiEventAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); + } @EnableAutoConfiguration @Configuration diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 3ed34112..f9215282 100644 --- a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -224,6 +224,10 @@ public static Collection v1Data() { return Arrays.asList(new String[]{API_GATEWAY_EVENT, ALB_EVENT}); } + public static Collection v2Data() { + return Arrays.asList(new String[]{API_GATEWAY_EVENT_V2}); + } + @MethodSource("data") @ParameterizedTest public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { @@ -259,6 +263,21 @@ public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { // spot check some headers assertRequest(request); } + + @MethodSource("data") + @ParameterizedTest + public void validateRequestResponse(String jsonEvent) throws Exception { + try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { + ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context); + AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); + AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( + AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, + mvc.getServletContext(), mapper), mvc, responseWriter); + assertEquals("hello", awsResponse.getBody()); + assertEquals(200, awsResponse.getStatusCode()); + } + + } @MethodSource("v1Data") @@ -269,7 +288,7 @@ public void validateLambdaContextAttribute(String jsonEvent) { assertNotNull(request.getAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY)); } - @MethodSource("v1Data") + @MethodSource("data") @ParameterizedTest public void validateSecurityContextAttribute(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); @@ -288,7 +307,7 @@ public void validateNullMultiValueHeaders(String jsonEvent) throws Exception { assertNotNull(request); } - @MethodSource("v1Data") + @MethodSource("data") @ParameterizedTest public void validateBase64EncodedBody(String jsonEvent) throws Exception { String base64Body = java.util.Base64.getEncoder().encodeToString("test body".getBytes(StandardCharsets.UTF_8)); @@ -301,6 +320,30 @@ public void validateBase64EncodedBody(String jsonEvent) throws Exception { assertNotNull(request); } + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiContextAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY)); + } + + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiStageVarsAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); + } + + @MethodSource("v2Data") + @ParameterizedTest + public void validateHttpApiEventAttribute(String jsonEvent) { + ServerlessServletContext servletContext = new ServerlessServletContext(); + HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); + } + @EnableAutoConfiguration @Configuration @EnableWebSecurity From 8b2db991ef5e99f0f61d86151157f0ed275bacfd Mon Sep 17 00:00:00 2001 From: tobixlea Date: Tue, 17 Feb 2026 15:34:16 -0800 Subject: [PATCH 1177/1214] combine v2 request tests into one test --- .../AwsSpringHttpProcessingUtilsTests.java | 18 ++---------------- .../AwsSpringHttpProcessingUtilsTests.java | 18 ++---------------- 2 files changed, 4 insertions(+), 32 deletions(-) diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index 066b616f..d09a4079 100644 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -324,22 +324,8 @@ public void validateHttpApiContextAttribute(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); assertNotNull(request.getAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY)); - } - - @MethodSource("v2Data") - @ParameterizedTest - public void validateHttpApiStageVarsAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); - } - - @MethodSource("v2Data") - @ParameterizedTest - public void validateHttpApiEventAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); } @EnableAutoConfiguration diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java index f9215282..d02a4360 100644 --- a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java @@ -326,22 +326,8 @@ public void validateHttpApiContextAttribute(String jsonEvent) { ServerlessServletContext servletContext = new ServerlessServletContext(); HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); assertNotNull(request.getAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY)); - } - - @MethodSource("v2Data") - @ParameterizedTest - public void validateHttpApiStageVarsAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); - } - - @MethodSource("v2Data") - @ParameterizedTest - public void validateHttpApiEventAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); + assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); } @EnableAutoConfiguration From 7f74576d939351dc44db0bddee21a3ccdc0f11ac Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 18 Feb 2026 10:24:25 -0800 Subject: [PATCH 1178/1214] migration from nexus 2 to Maven Central --- .github/workflows/release.yml | 6 +++--- pom.xml | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7ff2bea7..fc9bba75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: with: distribution: 'corretto' java-version: 17 - server-id: sonatype-nexus-staging + server-id: sonatype-central-staging server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} # Value of the GPG private key to import @@ -32,6 +32,6 @@ jobs: - name: Release and publish package run: mvn release:prepare release:perform -B -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} env: - MAVEN_USERNAME: ${{ secrets.OSSRH_JIRA_USERNAME }} - MAVEN_PASSWORD: ${{ secrets.OSSRH_JIRA_PASSWORD }} + MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/pom.xml b/pom.xml index 30bf82e9..00105c1a 100644 --- a/pom.xml +++ b/pom.xml @@ -44,9 +44,9 @@ - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://aws.oss.sonatype.org/content/repositories/snapshots + sonatype-central-snapshots + Sonatype Central Snapshots + https://ossrh-staging-api.central.sonatype.com/content/repositories/snapshots false @@ -58,14 +58,14 @@ - sonatype-nexus-snapshots - Sonatype Nexus Snapshots - https://aws.oss.sonatype.org/content/repositories/snapshots/ + sonatype-central-snapshots + Sonatype Central Snapshots + https://ossrh-staging-api.central.sonatype.com/content/repositories/snapshots/ - sonatype-nexus-staging - Nexus Release Repository - https://aws.oss.sonatype.org/service/local/staging/deploy/maven2/ + sonatype-central-staging + Central Release Repository + https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/ From 03c86cef888cb1781fedb44970c7eb8fc30fdb8e Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 18 Feb 2026 13:31:00 -0800 Subject: [PATCH 1179/1214] hardcode project version for springboot3 --- .../src/main/resources/archetype-resources/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml index 74372fe5..39f5f603 100644 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml @@ -33,7 +33,7 @@ com.amazonaws.serverless aws-serverless-java-container-core - ${project.version} + 2.1.5 tests test-jar test From 0625119c094238c46af1eee8c1165647ae896eba Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 18 Feb 2026 22:24:36 +0000 Subject: [PATCH 1180/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 2 +- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index ed20a5de..b250a27b 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 2.1.5 + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 52eecd58..b6d09bbc 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 2.1.5 + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.5 + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 00105c1a..52416427 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -39,7 +39,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 6a1ae72d6a2249cc9b5568de740815bad4270c9e Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 18 Feb 2026 22:24:37 +0000 Subject: [PATCH 1181/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 3 ++- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 10 files changed, 23 insertions(+), 22 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index b250a27b..bf386682 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,13 +3,14 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 com.amazonaws.serverless aws-serverless-java-container-springboot3 + 2.1.5 AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index b6d09bbc..58f92253 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 3.0.0 + 2.1.5 maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..82e1ad03 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index 52416427..00105c1a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -39,7 +39,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From 5d4a51905b8a31e5ddbdafc0617679c835484504 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 21:26:10 +0000 Subject: [PATCH 1182/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index bf386682..d1bf47e3 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,14 +3,14 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 com.amazonaws.serverless aws-serverless-java-container-springboot3 - 2.1.5 + 3.0.0 AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 58f92253..b6d09bbc 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 2.1.5 + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 00105c1a..52416427 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -39,7 +39,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From cc6ec72ad100d659e2273499328b76bd0f514b4b Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 14:23:36 -0800 Subject: [PATCH 1183/1214] Revert "chore: release - prepare release aws-serverless-java-container-3.0.0" This reverts commit 5d4a51905b8a31e5ddbdafc0617679c835484504. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot3/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot3-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index d1bf47e3..bf386682 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,14 +3,14 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 com.amazonaws.serverless aws-serverless-java-container-springboot3 - 3.0.0 + 2.1.5 AWS Serverless Java container support - SpringBoot 3 implementation Allows Java applications written for SpringBoot 3 to run in AWS Lambda https://aws.amazon.com/lambda diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index b6d09bbc..58f92253 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot3-archetype - 3.0.0 + 2.1.5 maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..82e1ad03 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index 52416427..00105c1a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -39,7 +39,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From fb05a05521dac5b0e07ef5fa918833b20fe8c99e Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 14:35:22 -0800 Subject: [PATCH 1184/1214] fix: exclude springboot3 modules from release for backwards compatibility --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 00105c1a..18f300f5 100644 --- a/pom.xml +++ b/pom.xml @@ -28,11 +28,9 @@ aws-serverless-java-container-core aws-serverless-java-container-jersey aws-serverless-java-container-spring - aws-serverless-java-container-springboot3 aws-serverless-java-container-springboot4 aws-serverless-jersey-archetype aws-serverless-spring-archetype - aws-serverless-springboot3-archetype aws-serverless-springboot4-archetype From bbb949a0de0cd30e4bb54b120f0e85cf638b595d Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 23:17:27 +0000 Subject: [PATCH 1185/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 18f300f5..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 5f81e6bef2f8be1cf6c42618a2ffefaa12d96bb7 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 23:17:29 +0000 Subject: [PATCH 1186/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..388b83b5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..ebdb94bb 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..eaf43de8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..c59a4583 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.1-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..a03527f1 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..7ff2c5f0 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..b72cd736 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..c1c68b1b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.1-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From 3ea672e81ef093812c88734aebea062cd371320c Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 15:57:48 -0800 Subject: [PATCH 1187/1214] Revert "chore: release - prepare for next development iteration" This reverts commit 5f81e6bef2f8be1cf6c42618a2ffefaa12d96bb7. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 388b83b5..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ebdb94bb..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eaf43de8..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index c59a4583..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.1-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a03527f1..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7ff2c5f0..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index b72cd736..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index c1c68b1b..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.1-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 8773de64449d4ded1afee498c6af1814fc7e5f52 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Thu, 19 Feb 2026 15:57:48 -0800 Subject: [PATCH 1188/1214] Revert "chore: release - prepare release aws-serverless-java-container-3.0.0" This reverts commit bbb949a0de0cd30e4bb54b120f0e85cf638b595d. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..82e1ad03 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..18f300f5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From e96babed978aba87814c8331f795087fb4011b0f Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 00:06:16 +0000 Subject: [PATCH 1189/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 18f300f5..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 0c13f59d09d6e13ce8abff758e789ebc93923e9c Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 00:06:18 +0000 Subject: [PATCH 1190/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..388b83b5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..ebdb94bb 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..eaf43de8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..c59a4583 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.1-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..a03527f1 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..7ff2c5f0 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..b72cd736 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..c1c68b1b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.1-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From 7e05a064256391d8376511bf668f21680c546009 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 13:45:50 -0800 Subject: [PATCH 1191/1214] Revert "chore: release - prepare for next development iteration" This reverts commit 0c13f59d09d6e13ce8abff758e789ebc93923e9c. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 388b83b5..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ebdb94bb..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eaf43de8..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index c59a4583..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.1-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a03527f1..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7ff2c5f0..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index b72cd736..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index c1c68b1b..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.1-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From d9c959264d27d56e3acae5a10945b33ca9f1a1f7 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 13:45:50 -0800 Subject: [PATCH 1192/1214] Revert "chore: release - prepare release aws-serverless-java-container-3.0.0" This reverts commit e96babed978aba87814c8331f795087fb4011b0f. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..82e1ad03 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..18f300f5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From 25106b69ba0a80e9cdb0b23cd675feb09c4610db Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 13:51:45 -0800 Subject: [PATCH 1193/1214] add POST request to release workflow instead of manually running --- .github/workflows/release.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a03e217..5e17e779 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,6 +34,13 @@ jobs: gpg-passphrase: GPG_PASSPHRASE # env variable for GPG private key passphrase - name: Release and publish package run: mvn release:prepare release:perform -B -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} + - name: Upload to Central Portal + run: | + curl -X POST \ + -u "${{ secrets.CENTRAL_USERNAME }}:${{ secrets.CENTRAL_PASSWORD }}" \ + -H "Content-Type: application/json" \ + -d '{"deploymentName": "com.amazonaws.serverless-${{ github.event.inputs.releaseVersion }}"}' \ + https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless env: MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} From 34102f52c344f16f1470a9c1866f87953f016e71 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 22:33:17 +0000 Subject: [PATCH 1194/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 18f300f5..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 0bc0eb111ce93e6e35190ed412e4e4570434dcc3 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 22:33:19 +0000 Subject: [PATCH 1195/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..388b83b5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..ebdb94bb 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..eaf43de8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..c59a4583 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.1-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..a03527f1 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..7ff2c5f0 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..b72cd736 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..c1c68b1b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.1-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From c7aad5037045ac35da6318e43702d13f07da21f3 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 14:52:39 -0800 Subject: [PATCH 1196/1214] add names to archetype poms for validation for publishing --- .github/workflows/release.yml | 7 ------- aws-serverless-jersey-archetype/pom.xml | 1 + aws-serverless-spring-archetype/pom.xml | 1 + aws-serverless-springboot4-archetype/pom.xml | 1 + 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5e17e779..9a03e217 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,13 +34,6 @@ jobs: gpg-passphrase: GPG_PASSPHRASE # env variable for GPG private key passphrase - name: Release and publish package run: mvn release:prepare release:perform -B -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} - - name: Upload to Central Portal - run: | - curl -X POST \ - -u "${{ secrets.CENTRAL_USERNAME }}:${{ secrets.CENTRAL_PASSWORD }}" \ - -H "Content-Type: application/json" \ - -d '{"deploymentName": "com.amazonaws.serverless-${{ github.event.inputs.releaseVersion }}"}' \ - https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless env: MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..63ddcb4a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-jersey-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..ad621f00 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-spring-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..61042f44 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-springboot4-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git From 9bc8f7e8dd5feba735a3f5ba61dd625ce4a89cc4 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 15:00:24 -0800 Subject: [PATCH 1197/1214] Revert "chore: release - prepare for next development iteration" This reverts commit 0bc0eb111ce93e6e35190ed412e4e4570434dcc3. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 388b83b5..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ebdb94bb..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eaf43de8..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index c59a4583..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.1-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a03527f1..078a651b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7ff2c5f0..374e6eec 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index b72cd736..f8a3c1e9 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.1-SNAPSHOT + 3.0.0 maven-archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index c1c68b1b..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.1-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 7ec063d2eb9bb1b4139980a7b8349ee6cf24db23 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 15:00:24 -0800 Subject: [PATCH 1198/1214] Revert "chore: release - prepare release aws-serverless-java-container-3.0.0" This reverts commit 34102f52c344f16f1470a9c1866f87953f016e71. --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..0090d851 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..22cf9680 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..4d6047d2 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..7b7bf526 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.0-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 078a651b..8c1d68ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 374e6eec..fc00bb2c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index f8a3c1e9..82e1ad03 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,17 +4,17 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.0-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.0-SNAPSHOT maven-archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..18f300f5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.0-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From 730906afff4322de4ffe8de837fc138d4174d2f7 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 14:52:39 -0800 Subject: [PATCH 1199/1214] add names to archetype poms for validation for publishing --- aws-serverless-jersey-archetype/pom.xml | 1 + aws-serverless-spring-archetype/pom.xml | 1 + aws-serverless-springboot4-archetype/pom.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 8c1d68ed..63ddcb4a 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-jersey-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index fc00bb2c..ad621f00 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-spring-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 82e1ad03..61042f44 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -11,6 +11,7 @@ aws-serverless-springboot4-archetype 3.0.0-SNAPSHOT maven-archetype + AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git From ea1ac82bbd6068d79f067e1e7b8ef07d0b9bcc68 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 23:26:36 +0000 Subject: [PATCH 1200/1214] chore: release - prepare release aws-serverless-java-container-3.0.0 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 0090d851..f69fffbe 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 22cf9680..27540c95 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 4d6047d2..c90bb58f 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 7b7bf526..3171a87d 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.0 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 63ddcb4a..ca71614b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index ad621f00..08a8fa70 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 61042f44..464fddf7 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.0 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0-SNAPSHOT + 3.0.0 maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 diff --git a/pom.xml b/pom.xml index 18f300f5..cddfeb8c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0-SNAPSHOT + 3.0.0 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.0 From 2ab7fa91cf899713c9bfa3d6e5051c5611ecd531 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Fri, 20 Feb 2026 23:26:37 +0000 Subject: [PATCH 1201/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f69fffbe..388b83b5 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 27540c95..ebdb94bb 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index c90bb58f..eaf43de8 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 3171a87d..c59a4583 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0 + 3.0.1-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index ca71614b..a45f3a7b 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 08a8fa70..98d9f5e2 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 464fddf7..83cc9b91 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0 + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.0 + 3.0.1-SNAPSHOT maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD diff --git a/pom.xml b/pom.xml index cddfeb8c..c1c68b1b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.0 + 3.0.1-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.0 + HEAD From dce7757889ee5fdd479ce681e8d0cd7d96ab5447 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 2 Mar 2026 09:55:16 -0800 Subject: [PATCH 1202/1214] add POST request to workflow for upload to maven --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9a03e217..87becd8f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,3 +38,8 @@ jobs: MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + - name: Upload to Central Publisher Portal + run: | + AUTH=$(echo -n "${{ secrets.CENTRAL_USERNAME }}:${{ secrets.CENTRAL_PASSWORD }}" | base64) + curl -X POST "https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless" \ + -H "Authorization: Bearer $AUTH" From c587724af80ab9b588f521ef7e412f528ac8cc54 Mon Sep 17 00:00:00 2001 From: Dmytro Kosmakov Date: Tue, 3 Mar 2026 22:06:12 +0000 Subject: [PATCH 1203/1214] Remove startAsync() to prevent void methods from hanging forever --- .../AwsSpringWebCustomRuntimeEventLoop.java | 1 - ...pringDelegatingLambdaContainerHandler.java | 1 - ...DelegatingLambdaContainerHandlerTests.java | 352 +++++++++--------- .../spring/servletapp/ServletApplication.java | 4 + 4 files changed, 187 insertions(+), 171 deletions(-) diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java index 97041824..d4e8cc0b 100644 --- a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java @@ -130,7 +130,6 @@ private void eventLoop(ServletWebServerApplicationContext context) { HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils.generateHttpServletRequest( incomingEvent.getBody(), null, mvc.getServletContext(), mapper); - httpServletRequest.startAsync(); AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( httpServletRequest, mvc, responseWriter); if (logger.isDebugEnabled()) { diff --git a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java index 5af476d7..178abdb7 100644 --- a/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ b/aws-serverless-java-container-springboot4/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java @@ -78,7 +78,6 @@ public void handleRequest(InputStream input, OutputStream output, Context lambda ServerlessMVC mvc = initHandler.getMvc(); HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils .generateHttpServletRequest(input, lambdaContext, mvc.getServletContext(), this.mapper); - httpServletRequest.startAsync(); AwsProxyResponse awsProxyResponse = AwsSpringHttpProcessingUtils.processRequest(httpServletRequest, mvc, responseWriter); this.mapper.writeValue(output, awsProxyResponse); } diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java index e98b1987..86fd8a96 100644 --- a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java @@ -23,175 +23,177 @@ @SuppressWarnings("rawtypes") public class SpringDelegatingLambdaContainerHandlerTests { - private static String API_GATEWAY_EVENT = "{\n" - + " \"version\": \"1.0\",\n" - + " \"resource\": \"$default\",\n" - + " \"path\": \"/async\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"headers\": {\n" - + " \"Content-Length\": \"45\",\n" - + " \"Content-Type\": \"application/json\",\n" - + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"User-Agent\": \"curl/7.79.1\",\n" - + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" - + " \"X-Forwarded-For\": \"109.210.252.44\",\n" - + " \"X-Forwarded-Port\": \"443\",\n" - + " \"X-Forwarded-Proto\": \"https\",\n" - + " \"accept\": \"*/*\"\n" - + " },\n" - + " \"multiValueHeaders\": {\n" - + " \"Content-Length\": [\n" - + " \"45\"\n" - + " ],\n" - + " \"Content-Type\": [\n" - + " \"application/json\"\n" - + " ],\n" - + " \"Host\": [\n" - + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" - + " ],\n" - + " \"User-Agent\": [\n" - + " \"curl/7.79.1\"\n" - + " ],\n" - + " \"X-Amzn-Trace-Id\": [\n" - + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" - + " ],\n" - + " \"X-Forwarded-For\": [\n" - + " \"109.210.252.44\"\n" - + " ],\n" - + " \"X-Forwarded-Port\": [\n" - + " \"443\"\n" - + " ],\n" - + " \"X-Forwarded-Proto\": [\n" - + " \"https\"\n" - + " ],\n" - + " \"accept\": [\n" - + " \"*/*\"\n" - + " ]\n" - + " },\n" - + " \"queryStringParameters\": {\n" - + " \"abc\": \"xyz\",\n" - + " \"name\": \"Ricky\",\n" - + " \"foo\": \"baz\"\n" - + " },\n" - + " \"multiValueQueryStringParameters\": {\n" - + " \"abc\": [\n" - + " \"xyz\"\n" - + " ],\n" - + " \"name\": [\n" - + " \"Ricky\"\n" - + " ],\n" - + " \"foo\": [\n" - + " \"bar\",\n" - + " \"baz\"\n" - + " ]\n" - + " },\n" - + " \"requestContext\": {\n" - + " \"accountId\": \"123456789098\",\n" - + " \"apiId\": \"i76bfhczs0\",\n" - + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"domainPrefix\": \"i76bfhczs0\",\n" - + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"identity\": {\n" - + " \"accessKey\": null,\n" - + " \"accountId\": null,\n" - + " \"caller\": null,\n" - + " \"cognitoAmr\": null,\n" - + " \"cognitoAuthenticationProvider\": null,\n" - + " \"cognitoAuthenticationType\": null,\n" - + " \"cognitoIdentityId\": null,\n" - + " \"cognitoIdentityPoolId\": null,\n" - + " \"principalOrgId\": null,\n" - + " \"sourceIp\": \"109.210.252.44\",\n" - + " \"user\": null,\n" - + " \"userAgent\": \"curl/7.79.1\",\n" - + " \"userArn\": null\n" - + " },\n" - + " \"path\": \"/pets\",\n" - + " \"protocol\": \"HTTP/1.1\",\n" - + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" - + " \"requestTimeEpoch\": 1678276240455,\n" - + " \"resourceId\": \"$default\",\n" - + " \"resourcePath\": \"$default\",\n" - + " \"stage\": \"$default\"\n" - + " },\n" - + " \"pathParameters\": null,\n" - + " \"stageVariables\": null,\n" - + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" - + " \"isBase64Encoded\": false\n" - + "}"; + private static final String API_GATEWAY_EVENT = """ + { + "version": "1.0", + "resource": "$default", + "path": "/async", + "httpMethod": "POST", + "headers": { + "Content-Length": "45", + "Content-Type": "application/json", + "Host": "i76bfh111.execute-api.eu-west-3.amazonaws.com", + "User-Agent": "curl/7.79.1", + "X-Amzn-Trace-Id": "Root=1-64087690-2151375b219d3ba3389ea84e", + "X-Forwarded-For": "109.210.252.44", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https", + "accept": "*/*" + }, + "multiValueHeaders": { + "Content-Length": [ + "45" + ], + "Content-Type": [ + "application/json" + ], + "Host": [ + "i76bfhczs0.execute-api.eu-west-3.amazonaws.com" + ], + "User-Agent": [ + "curl/7.79.1" + ], + "X-Amzn-Trace-Id": [ + "Root=1-64087690-2151375b219d3ba3389ea84e" + ], + "X-Forwarded-For": [ + "109.210.252.44" + ], + "X-Forwarded-Port": [ + "443" + ], + "X-Forwarded-Proto": [ + "https" + ], + "accept": [ + "*/*" + ] + }, + "queryStringParameters": { + "abc": "xyz", + "name": "Ricky", + "foo": "baz" + }, + "multiValueQueryStringParameters": { + "abc": [ + "xyz" + ], + "name": [ + "Ricky" + ], + "foo": [ + "bar", + "baz" + ] + }, + "requestContext": { + "accountId": "123456789098", + "apiId": "i76bfhczs0", + "domainName": "i76bfhc111.execute-api.eu-west-3.amazonaws.com", + "domainPrefix": "i76bfhczs0", + "extendedRequestId": "Bdd2ngt5iGYEMIg=", + "httpMethod": "POST", + "identity": { + "accessKey": null, + "accountId": null, + "caller": null, + "cognitoAmr": null, + "cognitoAuthenticationProvider": null, + "cognitoAuthenticationType": null, + "cognitoIdentityId": null, + "cognitoIdentityPoolId": null, + "principalOrgId": null, + "sourceIp": "109.210.252.44", + "user": null, + "userAgent": "curl/7.79.1", + "userArn": null + }, + "path": "/pets", + "protocol": "HTTP/1.1", + "requestId": "Bdd2ngt5iGYEMIg=", + "requestTime": "08/Mar/2023:11:50:40 +0000", + "requestTimeEpoch": 1678276240455, + "resourceId": "$default", + "resourcePath": "$default", + "stage": "$default" + }, + "pathParameters": null, + "stageVariables": null, + "body": "{\\"name\\":\\"bob\\"}", + "isBase64Encoded": false + }"""; - private static String API_GATEWAY_EVENT_V2 = "{\n" + - " \"version\": \"2.0\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"rawPath\": \"/my/path\",\n" + - " \"rawQueryString\": \"parameter1=value1¶meter1=value2&name=Ricky¶meter2=value\",\n" + - " \"cookies\": [\n" + - " \"cookie1\",\n" + - " \"cookie2\"\n" + - " ],\n" + - " \"headers\": {\n" + - " \"header1\": \"value1\",\n" + - " \"header2\": \"value1,value2\"\n" + - " },\n" + - " \"queryStringParameters\": {\n" + - " \"parameter1\": \"value1,value2\",\n" + - " \"name\": \"Ricky\",\n" + - " \"parameter2\": \"value\"\n" + - " },\n" + - " \"requestContext\": {\n" + - " \"accountId\": \"123456789012\",\n" + - " \"apiId\": \"api-id\",\n" + - " \"authentication\": {\n" + - " \"clientCert\": {\n" + - " \"clientCertPem\": \"CERT_CONTENT\",\n" + - " \"subjectDN\": \"www.example.com\",\n" + - " \"issuerDN\": \"Example issuer\",\n" + - " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + - " \"validity\": {\n" + - " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + - " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"authorizer\": {\n" + - " \"jwt\": {\n" + - " \"claims\": {\n" + - " \"claim1\": \"value1\",\n" + - " \"claim2\": \"value2\"\n" + - " },\n" + - " \"scopes\": [\n" + - " \"scope1\",\n" + - " \"scope2\"\n" + - " ]\n" + - " }\n" + - " },\n" + - " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + - " \"domainPrefix\": \"id\",\n" + - " \"http\": {\n" + - " \"method\": \"POST\",\n" + - " \"path\": \"/my/path\",\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"sourceIp\": \"IP\",\n" + - " \"userAgent\": \"agent\"\n" + - " },\n" + - " \"requestId\": \"id\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"stage\": \"$default\",\n" + - " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + - " \"timeEpoch\": 1583348638390\n" + - " },\n" + - " \"body\": \"Hello from Lambda\",\n" + - " \"pathParameters\": {\n" + - " \"parameter1\": \"value1\"\n" + - " },\n" + - " \"isBase64Encoded\": false,\n" + - " \"stageVariables\": {\n" + - " \"stageVariable1\": \"value1\",\n" + - " \"stageVariable2\": \"value2\"\n" + - " }\n" + - "}"; + private static final String API_GATEWAY_EVENT_V2 = """ + { + "version": "2.0", + "routeKey": "$default", + "rawPath": "/my/path", + "rawQueryString": "parameter1=value1¶meter1=value2&name=Ricky¶meter2=value", + "cookies": [ + "cookie1", + "cookie2" + ], + "headers": { + "header1": "value1", + "header2": "value1,value2" + }, + "queryStringParameters": { + "parameter1": "value1,value2", + "name": "Ricky", + "parameter2": "value" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "api-id", + "authentication": { + "clientCert": { + "clientCertPem": "CERT_CONTENT", + "subjectDN": "www.example.com", + "issuerDN": "Example issuer", + "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1", + "validity": { + "notBefore": "May 28 12:30:02 2019 GMT", + "notAfter": "Aug 5 09:36:04 2021 GMT" + } + } + }, + "authorizer": { + "jwt": { + "claims": { + "claim1": "value1", + "claim2": "value2" + }, + "scopes": [ + "scope1", + "scope2" + ] + } + }, + "domainName": "id.execute-api.us-east-1.amazonaws.com", + "domainPrefix": "id", + "http": { + "method": "POST", + "path": "/my/path", + "protocol": "HTTP/1.1", + "sourceIp": "IP", + "userAgent": "agent" + }, + "requestId": "id", + "routeKey": "$default", + "stage": "$default", + "time": "12/Mar/2020:19:03:58 +0000", + "timeEpoch": 1583348638390 + }, + "body": "Hello from Lambda", + "pathParameters": { + "parameter1": "value1" + }, + "isBase64Encoded": false, + "stageVariables": { + "stageVariable1": "value1", + "stageVariable2": "value2" + } + }"""; private SpringDelegatingLambdaContainerHandler handler; @@ -202,7 +204,7 @@ public void initServletAppTest() throws ContainerInitializationException { } public static Collection data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); + return Arrays.asList(API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2); } @MethodSource("data") @@ -281,6 +283,18 @@ public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) t assertEquals("test message", result.get("body")); } + @MethodSource("data") + @ParameterizedTest + public void voidPost_returns200(String jsonEvent) throws Exception { + initServletAppTest(); + InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", + "/void-post", "{\"key\":\"value\"}", false, null)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + handler.handleRequest(targetStream, output, null); + Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); + assertEquals(200, result.get("statusCode")); + } + @SuppressWarnings({"unchecked" }) @MethodSource("data") @ParameterizedTest diff --git a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java index b2dc1a31..8ec4d57f 100644 --- a/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ b/aws-serverless-java-container-springboot4/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java @@ -22,4 +22,8 @@ public String complexRequest( ) { return gender + "/" + age + "/" + name; } + + @RequestMapping(path = "/void-post", method = RequestMethod.POST) + public void voidPost() { + } } From 013fa5bd01be32430dcd320d24915d032b0aafe7 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 16 Mar 2026 11:26:38 -0700 Subject: [PATCH 1204/1214] chore: add curl request to automate upload to central publisher portal --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 87becd8f..67808280 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,5 +41,5 @@ jobs: - name: Upload to Central Publisher Portal run: | AUTH=$(echo -n "${{ secrets.CENTRAL_USERNAME }}:${{ secrets.CENTRAL_PASSWORD }}" | base64) - curl -X POST "https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless" \ + curl --fail -X POST "https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless" \ -H "Authorization: Bearer $AUTH" From 809abee796c7cd4c8daaeabe35ffac180c60dedb Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 16 Mar 2026 22:39:00 +0000 Subject: [PATCH 1205/1214] chore: release - prepare release aws-serverless-java-container-3.0.1 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index 388b83b5..e7855e4d 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ebdb94bb..106db032 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index eaf43de8..473ff8bb 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index c59a4583..8ae66423 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.1-SNAPSHOT + 3.0.1 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index a45f3a7b..29b0d7ed 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.1-SNAPSHOT + 3.0.1 maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.1 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 98d9f5e2..0d75542e 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.1-SNAPSHOT + 3.0.1 maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.1 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 83cc9b91..d4603cc6 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1-SNAPSHOT + 3.0.1 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.1-SNAPSHOT + 3.0.1 maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.1 diff --git a/pom.xml b/pom.xml index c1c68b1b..e41d6890 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.1-SNAPSHOT + 3.0.1 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.1 From fae65dd79dd65ca2a570cea76b4a64f47fbb5187 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 16 Mar 2026 22:39:01 +0000 Subject: [PATCH 1206/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index e7855e4d..f3edfd4b 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 106db032..ef60040c 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 473ff8bb..8fb9d67a 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 8ae66423..10e97715 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.1 + 3.0.2-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index 29b0d7ed..f19504c1 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.1 + 3.0.2-SNAPSHOT maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.1 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 0d75542e..dec94010 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.1 + 3.0.2-SNAPSHOT maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.1 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index d4603cc6..9830c6e6 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.1 + 3.0.2-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.1 + 3.0.2-SNAPSHOT maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.1 + HEAD diff --git a/pom.xml b/pom.xml index e41d6890..cb32e8a4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.1 + 3.0.2-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.1 + HEAD From 4f7d246af5de29e07ac0483beca71917ddae0392 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 10 Jun 2026 11:38:57 -0700 Subject: [PATCH 1207/1214] rearranging ALB headers --- .../proxy/internal/jaxrs/AwsProxySecurityContext.java | 2 +- .../serverless/proxy/model/MultiValuedTreeMap.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java index 7c128cab..83b3e85a 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContext.java @@ -87,7 +87,7 @@ public Principal getUserPrincipal() { case API_GATEWAY: return event.getRequestContext().getAuthorizer().getPrincipalId(); case ALB: - return event.getMultiValueHeaders().getFirst(ALB_IDENTITY_HEADER); + return event.getMultiValueHeaders().getLast(ALB_IDENTITY_HEADER); } } else if (getAuthenticationScheme().equals(AUTH_SCHEME_AWS_IAM)) { // if we received credentials from Cognito Federated Identities then we return the identity id diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java index ad0593a1..f6439e82 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/MultiValuedTreeMap.java @@ -61,6 +61,14 @@ public Value getFirst(Key key) { return values.get(0); } + public Value getLast(Key key) { + List values = get(key); + if (values == null || values.isEmpty()) { + return null; + } + return values.get(values.size() - 1); + } + @Override public void putSingle(Key key, Value value) { List values = findKey(key); From a055e5fea117cdc55a04e411b0fb7ad9f5a45037 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Wed, 10 Jun 2026 11:53:45 -0700 Subject: [PATCH 1208/1214] add tests for rearranged ALB headers --- .../internal/jaxrs/AwsProxySecurityContextTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java index ed89bf86..f4641f36 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/jaxrs/AwsProxySecurityContextTest.java @@ -25,6 +25,12 @@ public class AwsProxySecurityContextTest { .header(ALB_ACESS_TOKEN_HEADER, "xxxxx") .header(ALB_IDENTITY_HEADER, COGNITO_IDENTITY_ID) .build(); + private static final AwsProxyRequest ALB_REQUEST_MULTIPLE_HEADERS = new AwsProxyRequestBuilder("/hello", "GET") + .alb() + .header(ALB_ACESS_TOKEN_HEADER, "xxxxx") + .header(ALB_IDENTITY_HEADER, "test-identity") + .header(ALB_IDENTITY_HEADER, COGNITO_IDENTITY_ID) + .build(); @Test void localVars_constructor_nullValues() { @@ -71,6 +77,12 @@ void alb_cognitoAuth_expectCustomSchemeAndCorrectPrincipal() { assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); } + @Test + void alb_multipleIdentityHeaders_usesLastValue() { + AwsProxySecurityContext context = new AwsProxySecurityContext(null, ALB_REQUEST_MULTIPLE_HEADERS); + assertEquals(COGNITO_IDENTITY_ID, context.getUserPrincipal().getName()); + } + @Test void userPool_getClaims_retrieveCustomClaim() { AwsProxySecurityContext context = new AwsProxySecurityContext(null, REQUEST_COGNITO_USER_POOL); From ff259908726892e71fdfdfb941f6c7cac7a12e0a Mon Sep 17 00:00:00 2001 From: Reed Hamilton Date: Thu, 11 Jun 2026 13:05:24 -0700 Subject: [PATCH 1209/1214] fix: use envvars in release action (#1607) * fix: use envvars in release action * fix: use env for secrets too --- .github/workflows/release.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 67808280..57750612 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,8 +20,10 @@ jobs: - uses: actions/checkout@v3 - name: Configure Git User # may be removed after https://github.com/actions/checkout/issues/13 is resolved run: | - git config user.email "${{ github.actor }}@users.noreply.github.com" - git config user.name "${{ github.actor }}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + git config user.name "$GITHUB_ACTOR" + env: + GITHUB_ACTOR: ${{ github.actor }} - name: Set up Maven uses: actions/setup-java@v3 with: @@ -33,13 +35,18 @@ jobs: gpg-private-key: ${{ secrets.GPG_SIGNING_KEY }} # Value of the GPG private key to import gpg-passphrase: GPG_PASSPHRASE # env variable for GPG private key passphrase - name: Release and publish package - run: mvn release:prepare release:perform -B -DreleaseVersion=${{ github.event.inputs.releaseVersion }} -DdevelopmentVersion=${{ github.event.inputs.developmentVersion }} + run: mvn release:prepare release:perform -B -DreleaseVersion="$RELEASE_VERSION" -DdevelopmentVersion="$DEVELOPMENT_VERSION" env: MAVEN_USERNAME: ${{ secrets.CENTRAL_USERNAME }} MAVEN_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + RELEASE_VERSION: ${{ github.event.inputs.releaseVersion }} + DEVELOPMENT_VERSION: ${{ github.event.inputs.developmentVersion }} - name: Upload to Central Publisher Portal run: | - AUTH=$(echo -n "${{ secrets.CENTRAL_USERNAME }}:${{ secrets.CENTRAL_PASSWORD }}" | base64) + AUTH=$(echo -n "$CENTRAL_USERNAME:$CENTRAL_PASSWORD" | base64) curl --fail -X POST "https://ossrh-staging-api.central.sonatype.com/manual/upload/defaultRepository/com.amazonaws.serverless" \ -H "Authorization: Bearer $AUTH" + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} From 0d25749c19f5abfa2ecec34c02648abe412c6862 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 15 Jun 2026 09:50:50 -0700 Subject: [PATCH 1210/1214] update parent pom version for springboot3 --- aws-serverless-java-container-springboot3/pom.xml | 2 +- aws-serverless-springboot3-archetype/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index bf386682..13b54f95 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.0-SNAPSHOT + 3.0.1-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml index 58f92253..a435098d 100644 --- a/aws-serverless-springboot3-archetype/pom.xml +++ b/aws-serverless-springboot3-archetype/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.0-SNAPSHOT + 3.0.1-SNAPSHOT com.amazonaws.serverless.archetypes From 828876419aa44d68c3651e05be8cfbae4c59bce7 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 15 Jun 2026 10:09:48 -0700 Subject: [PATCH 1211/1214] update springboot3 relative path --- aws-serverless-java-container-springboot3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml index 13b54f95..6d788dbe 100644 --- a/aws-serverless-java-container-springboot3/pom.xml +++ b/aws-serverless-java-container-springboot3/pom.xml @@ -4,7 +4,7 @@ aws-serverless-java-container com.amazonaws.serverless 3.0.1-SNAPSHOT - .. + 4.0.0 From 0920e321740a59683199eea97c2ed5649a76c2bd Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 15 Jun 2026 12:12:31 -0700 Subject: [PATCH 1212/1214] remove springboot3 from CI workflow --- .../continuous-integration-workflow.yml | 19 - .../pom.xml | 363 ------------------ .../spotbugs-excludeFilter.xml | 28 -- .../spring/AwsSpringAotTypesProcessor.java | 97 ----- .../spring/AwsSpringHttpProcessingUtils.java | 246 ------------ .../AwsSpringWebCustomRuntimeEventLoop.java | 182 --------- .../AwsSpringWebRuntimeInitializer.java | 66 ---- .../SpringBootAwsProxyExceptionHandler.java | 27 -- .../SpringBootLambdaContainerHandler.java | 236 ------------ .../spring/SpringBootProxyHandlerBuilder.java | 88 ----- ...pringDelegatingLambdaContainerHandler.java | 91 ----- ...sReactiveServletEmbeddedServerFactory.java | 105 ----- ...erverlessServletEmbeddedServerFactory.java | 65 ---- .../main/resources/META-INF/spring.factories | 2 - .../resources/META-INF/spring/aot.factories | 1 - .../proxy/spring/AWSWebRuntimeTests.java | 39 -- .../AwsSpringHttpProcessingUtilsTests.java | 349 ----------------- .../serverless/proxy/spring/JpaAppTest.java | 52 --- .../proxy/spring/SecurityAppTest.java | 39 -- .../proxy/spring/ServletAppTest.java | 236 ------------ .../serverless/proxy/spring/SlowAppTest.java | 32 -- .../SpringBootLambdaContainerHandlerTest.java | 76 ---- ...DelegatingLambdaContainerHandlerTests.java | 350 ----------------- .../proxy/spring/WebFluxAppTest.java | 68 ---- ...rlessServletEmbeddedServerFactoryTest.java | 49 --- .../proxy/spring/jpaapp/DatabaseConfig.java | 23 -- .../proxy/spring/jpaapp/JpaApplication.java | 17 - .../proxy/spring/jpaapp/LambdaHandler.java | 59 --- .../spring/jpaapp/MessageController.java | 31 -- .../spring/securityapp/LambdaHandler.java | 25 -- .../spring/securityapp/MessageController.java | 17 - .../securityapp/SecurityApplication.java | 17 - .../spring/securityapp/SecurityConfig.java | 44 --- .../spring/servletapp/LambdaHandler.java | 60 --- .../servletapp/LambdaStreamHandler.java | 63 --- .../spring/servletapp/MessageController.java | 75 ---- .../proxy/spring/servletapp/MessageData.java | 20 - .../spring/servletapp/ServletApplication.java | 32 -- .../proxy/spring/servletapp/UserData.java | 50 --- .../proxy/spring/slowapp/LambdaHandler.java | 40 -- .../spring/slowapp/MessageController.java | 15 - .../spring/slowapp/SlowTestApplication.java | 26 -- .../spring/webfluxapp/LambdaHandler.java | 58 --- .../spring/webfluxapp/MessageController.java | 36 -- .../proxy/spring/webfluxapp/MessageData.java | 20 - .../webfluxapp/WebFluxTestApplication.java | 22 -- aws-serverless-springboot3-archetype/pom.xml | 80 ---- .../META-INF/maven/archetype-metadata.xml | 39 -- .../resources/archetype-resources/README.md | 99 ----- .../archetype-resources/build.gradle | 37 -- .../resources/archetype-resources/pom.xml | 180 --------- .../archetype-resources/src/assembly/bin.xml | 27 -- .../src/main/java/Application.java | 24 -- .../src/main/java/StreamLambdaHandler.java | 33 -- .../main/java/controller/PingController.java | 20 - .../src/main/resources/application.properties | 3 - .../test/java/StreamLambdaHandlerTest.java | 89 ----- .../archetype-resources/template.yml | 52 --- .../projects/base/archetype.properties | 3 - .../src/test/resources/projects/base/goal.txt | 1 - samples/springboot3/alt-pet-store/README.md | 56 --- .../springboot3/alt-pet-store/build.gradle | 29 -- samples/springboot3/alt-pet-store/pom.xml | 148 ------- .../alt-pet-store/src/assembly/bin.xml | 27 -- .../sample/springboot3/Application.java | 51 --- .../controller/PetsController.java | 90 ----- .../filter/CognitoIdentityFilter.java | 69 ---- .../sample/springboot3/model/Error.java | 29 -- .../sample/springboot3/model/Pet.java | 55 --- .../sample/springboot3/model/PetData.java | 117 ------ .../src/main/resources/logback.xml | 6 - .../springboot3/alt-pet-store/template.yml | 41 -- .../springboot3/graphql-pet-store/README.md | 38 -- samples/springboot3/graphql-pet-store/pom.xml | 162 -------- .../graphql-pet-store/src/assembly/bin.xml | 27 -- .../sample/springboot3/Application.java | 43 --- .../springboot3/StreamLambdaHandler.java | 50 --- .../controller/PetsController.java | 21 - .../filter/CognitoIdentityFilter.java | 69 ---- .../sample/springboot3/model/Owner.java | 20 - .../sample/springboot3/model/Pet.java | 20 - .../main/resources/graphql/schema.graphqls | 16 - .../src/main/resources/logback.xml | 5 - .../graphql-pet-store/template.yml | 32 -- .../springboot3/pet-store-native/.gitignore | 33 -- .../.mvn/wrapper/maven-wrapper.jar | Bin 62547 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 - .../springboot3/pet-store-native/Dockerfile | 37 -- .../springboot3/pet-store-native/README.md | 38 -- samples/springboot3/pet-store-native/mvnw | 308 --------------- samples/springboot3/pet-store-native/mvnw.cmd | 205 ---------- samples/springboot3/pet-store-native/pom.xml | 134 ------- .../pet-store-native/src/assembly/java.xml | 31 -- .../pet-store-native/src/assembly/native.xml | 29 -- .../sample/springboot3/DemoApplication.java | 12 - .../sample/springboot3/HelloController.java | 17 - .../controller/PetsController.java | 82 ---- .../filter/CognitoIdentityFilter.java | 69 ---- .../sample/springboot3/model/Error.java | 29 -- .../sample/springboot3/model/Pet.java | 55 --- .../sample/springboot3/model/PetData.java | 117 ------ .../src/main/resources/META-INF/.gitignore | 1 - .../src/main/resources/application.properties | 1 - .../pet-store-native/src/shell/java/bootstrap | 7 - .../src/shell/native/bootstrap | 5 - .../pet-store-native/template.yaml | 34 -- samples/springboot3/pet-store/README.md | 36 -- samples/springboot3/pet-store/build.gradle | 29 -- samples/springboot3/pet-store/pom.xml | 154 -------- .../pet-store/src/assembly/bin.xml | 27 -- .../sample/springboot3/Application.java | 49 --- .../springboot3/StreamLambdaHandler.java | 50 --- .../controller/PetsController.java | 77 ---- .../filter/CognitoIdentityFilter.java | 69 ---- .../sample/springboot3/model/Error.java | 29 -- .../sample/springboot3/model/Pet.java | 55 --- .../sample/springboot3/model/PetData.java | 117 ------ .../pet-store/src/main/resources/logback.xml | 5 - samples/springboot3/pet-store/template.yml | 32 -- 119 files changed, 7555 deletions(-) delete mode 100644 aws-serverless-java-container-springboot3/pom.xml delete mode 100644 aws-serverless-java-container-springboot3/spotbugs-excludeFilter.xml delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java delete mode 100644 aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories delete mode 100644 aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java delete mode 100644 aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java delete mode 100644 aws-serverless-springboot3-archetype/pom.xml delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java delete mode 100644 aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml delete mode 100644 aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties delete mode 100644 aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt delete mode 100644 samples/springboot3/alt-pet-store/README.md delete mode 100644 samples/springboot3/alt-pet-store/build.gradle delete mode 100644 samples/springboot3/alt-pet-store/pom.xml delete mode 100644 samples/springboot3/alt-pet-store/src/assembly/bin.xml delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java delete mode 100644 samples/springboot3/alt-pet-store/src/main/resources/logback.xml delete mode 100644 samples/springboot3/alt-pet-store/template.yml delete mode 100644 samples/springboot3/graphql-pet-store/README.md delete mode 100644 samples/springboot3/graphql-pet-store/pom.xml delete mode 100644 samples/springboot3/graphql-pet-store/src/assembly/bin.xml delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java delete mode 100644 samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls delete mode 100644 samples/springboot3/graphql-pet-store/src/main/resources/logback.xml delete mode 100644 samples/springboot3/graphql-pet-store/template.yml delete mode 100644 samples/springboot3/pet-store-native/.gitignore delete mode 100644 samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar delete mode 100644 samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties delete mode 100644 samples/springboot3/pet-store-native/Dockerfile delete mode 100644 samples/springboot3/pet-store-native/README.md delete mode 100755 samples/springboot3/pet-store-native/mvnw delete mode 100644 samples/springboot3/pet-store-native/mvnw.cmd delete mode 100644 samples/springboot3/pet-store-native/pom.xml delete mode 100644 samples/springboot3/pet-store-native/src/assembly/java.xml delete mode 100644 samples/springboot3/pet-store-native/src/assembly/native.xml delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java delete mode 100644 samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java delete mode 100644 samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore delete mode 100644 samples/springboot3/pet-store-native/src/main/resources/application.properties delete mode 100644 samples/springboot3/pet-store-native/src/shell/java/bootstrap delete mode 100644 samples/springboot3/pet-store-native/src/shell/native/bootstrap delete mode 100644 samples/springboot3/pet-store-native/template.yaml delete mode 100644 samples/springboot3/pet-store/README.md delete mode 100644 samples/springboot3/pet-store/build.gradle delete mode 100644 samples/springboot3/pet-store/pom.xml delete mode 100644 samples/springboot3/pet-store/src/assembly/bin.xml delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java delete mode 100644 samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java delete mode 100644 samples/springboot3/pet-store/src/main/resources/logback.xml delete mode 100644 samples/springboot3/pet-store/template.yml diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index 3e8daaf1..68d7a2f3 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -65,25 +65,6 @@ jobs: # - name: Build with Spring 6.0.x # run: ./gha_build.sh spring false false -Dspring.version=6.0.16 -Dspring-security.version=6.1.10 -Ddependency-check.skip=true - build_springboot3: - name: Build and test SpringBoot 3 - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - distribution: 'corretto' - java-version: 17 - - name: Build latest - run: ./gha_build.sh springboot3 true true - # Build with additional supported versions https://spring.io/projects/spring-boot#support - - name: Build with Spring Boot 3.1.x - run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.1.12 -Dspring.version=6.0.21 -Dspringsecurity.version=6.1.9 -Ddependency-check.skip=true - - name: Build with Spring Boot 3.2.x - run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.2.7 -Dspring.version=6.1.10 -Dspringsecurity.version=6.2.5 -Ddependency-check.skip=true - - name: Build with Spring Boot 3.3.x - run: ./gha_build.sh springboot3 false false -Dspringboot.version=3.3.6 -Dspring.version=6.1.15 -Dspringsecurity.version=6.3.5 -Ddependency-check.skip=true build_springboot4: name: Build and test SpringBoot 4 diff --git a/aws-serverless-java-container-springboot3/pom.xml b/aws-serverless-java-container-springboot3/pom.xml deleted file mode 100644 index 6d788dbe..00000000 --- a/aws-serverless-java-container-springboot3/pom.xml +++ /dev/null @@ -1,363 +0,0 @@ - - - - aws-serverless-java-container - com.amazonaws.serverless - 3.0.1-SNAPSHOT - - - 4.0.0 - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - 2.1.5 - AWS Serverless Java container support - SpringBoot 3 implementation - Allows Java applications written for SpringBoot 3 to run in AWS Lambda - https://aws.amazon.com/lambda - - - 6.2.8 - 3.5.8 - 6.4.5 - - - - - - org.springframework.cloud - spring-cloud-function-serverless-web - 4.1.5 - - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.1.5 - - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.1.5 - tests - test-jar - test - - - com.github.spotbugs - spotbugs-annotations - 4.9.3 - provided - - - org.springframework - spring-webflux - ${spring.version} - true - - - org.springframework.boot - spring-boot - ${springboot.version} - true - - - org.springframework - spring-context - - - org.springframework - spring-core - - - - - org.springframework.boot - spring-boot-autoconfigure - ${springboot.version} - true - - - org.springframework - spring-core - ${spring.version} - true - - - org.springframework - spring-context - ${spring.version} - true - - - org.springframework - spring-webmvc - ${spring.version} - true - - - org.springframework - spring-aop - - - org.springframework - spring-expression - - - - - - org.springframework.security - spring-security-config - ${springsecurity.version} - - - org.springframework - spring-context - - - org.springframework - spring-beans - - - org.springframework - spring-core - - - org.springframework - spring-expression - - - org.springframework - spring-aop - - - test - - - org.springframework.security - spring-security-web - ${springsecurity.version} - - - org.springframework - spring-core - - - org.springframework - spring-web - - - org.springframework - spring-beans - - - org.springframework - spring-context - - - org.springframework - spring-expression - - - org.springframework - spring-aop - - - test - - - org.hibernate.validator - hibernate-validator - 8.0.2.Final - test - - - - org.junit.jupiter - junit-jupiter - test - - - - jakarta.validation - jakarta.validation-api - 3.1.1 - test - - - - jakarta.websocket - jakarta.websocket-api - 2.2.0 - test - - - - jakarta.websocket - jakarta.websocket-client-api - 2.2.0 - test - - - - org.springframework.boot - spring-boot-starter-data-jpa - ${springboot.version} - test - - - org.springframework.boot - spring-boot-starter-aop - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-logging - - - org.springframework.boot - spring-boot-starter-tomcat - - - org.apache.tomcat.embed - tomcat-embed-core - - - org.apache.tomcat.embed - tomcat-embed-websocket - - - - - com.h2database - h2 - 2.3.232 - test - - - - - - - - - org.jacoco - jacoco-maven-plugin - - ${basedir}/target/coverage-reports/jacoco-unit.exec - ${basedir}/target/coverage-reports/jacoco-unit.exec - - - com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop* - com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor* - - - - - default-prepare-agent - - prepare-agent - - - - jacoco-site - package - - report - - - - jacoco-check - test - - check - - - true - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - ${jacoco.minCoverage} - - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - - - com.github.spotbugs - spotbugs-maven-plugin - - ${project.basedir}/spotbugs-excludeFilter.xml - - - - - analyze-compile - compile - - check - - - - - - org.owasp - dependency-check-maven - ${dependencyCheck.version} - - true - - ${project.basedir}/../owasp-suppression.xml - - 7 - false - - - - org.apache.maven.plugins - maven-compiler-plugin - - 17 - 17 - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - diff --git a/aws-serverless-java-container-springboot3/spotbugs-excludeFilter.xml b/aws-serverless-java-container-springboot3/spotbugs-excludeFilter.xml deleted file mode 100644 index b26b1ad2..00000000 --- a/aws-serverless-java-container-springboot3/spotbugs-excludeFilter.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java deleted file mode 100644 index 87e9ead0..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringAotTypesProcessor.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.model.*; -import org.springframework.aot.generate.GenerationContext; -import org.springframework.aot.hint.MemberCategory; -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution; -import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor; -import org.springframework.beans.factory.aot.BeanFactoryInitializationCode; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.fasterxml.jackson.core.JsonToken; - -/** - * AOT Initialization processor required to register reflective hints for GraalVM. - * This is necessary to ensure proper JSON serialization/deserialization. - * It is registered with META-INF/spring/aot.factories - * - * @author Oleg Zhurakousky - */ -public class AwsSpringAotTypesProcessor implements BeanFactoryInitializationAotProcessor { - - @Override - public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { - return new ReflectiveProcessorBeanFactoryInitializationAotContribution(); - } - - private static final class ReflectiveProcessorBeanFactoryInitializationAotContribution implements BeanFactoryInitializationAotContribution { - @Override - public void applyTo(GenerationContext generationContext, BeanFactoryInitializationCode beanFactoryInitializationCode) { - RuntimeHints runtimeHints = generationContext.getRuntimeHints(); - // known static types - - runtimeHints.reflection().registerType(AwsProxyRequest.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(AwsProxyResponse.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(SingleValueHeaders.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(JsonToken.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(MultiValuedTreeMap.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(Headers.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(AwsProxyRequestContext.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(ApiGatewayRequestIdentity.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES); - runtimeHints.reflection().registerType(AwsHttpServletResponse.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2ProxyRequest.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2HttpContext.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2ProxyRequestContext.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.HttpApiV2AuthorizerDeserializer.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2AuthorizerMap.HttpApiV2AuthorizerSerializer.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2IamAuthorizer.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - runtimeHints.reflection().registerType(HttpApiV2JwtAuthorizer.class, - MemberCategory.INVOKE_PUBLIC_METHODS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.DECLARED_CLASSES, MemberCategory.INTROSPECT_DECLARED_METHODS); - } - - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java deleted file mode 100644 index c94de305..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import java.io.InputStream; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import com.amazonaws.serverless.proxy.internal.HttpUtils; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; -import com.amazonaws.serverless.proxy.model.RequestSource; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.cloud.function.serverless.web.ServerlessHttpServletRequest; -import org.springframework.cloud.function.serverless.web.ServerlessMVC; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.util.CollectionUtils; -import org.springframework.util.FileCopyUtils; -import org.springframework.util.MultiValueMapAdapter; -import org.springframework.util.StringUtils; - -import com.amazonaws.serverless.proxy.AwsHttpApiV2SecurityContextWriter; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.services.lambda.runtime.Context; -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.servlet.ServletContext; -import jakarta.servlet.http.HttpServletRequest; - -import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.decodeValueIfEncoded; -import static com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest.getQueryParamValuesAsList; - -class AwsSpringHttpProcessingUtils { - - private static Log logger = LogFactory.getLog(AwsSpringHttpProcessingUtils.class); - private static final int LAMBDA_MAX_REQUEST_DURATION_MINUTES = 15; - - private AwsSpringHttpProcessingUtils() { - - } - - public static AwsProxyResponse processRequest(HttpServletRequest request, ServerlessMVC mvc, - AwsProxyHttpServletResponseWriter responseWriter) { - CountDownLatch latch = new CountDownLatch(1); - AwsHttpServletResponse response = new AwsHttpServletResponse(request, latch); - try { - mvc.service(request, response); - boolean requestTimedOut = !latch.await(LAMBDA_MAX_REQUEST_DURATION_MINUTES, TimeUnit.MINUTES); // timeout is potentially lower as user configures it - if (requestTimedOut) { - logger.warn("request timed out after " + LAMBDA_MAX_REQUEST_DURATION_MINUTES + " minutes"); - } - AwsProxyResponse awsResponse = responseWriter.writeResponse(response, null); - return awsResponse; - } - catch (Exception e) { - e.printStackTrace(); - throw new IllegalStateException(e); - } - } - - public static String extractVersion() { - try { - String path = AwsSpringHttpProcessingUtils.class.getProtectionDomain().getCodeSource().getLocation().toString(); - int endIndex = path.lastIndexOf('.'); - if (endIndex < 0) { - return "UNKNOWN-VERSION"; - } - int startIndex = path.lastIndexOf("/") + 1; - return path.substring(startIndex, endIndex).replace("spring-cloud-function-serverless-web-", ""); - } - catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Failed to detect version", e); - } - return "UNKNOWN-VERSION"; - } - - } - - public static HttpServletRequest generateHttpServletRequest(InputStream jsonRequest, Context lambdaContext, - ServletContext servletContext, ObjectMapper mapper) { - try { - String text = new String(FileCopyUtils.copyToByteArray(jsonRequest), StandardCharsets.UTF_8); - if (logger.isDebugEnabled()) { - logger.debug("Creating HttpServletRequest from: " + text); - } - return generateHttpServletRequest(text, lambdaContext, servletContext, mapper); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static HttpServletRequest generateHttpServletRequest(String jsonRequest, Context lambdaContext, - ServletContext servletContext, ObjectMapper mapper) { - Map _request = readValue(jsonRequest, Map.class, mapper); - SecurityContextWriter securityWriter = "2.0".equals(_request.get("version")) - ? new AwsHttpApiV2SecurityContextWriter() - : new AwsProxySecurityContextWriter(); - HttpServletRequest httpServletRequest = "2.0".equals(_request.get("version")) - ? AwsSpringHttpProcessingUtils.generateRequest2(jsonRequest, lambdaContext, securityWriter, mapper, servletContext) - : AwsSpringHttpProcessingUtils.generateRequest1(jsonRequest, lambdaContext, securityWriter, mapper, servletContext); - return httpServletRequest; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static HttpServletRequest generateRequest1(String request, Context lambdaContext, - SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { - AwsProxyRequest v1Request = readValue(request, AwsProxyRequest.class, mapper); - - ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v1Request.getHttpMethod(), v1Request.getPath()); - - populateQueryStringParametersV1(v1Request, httpRequest); - populateMultiValueQueryStringParametersV1(v1Request, httpRequest); - - String contentType = null; - if (v1Request.getMultiValueHeaders() != null) { - MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders()); - httpRequest.setHeaders(headers); - contentType = v1Request.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE); - } - populateContentAndContentType( - v1Request.getBody(), - contentType, - v1Request.isBase64Encoded(), - httpRequest - ); - if (v1Request.getRequestContext() != null) { - httpRequest.setAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY, v1Request.getRequestContext()); - httpRequest.setAttribute(RequestReader.ALB_CONTEXT_PROPERTY, v1Request.getRequestContext().getElb()); - } - httpRequest.setAttribute(RequestReader.API_GATEWAY_STAGE_VARS_PROPERTY, v1Request.getStageVariables()); - httpRequest.setAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY, v1Request); - httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); - httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, - securityWriter.writeSecurityContext(v1Request, lambdaContext)); - return httpRequest; - } - - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - private static HttpServletRequest generateRequest2(String request, Context lambdaContext, - SecurityContextWriter securityWriter, ObjectMapper mapper, ServletContext servletContext) { - HttpApiV2ProxyRequest v2Request = readValue(request, HttpApiV2ProxyRequest.class, mapper); - - - ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, - v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath()); - populateQueryStringParametersV2(v2Request.getQueryStringParameters(), httpRequest); - - v2Request.getHeaders().forEach(httpRequest::setHeader); - - populateContentAndContentType( - v2Request.getBody(), - v2Request.getHeaders().get(HttpHeaders.CONTENT_TYPE), - v2Request.isBase64Encoded(), - httpRequest - ); - - httpRequest.setAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY, v2Request.getRequestContext()); - httpRequest.setAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY, v2Request.getStageVariables()); - httpRequest.setAttribute(RequestReader.HTTP_API_EVENT_PROPERTY, v2Request); - httpRequest.setAttribute(RequestReader.LAMBDA_CONTEXT_PROPERTY, lambdaContext); - httpRequest.setAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY, - securityWriter.writeSecurityContext(v2Request, lambdaContext)); - return httpRequest; - } - - private static void populateQueryStringParametersV2(Map requestParameters, ServerlessHttpServletRequest httpRequest) { - if (!CollectionUtils.isEmpty(requestParameters)) { - for (Entry entry : requestParameters.entrySet()) { - // fix according to parseRawQueryString - httpRequest.setParameter(entry.getKey(), entry.getValue()); - } - } - } - - private static void populateQueryStringParametersV1(AwsProxyRequest v1Request, ServerlessHttpServletRequest httpRequest) { - Map requestParameters = v1Request.getQueryStringParameters(); - if (!CollectionUtils.isEmpty(requestParameters)) { - // decode all keys and values in map - for (Entry entry : requestParameters.entrySet()) { - String k = v1Request.getRequestSource() == RequestSource.ALB ? decodeValueIfEncoded(entry.getKey()) : entry.getKey(); - String v = v1Request.getRequestSource() == RequestSource.ALB ? decodeValueIfEncoded(entry.getValue()) : entry.getValue(); - httpRequest.setParameter(k, v); - } - } - } - - private static void populateMultiValueQueryStringParametersV1(AwsProxyRequest v1Request, ServerlessHttpServletRequest httpRequest) { - if (v1Request.getMultiValueQueryStringParameters() != null) { - MultiValueMapAdapter queryStringParameters = new MultiValueMapAdapter<>(v1Request.getMultiValueQueryStringParameters()); - queryStringParameters.forEach((k, v) -> { - String key = v1Request.getRequestSource() == RequestSource.ALB - ? decodeValueIfEncoded(k) - : k; - List value = v1Request.getRequestSource() == RequestSource.ALB - ? getQueryParamValuesAsList(v1Request.getMultiValueQueryStringParameters(), k, false).stream() - .map(AwsHttpServletRequest::decodeValueIfEncoded) - .toList() - : v; - httpRequest.setParameter(key, value.toArray(new String[0])); - }); - } - } - - private static T readValue(String json, Class clazz, ObjectMapper mapper) { - try { - return mapper.readValue(json, clazz); - } - catch (Exception e) { - throw new IllegalStateException(e); - } - } - - private static void populateContentAndContentType( - String body, - String contentType, - boolean base64Encoded, - ServerlessHttpServletRequest httpRequest) { - if (StringUtils.hasText(body)) { - httpRequest.setContentType(contentType == null ? MediaType.APPLICATION_JSON_VALUE : contentType); - if (base64Encoded) { - httpRequest.setContent(Base64.getMimeDecoder().decode(body)); - } else { - Charset charseEncoding = HttpUtils.parseCharacterEncoding(contentType,StandardCharsets.UTF_8); - httpRequest.setContent(body.getBytes(charseEncoding)); - } - } - } - - - -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java deleted file mode 100644 index c015a802..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebCustomRuntimeEventLoop.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.amazonaws.serverless.proxy.spring; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.URI; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; -import org.springframework.cloud.function.serverless.web.ServerlessMVC; -import org.springframework.context.SmartLifecycle; -import org.springframework.core.env.Environment; -import org.springframework.http.RequestEntity; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; - -/** - * Event loop and necessary configurations to support AWS Lambda Custom Runtime - * - https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html. - * - * @author Oleg Zhurakousky - * @author Mark Sailes - * - */ -public final class AwsSpringWebCustomRuntimeEventLoop implements SmartLifecycle { - - private static Log logger = LogFactory.getLog(AwsSpringWebCustomRuntimeEventLoop.class); - - static final String LAMBDA_VERSION_DATE = "2018-06-01"; - private static final String LAMBDA_ERROR_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/error"; - private static final String LAMBDA_RUNTIME_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/next"; - private static final String LAMBDA_INVOCATION_URL_TEMPLATE = "http://{0}/{1}/runtime/invocation/{2}/response"; - private static final String USER_AGENT_VALUE = String.format("spring-cloud-function/%s-%s", - System.getProperty("java.runtime.version"), AwsSpringHttpProcessingUtils.extractVersion()); - - private final ServletWebServerApplicationContext applicationContext; - - private volatile boolean running; - - private final ExecutorService executor = Executors.newSingleThreadExecutor(); - - public AwsSpringWebCustomRuntimeEventLoop(ServletWebServerApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - public void run() { - this.running = true; - this.executor.execute(() -> { - eventLoop(this.applicationContext); - }); - } - - @Override - public void start() { - this.run(); - } - - @Override - public void stop() { - this.executor.shutdownNow(); - this.running = false; - } - - @Override - public boolean isRunning() { - return this.running; - } - - private void eventLoop(ServletWebServerApplicationContext context) { - ServerlessMVC mvc = ServerlessMVC.INSTANCE(context); - - Environment environment = context.getEnvironment(); - logger.info("Starting AWSWebRuntimeEventLoop"); - - String runtimeApi = environment.getProperty("AWS_LAMBDA_RUNTIME_API"); - String eventUri = MessageFormat.format(LAMBDA_RUNTIME_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE); - if (logger.isDebugEnabled()) { - logger.debug("Event URI: " + eventUri); - } - - RequestEntity requestEntity = RequestEntity.get(URI.create(eventUri)) - .header("User-Agent", USER_AGENT_VALUE).build(); - RestTemplate rest = new RestTemplate(); - ObjectMapper mapper = new ObjectMapper();//.getBean(ObjectMapper.class); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); - - logger.info("Entering event loop"); - while (this.isRunning()) { - logger.debug("Attempting to get new event"); - ResponseEntity incomingEvent = rest.exchange(requestEntity, String.class); - - if (incomingEvent != null && incomingEvent.hasBody()) { - if (logger.isDebugEnabled()) { - logger.debug("New Event received from AWS Gateway: " + incomingEvent.getBody()); - } - String requestId = incomingEvent.getHeaders().getFirst("Lambda-Runtime-Aws-Request-Id"); - - try { - logger.debug("Submitting request to the user's web application"); - - AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( - AwsSpringHttpProcessingUtils.generateHttpServletRequest(incomingEvent.getBody(), - null, mvc.getServletContext(), mapper), mvc, responseWriter); - if (logger.isDebugEnabled()) { - logger.debug("Received response - body: " + awsResponse.getBody() + - "; status: " + awsResponse.getStatusCode() + "; headers: " + awsResponse.getHeaders()); - } - - String invocationUrl = MessageFormat.format(LAMBDA_INVOCATION_URL_TEMPLATE, runtimeApi, - LAMBDA_VERSION_DATE, requestId); - - ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(invocationUrl)) - .header("User-Agent", USER_AGENT_VALUE).body(awsResponse), byte[].class); - if (logger.isDebugEnabled()) { - logger.debug("Response sent: body: " + result.getBody() + - "; status: " + result.getStatusCode() + "; headers: " + result.getHeaders()); - } - if (logger.isInfoEnabled()) { - logger.info("Result POST status: " + result); - } - } - catch (Exception e) { - logger.error(e); - this.propagateAwsError(requestId, e, mapper, runtimeApi, rest); - } - } - } - } - - private void propagateAwsError(String requestId, Exception e, ObjectMapper mapper, String runtimeApi, RestTemplate rest) { - String errorMessage = e.getMessage(); - String errorType = e.getClass().getSimpleName(); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - String stackTrace = sw.toString(); - Map em = new HashMap<>(); - em.put("errorMessage", errorMessage); - em.put("errorType", errorType); - em.put("stackTrace", stackTrace); - try { - byte[] outputBody = mapper.writeValueAsBytes(em); - String errorUrl = MessageFormat.format(LAMBDA_ERROR_URL_TEMPLATE, runtimeApi, LAMBDA_VERSION_DATE, requestId); - ResponseEntity result = rest.exchange(RequestEntity.post(URI.create(errorUrl)) - .header("User-Agent", USER_AGENT_VALUE) - .body(outputBody), Object.class); - if (logger.isInfoEnabled()) { - logger.info("Result ERROR status: " + result.getStatusCode()); - } - } - catch (Exception e2) { - throw new IllegalArgumentException("Failed to report error", e2); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java deleted file mode 100644 index 992bc635..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringWebRuntimeInitializer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2024-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.amazonaws.serverless.proxy.spring; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.SmartLifecycle; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.env.Environment; -import org.springframework.util.StringUtils; - -/** - * Initializer to optionally start Custom Runtime to process web workloads. - * Registered with META-INF/spring.factories - * - * @author Dave Syer - * @author Oleg Zhurakousky - */ -public class AwsSpringWebRuntimeInitializer implements ApplicationContextInitializer { - - private static Log logger = LogFactory.getLog(AwsSpringWebRuntimeInitializer.class); - - @Override - public void initialize(GenericApplicationContext context) { - Environment environment = context.getEnvironment(); - - if (context instanceof ServletWebServerApplicationContext && isCustomRuntime(environment)) { - if (context.getBeanFactory().getBeanNamesForType(AwsSpringWebCustomRuntimeEventLoop.class, false, false).length == 0) { - context.registerBean(StringUtils.uncapitalize(AwsSpringWebCustomRuntimeEventLoop.class.getSimpleName()), - SmartLifecycle.class, () -> new AwsSpringWebCustomRuntimeEventLoop((ServletWebServerApplicationContext) context)); - } - } - } - - private boolean isCustomRuntime(Environment environment) { - String handler = environment.getProperty("_HANDLER"); - if (StringUtils.hasText(handler)) { - handler = handler.split(":")[0]; - logger.info("AWS Handler: " + handler); - try { - Thread.currentThread().getContextClassLoader().loadClass(handler); - } - catch (Exception e) { - logger.debug("Will execute Lambda in Custom Runtime"); - return true; - } - } - return false; - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java deleted file mode 100644 index 127ef668..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootAwsProxyExceptionHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.springframework.web.ErrorResponse; - -/** - * This ExceptionHandler implementation enhances the standard AwsProxyExceptionHandler - * by mapping additional details from org.springframework.web.ErrorResponse - * - * As of now this class is identical with SpringAwsProxyExceptionHandler. We may consider - * moving it to a common module to share it in the future. - */ -public class SpringBootAwsProxyExceptionHandler extends AwsProxyExceptionHandler - implements ExceptionHandler { - @Override - public AwsProxyResponse handle(Throwable ex) { - if (ex instanceof ErrorResponse) { - return new AwsProxyResponse(((ErrorResponse) ex).getStatusCode().value(), - HEADERS, getErrorJson(ex.getMessage())); - } else { - return super.handle(ex); - } - } - -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java deleted file mode 100644 index 45bf28ef..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandler.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import java.util.concurrent.CountDownLatch; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.web.context.ConfigurableWebApplicationContext; -import org.springframework.context.ConfigurableApplicationContext; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.ResponseWriter; -import com.amazonaws.serverless.proxy.SecurityContextWriter; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse; -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext; -import com.amazonaws.serverless.proxy.internal.servlet.AwsServletRegistration; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveServletEmbeddedServerFactory; -import com.amazonaws.serverless.proxy.spring.embedded.ServerlessServletEmbeddedServerFactory; -import com.amazonaws.services.lambda.runtime.Context; - -import jakarta.servlet.Servlet; -import jakarta.servlet.http.HttpServletRequest; - -/** - * SpringBoot implementation of the `LambdaContainerHandler` abstract class. This class uses the `LambdaSpringApplicationInitializer` - * object behind the scenes to proxy requests. The default implementation leverages the `AwsProxyHttpServletRequest` and - * `AwsHttpServletResponse` implemented in the `aws-serverless-java-container-core` package. - * - * Important: Make sure to add LambdaFlushResponseListener in your SpringBootServletInitializer subclass configure(). - * - * @param The incoming event type - * @param The expected return type - */ -public class SpringBootLambdaContainerHandler extends AwsLambdaServletContainerHandler { - private static final String DISPATCHER_SERVLET_REGISTRATION_NAME = "dispatcherServlet"; - - private final Class springBootInitializer; - private static final Logger log = LoggerFactory.getLogger(SpringBootLambdaContainerHandler.class); - private String[] springProfiles = null; - private WebApplicationType springWebApplicationType; - private ConfigurableApplicationContext applicationContext; - - private static SpringBootLambdaContainerHandler instance; - - // State vars - private boolean initialized; - - /** - * We need to rely on the static instance of this for SpringBoot because we need it to access the ServletContext. - * Normally, SpringBoot would initialize its own embedded container through the SpringApplication.run() - * method. However, in our case we need to rely on the pre-initialized handler and need to fetch information from it - * for our mock {@link ServerlessReactiveServletEmbeddedServerFactory}. - * - * @return The initialized instance - */ - public static SpringBootLambdaContainerHandler getInstance() { - return instance; - } - - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `AwsProxyResponse` objects and the given Spring profiles - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @param profiles A list of Spring profiles to activate - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getAwsProxyHandler(Class springBootInitializer, String... profiles) - throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(springBootInitializer) - .profiles(profiles) - .buildAndInitialize(); - } - - /** - * Creates a default SpringLambdaContainerHandler initialized with the `AwsProxyRequest` and `HttpApiV2ProxyRequest` objects and the given Spring profiles - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @param profiles A list of Spring profiles to activate - * @return An initialized instance of the `SpringLambdaContainerHandler` - * @throws ContainerInitializationException If an error occurs while initializing the Spring framework - */ - public static SpringBootLambdaContainerHandler getHttpApiV2ProxyHandler(Class springBootInitializer, String... profiles) - throws ContainerInitializationException { - return new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(springBootInitializer) - .profiles(profiles) - .buildAndInitialize(); - } - - /** - * Creates a new container handler with the given reader and writer objects - * - * @param requestTypeClass The class for the incoming Lambda event - * @param responseTypeClass The class for the Lambda function output - * @param requestReader An implementation of `RequestReader` - * @param responseWriter An implementation of `ResponseWriter` - * @param securityContextWriter An implementation of `SecurityContextWriter` - * @param exceptionHandler An implementation of `ExceptionHandler` - * @param springBootInitializer {@code SpringBootServletInitializer} class - * @param init The initialization Wrapper that will be used to start Spring Boot - * @param applicationType The Spring Web Application Type - */ - public SpringBootLambdaContainerHandler(Class requestTypeClass, - Class responseTypeClass, - RequestReader requestReader, - ResponseWriter responseWriter, - SecurityContextWriter securityContextWriter, - ExceptionHandler exceptionHandler, - Class springBootInitializer, - InitializationWrapper init, - WebApplicationType applicationType) { - super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler); - Timer.start("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); - initialized = false; - this.springBootInitializer = springBootInitializer; - springWebApplicationType = applicationType; - setInitializationWrapper(init); - SpringBootLambdaContainerHandler.setInstance(this); - - Timer.stop("SPRINGBOOT2_CONTAINER_HANDLER_CONSTRUCTOR"); - } - - // this is not pretty. However, because SpringBoot wants to control all of the initialization - // we need to access this handler as a singleton from the EmbeddedContainer to set the servlet - // context and from the ServletConfigurationSupport implementation - private static void setInstance(SpringBootLambdaContainerHandler h) { - SpringBootLambdaContainerHandler.instance = h; - } - - public void activateSpringProfiles(String... profiles) { - springProfiles = profiles; - // force a re-initialization - initialized = false; - } - - @Override - protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request, CountDownLatch latch) { - return new AwsHttpServletResponse(request, latch); - } - - @Override - protected void handleRequest(HttpServletRequest containerRequest, AwsHttpServletResponse containerResponse, Context lambdaContext) throws Exception { - // this method of the AwsLambdaServletContainerHandler sets the servlet context - Timer.start("SPRINGBOOT2_HANDLE_REQUEST"); - - // wire up the application context on the first invocation - if (!initialized) { - initialize(); - } - - // process filters & invoke servlet - Servlet reqServlet = ((AwsServletContext)getServletContext()).getServletForPath(containerRequest.getPathInfo()); - if (AwsHttpServletRequest.class.isAssignableFrom(containerRequest.getClass())) { - ((AwsHttpServletRequest)containerRequest).setServletContext(getServletContext()); - ((AwsHttpServletRequest)containerRequest).setResponse(containerResponse); - } - doFilter(containerRequest, containerResponse, reqServlet); - Timer.stop("SPRINGBOOT2_HANDLE_REQUEST"); - } - - SpringApplicationBuilder getSpringApplicationBuilder(Class... sources) { - return new SpringApplicationBuilder(sources); - } - - @Override - public void initialize() - throws ContainerInitializationException { - Timer.start("SPRINGBOOT2_COLD_START"); - - SpringApplicationBuilder builder = getSpringApplicationBuilder(getEmbeddedContainerClasses()) - .web(springWebApplicationType); // .REACTIVE, .SERVLET - if(springBootInitializer != null) { - builder.main(springBootInitializer); - } - if (springProfiles != null) { - builder.profiles(springProfiles); - } - applicationContext = builder.run(); - if (springWebApplicationType == WebApplicationType.SERVLET) { - ((ConfigurableWebApplicationContext)applicationContext).setServletContext(getServletContext()); - AwsServletRegistration reg = (AwsServletRegistration)getServletContext().getServletRegistration(DISPATCHER_SERVLET_REGISTRATION_NAME); - if (reg != null) { - reg.setLoadOnStartup(1); - } - } - super.initialize(); - initialized = true; - Timer.stop("SPRINGBOOT2_COLD_START"); - } - - private Class[] getEmbeddedContainerClasses() { - Class[] classes = new Class[2]; - if (springWebApplicationType == WebApplicationType.REACTIVE) { - try { - // if HandlerAdapter is available we assume they are using WebFlux. Otherwise plain servlet. - this.getClass().getClassLoader().loadClass("org.springframework.web.reactive.HandlerAdapter"); - log.debug("Found WebFlux HandlerAdapter on classpath, using reactive server factory"); - classes[0] = ServerlessReactiveServletEmbeddedServerFactory.class; - } catch (ClassNotFoundException e) { - springWebApplicationType = WebApplicationType.SERVLET; - classes[0] = ServerlessServletEmbeddedServerFactory.class; - } - } else { - classes[0] = ServerlessServletEmbeddedServerFactory.class; - } - - classes[1] = springBootInitializer; - return classes; - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java deleted file mode 100644 index e7ad017f..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringBootProxyHandlerBuilder.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.ExceptionHandler; -import com.amazonaws.serverless.proxy.internal.servlet.ServletLambdaContainerHandlerBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.springframework.boot.WebApplicationType; - -import jakarta.servlet.http.HttpServletRequest; - -public final class SpringBootProxyHandlerBuilder extends ServletLambdaContainerHandlerBuilder< - RequestType, - AwsProxyResponse, - HttpServletRequest, - SpringBootLambdaContainerHandler, - SpringBootProxyHandlerBuilder> { - private Class springBootInitializer; - private String[] profiles; - private WebApplicationType applicationType = WebApplicationType.REACTIVE; - - @Override - protected SpringBootProxyHandlerBuilder self() { - return this; - } - - - public SpringBootProxyHandlerBuilder springBootApplication(Class app) { - springBootInitializer = app; - return self(); - } - - public SpringBootProxyHandlerBuilder profiles(String... profiles) { - this.profiles = profiles; - return self(); - } - - public SpringBootProxyHandlerBuilder servletApplication() { - this.applicationType = WebApplicationType.SERVLET; - return self(); - } - - @Override - public SpringBootLambdaContainerHandler build() throws ContainerInitializationException { - validate(); - if (springBootInitializer == null) { - throw new ContainerInitializationException("Missing spring boot application class in builder", null); - } - SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler( - requestTypeClass, - responseTypeClass, - requestReader, - responseWriter, - securityContextWriter, - exceptionHandler, - springBootInitializer, - initializationWrapper, - applicationType - ); - if (profiles != null) { - handler.activateSpringProfiles(profiles); - } - return handler; - } - - @Override - public SpringBootLambdaContainerHandler buildAndInitialize() throws ContainerInitializationException { - SpringBootLambdaContainerHandler handler = build(); - initializationWrapper.start(handler); - return handler; - } - - @Override - protected ExceptionHandler defaultExceptionHandler() { - return new SpringBootAwsProxyExceptionHandler(); - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java deleted file mode 100644 index 765c4bef..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AsyncInitializationWrapper; -import com.amazonaws.serverless.proxy.InitializationTypeHelper; -import com.amazonaws.serverless.proxy.internal.InitializableLambdaContainerHandler; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import org.springframework.cloud.function.serverless.web.FunctionClassUtils; -import org.springframework.cloud.function.serverless.web.ServerlessMVC; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.servlet.http.HttpServletRequest; - -/* - * Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -/** - * An implementation of {@link RequestStreamHandler} which delegates to - * Spring Cloud Function serverless web module managed by Spring team. - * - * It requires no sub-classing from the user other then being identified as "Handler". - * The configuration class(es) should be provided via MAIN_CLASS environment variable. - * - */ -public class SpringDelegatingLambdaContainerHandler implements RequestStreamHandler { - private final ServerlessMVC mvc; - private final ObjectMapper mapper; - private final AwsProxyHttpServletResponseWriter responseWriter; - - public SpringDelegatingLambdaContainerHandler() throws ContainerInitializationException { - this(new Class[] {FunctionClassUtils.getStartClass()}); - } - - public SpringDelegatingLambdaContainerHandler(final Class... startupClasses) throws ContainerInitializationException { - SpringDelegatingInitHandler initHandler = new SpringDelegatingInitHandler(startupClasses); - if (InitializationTypeHelper.isAsyncInitializationDisabled()) { - initHandler.initialize(); - } else { - AsyncInitializationWrapper asyncInitWrapper = new AsyncInitializationWrapper(); - asyncInitWrapper.start(initHandler); - } - this.mvc = initHandler.getMvc(); - this.mapper = new ObjectMapper(); - this.responseWriter = new AwsProxyHttpServletResponseWriter(); - } - - @Override - public void handleRequest(InputStream input, OutputStream output, Context lambdaContext) throws IOException { - HttpServletRequest httpServletRequest = AwsSpringHttpProcessingUtils - .generateHttpServletRequest(input, lambdaContext, this.mvc.getServletContext(), this.mapper); - AwsProxyResponse awsProxyResponse = AwsSpringHttpProcessingUtils.processRequest(httpServletRequest, mvc, responseWriter); - this.mapper.writeValue(output, awsProxyResponse); - } - - private static final class SpringDelegatingInitHandler implements InitializableLambdaContainerHandler { - private ServerlessMVC mvc; - private final Class[] startupClasses; - - public SpringDelegatingInitHandler(final Class... startupClasses) { - this.startupClasses = startupClasses; - } - - @Override - public void initialize() throws ContainerInitializationException { - this.mvc = ServerlessMVC.INSTANCE(this.startupClasses); - this.mvc.waitForContext(); - } - - public ServerlessMVC getMvc() { - return this.mvc; - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java deleted file mode 100644 index 3376452e..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessReactiveServletEmbeddedServerFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring.embedded; - -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFactory; -import org.springframework.boot.web.server.WebServer; -import org.springframework.boot.web.server.WebServerException; -import org.springframework.core.Ordered; -import org.springframework.http.server.reactive.HttpHandler; -import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; - -import jakarta.servlet.*; -import java.io.IOException; -import java.util.Enumeration; - -@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) -public class ServerlessReactiveServletEmbeddedServerFactory extends AbstractReactiveWebServerFactory implements WebServer, Servlet { - private ServletHttpHandlerAdapter handler; - private ServletConfig config; - static final String SERVLET_NAME = "com.amazonaws.serverless.proxy.spring.embedded.ServerlessReactiveEmbeddedServerFactory"; - static final String SERVLET_INFO = "ServerlessReactiveEmbeddedServerFactory"; - - @Override - @SuppressFBWarnings("MTIA_SUSPECT_SERVLET_INSTANCE_FIELD") - public WebServer getWebServer(HttpHandler httpHandler) { - handler = new ServletHttpHandlerAdapter(httpHandler); - return this; - } - - @Override - public void start() throws WebServerException { - // register this object as the main handler servlet with a mapping of / - SpringBootLambdaContainerHandler - .getInstance() - .getServletContext() - .addServlet(SERVLET_NAME, this) - .addMapping("/"); - handler.init(new ServletAdapterConfig()); - } - - @Override - public void stop() throws WebServerException { - // nothing to do here. - } - - @Override - public void init(ServletConfig servletConfig) throws ServletException { - config = servletConfig; - } - - @Override - public ServletConfig getServletConfig() { - return config; - } - - @Override - public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { - handler.service(servletRequest, servletResponse); - } - - @Override - public String getServletInfo() { - return SERVLET_INFO; - } - - @Override - public void destroy() { - - } - - private static class ServletAdapterConfig implements ServletConfig { - @Override - public String getServletName() { - return SERVLET_NAME; - } - - @Override - public ServletContext getServletContext() { - return SpringBootLambdaContainerHandler.getInstance().getServletContext(); - } - - @Override - public String getInitParameter(String s) { - return null; - } - - @Override - public Enumeration getInitParameterNames() { - return null; - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java b/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java deleted file mode 100644 index 76ee919d..00000000 --- a/aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactory.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.proxy.spring.embedded; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.web.server.WebServer; -import org.springframework.boot.web.server.WebServerException; -import org.springframework.boot.web.servlet.ServletContextInitializer; -import org.springframework.boot.web.servlet.server.ServletWebServerFactory; -import org.springframework.core.Ordered; - -import jakarta.servlet.ServletException; - -@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) -public class ServerlessServletEmbeddedServerFactory implements ServletWebServerFactory, WebServer { - @SuppressWarnings("rawtypes") - private AwsLambdaServletContainerHandler handler; - - public ServerlessServletEmbeddedServerFactory() { - super(); - handler = SpringBootLambdaContainerHandler.getInstance(); - } - - @Override - public WebServer getWebServer(ServletContextInitializer... initializers) { - for (ServletContextInitializer i : initializers) { - try { - if (handler.getServletContext() == null) { - throw new WebServerException("Attempting to initialize ServletEmbeddedWebServer without ServletContext in Handler", null); - } - i.onStartup(handler.getServletContext()); - } catch (ServletException e) { - throw new WebServerException("Could not initialize Servlets", e); - } - } - return this; - } - - @Override - public void start() throws WebServerException { - - } - - @Override - public void stop() throws WebServerException { - - } - - @Override - public int getPort() { - return 0; - } -} diff --git a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories deleted file mode 100644 index cd5c2e70..00000000 --- a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.context.ApplicationContextInitializer=\ -com.amazonaws.serverless.proxy.spring.AwsSpringWebRuntimeInitializer diff --git a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories b/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories deleted file mode 100644 index 44acc0d8..00000000 --- a/aws-serverless-java-container-springboot3/src/main/resources/META-INF/spring/aot.factories +++ /dev/null @@ -1 +0,0 @@ -org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=com.amazonaws.serverless.proxy.spring.AwsSpringAotTypesProcessor \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java deleted file mode 100644 index 9903e8f8..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AWSWebRuntimeTests.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.ConfigurableApplicationContext; - -public class AWSWebRuntimeTests { - - @AfterEach - public void after() { - System.clearProperty("_HANDLER"); - } - - @Test - public void testWebRuntimeInitialization() throws Exception { - try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { - assertFalse(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); - } - System.setProperty("_HANDLER", "foo"); - AwsSpringWebCustomRuntimeEventLoop loop = null; - try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { - Thread.sleep(100); - assertTrue(context.getBeansOfType(AwsSpringWebCustomRuntimeEventLoop.class).size() > 0); - loop = context.getBean(AwsSpringWebCustomRuntimeEventLoop.class); - assertTrue(loop.isRunning()); - } - assertFalse(loop.isRunning()); - } - - @EnableAutoConfiguration - private static class EmptyApplication { - - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java deleted file mode 100644 index d09a4079..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java +++ /dev/null @@ -1,349 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AlbContext; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; -import org.springframework.cloud.function.serverless.web.ServerlessMVC; -import org.springframework.cloud.function.serverless.web.ServerlessServletContext; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.servlet.http.HttpServletRequest; - -import static org.junit.jupiter.api.Assertions.*; - -public class AwsSpringHttpProcessingUtilsTests { - - private static String API_GATEWAY_EVENT = "{\n" - + " \"version\": \"1.0\",\n" - + " \"resource\": \"$default\",\n" - + " \"path\": \"/async\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"headers\": {\n" - + " \"Content-Length\": \"45\",\n" - + " \"Content-Type\": \"application/json\",\n" - + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"User-Agent\": \"curl/7.79.1\",\n" - + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" - + " \"X-Forwarded-For\": \"109.210.252.44\",\n" - + " \"X-Forwarded-Port\": \"443\",\n" - + " \"X-Forwarded-Proto\": \"https\",\n" - + " \"accept\": \"*/*\"\n" - + " },\n" - + " \"multiValueHeaders\": {\n" - + " \"Content-Length\": [\n" - + " \"45\"\n" - + " ],\n" - + " \"Content-Type\": [\n" - + " \"application/json\"\n" - + " ],\n" - + " \"Host\": [\n" - + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" - + " ],\n" - + " \"User-Agent\": [\n" - + " \"curl/7.79.1\"\n" - + " ],\n" - + " \"X-Amzn-Trace-Id\": [\n" - + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" - + " ],\n" - + " \"X-Forwarded-For\": [\n" - + " \"109.210.252.44\"\n" - + " ],\n" - + " \"X-Forwarded-Port\": [\n" - + " \"443\"\n" - + " ],\n" - + " \"X-Forwarded-Proto\": [\n" - + " \"https\"\n" - + " ],\n" - + " \"accept\": [\n" - + " \"*/*\"\n" - + " ]\n" - + " },\n" - + " \"queryStringParameters\": {\n" - + " \"abc\": \"xyz\",\n" - + " \"parameter1\": \"value2\"\n" - + " },\n" - + " \"multiValueQueryStringParameters\": {\n" - + " \"abc\": [\n" - + " \"xyz\"\n" - + " ],\n" - + " \"parameter1\": [\n" - + " \"value1\",\n" - + " \"value2\"\n" - + " ]\n" - + " },\n" - + " \"requestContext\": {\n" - + " \"accountId\": \"123456789098\",\n" - + " \"apiId\": \"i76bfhczs0\",\n" - + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"domainPrefix\": \"i76bfhczs0\",\n" - + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"path\": \"/pets\",\n" - + " \"protocol\": \"HTTP/1.1\",\n" - + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" - + " \"requestTimeEpoch\": 1678276240455,\n" - + " \"resourceId\": \"$default\",\n" - + " \"resourcePath\": \"$default\",\n" - + " \"stage\": \"$default\"\n" - + " },\n" - + " \"pathParameters\": null,\n" - + " \"stageVariables\": null,\n" - + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" - + " \"isBase64Encoded\": false\n" - + "}"; - - private static String API_GATEWAY_EVENT_V2 = "{\n" + - " \"version\": \"2.0\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"rawPath\": \"/async\",\n" + - " \"rawQueryString\": \"parameter1=value1¶meter1=value2¶meter2=value\",\n" + - " \"cookies\": [\n" + - " \"cookie1\",\n" + - " \"cookie2\"\n" + - " ],\n" + - " \"headers\": {\n" + - " \"header1\": \"value1\",\n" + - " \"header2\": \"value1,value2\",\n" + - " \"User-Agent\": \"curl/7.79.1\",\n" + - " \"X-Forwarded-Port\": \"443\"\n" + - " },\n" + - " \"queryStringParameters\": {\n" + - " \"parameter1\": \"value1,value2\",\n" + - " \"parameter2\": \"value\"\n" + - " },\n" + - " \"requestContext\": {\n" + - " \"accountId\": \"123456789012\",\n" + - " \"apiId\": \"api-id\",\n" + - " \"authentication\": {\n" + - " \"clientCert\": {\n" + - " \"clientCertPem\": \"CERT_CONTENT\",\n" + - " \"subjectDN\": \"www.example.com\",\n" + - " \"issuerDN\": \"Example issuer\",\n" + - " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + - " \"validity\": {\n" + - " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + - " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"authorizer\": {\n" + - " \"jwt\": {\n" + - " \"claims\": {\n" + - " \"claim1\": \"value1\",\n" + - " \"claim2\": \"value2\"\n" + - " },\n" + - " \"scopes\": [\n" + - " \"scope1\",\n" + - " \"scope2\"\n" + - " ]\n" + - " }\n" + - " },\n" + - " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + - " \"domainPrefix\": \"id\",\n" + - " \"http\": {\n" + - " \"method\": \"POST\",\n" + - " \"path\": \"/async\",\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"sourceIp\": \"IP\",\n" + - " \"userAgent\": \"agent\"\n" + - " },\n" + - " \"requestId\": \"id\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"stage\": \"$default\",\n" + - " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + - " \"timeEpoch\": 1583348638390\n" + - " },\n" + - " \"body\": \"Hello from Lambda\",\n" + - " \"pathParameters\": {\n" + - " \"parameter1\": \"value1\"\n" + - " },\n" + - " \"isBase64Encoded\": false,\n" + - " \"stageVariables\": {\n" + - " \"stageVariable1\": \"value1\",\n" + - " \"stageVariable2\": \"value2\"\n" + - " }\n" + - "}"; - - private static final String ALB_EVENT = "{\n" + - " \"requestContext\": {\n" + - " \"elb\": {\n" + - " \"targetGroupArn\": \"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09\"\n" + - " }\n" + - " },\n" + - " \"httpMethod\": \"POST\",\n" + - " \"path\": \"/async\",\n" + - " \"multiValueQueryStringParameters\": { \"parameter1\": [\"value1\", \"value2\"], \"parameter2\": [\"1970-01-01T00%3A00%3A00.004Z\"]},\n" + - " \"multiValueHeaders\": {\n" + - " \"accept\": [\"text/html,application/xhtml+xml\"],\n" + - " \"accept-language\": [\"en-US,en;q=0.8\"],\n" + - " \"content-type\": [\"text/plain\"],\n" + - " \"cookie\": [\"cookies\"],\n" + - " \"host\": [\"lambda-846800462-us-east-2.elb.amazonaws.com\"],\n" + - " \"User-Agent\": [\"curl/7.79.1\"],\n" + - " \"x-amzn-trace-id\": [\"Root=1-5bdb40ca-556d8b0c50dc66f0511bf520\"],\n" + - " \"x-forwarded-for\": [\"72.21.198.66\"],\n" + - " \"x-forwarded-port\": [\"443\"],\n" + - " \"x-forwarded-proto\": [\"https\"]\n" + - " },\n" + - " \"isBase64Encoded\": false,\n" + - " \"body\": \"request_body\"\n" + - "}"; - - private final ObjectMapper mapper = new ObjectMapper(); - - public static Collection data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT}); - } - - public static Collection v1Data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT, ALB_EVENT}); - } - - public static Collection v2Data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT_V2}); - } - - @MethodSource("data") - @ParameterizedTest - public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent) { - ByteArrayInputStream inputStream = new ByteArrayInputStream(jsonEvent.getBytes(StandardCharsets.UTF_8)); - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper); - assertRequest(request); - } - - private static void assertRequest(HttpServletRequest request) { - assertEquals("curl/7.79.1", request.getHeader("User-Agent")); - assertEquals("443", request.getHeader("X-Forwarded-Port")); - assertEquals("POST", request.getMethod()); - assertEquals("/async", request.getRequestURI()); - assertNotNull(request.getServletContext()); - // parameter handling for 2.0 requests is currently not spec compliant and to be fixed in future version - // see also GitHub issue https://github.com/aws/serverless-java-container/issues/1278 - if (!(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY) instanceof HttpApiV2ProxyRequest)) { - assertEquals("value1", request.getParameter("parameter1")); - assertArrayEquals(new String[]{"value1", "value2"}, request.getParameterValues("parameter1")); - } - if (request.getAttribute(RequestReader.ALB_CONTEXT_PROPERTY) instanceof AlbContext) { - // query params should be decoded - assertEquals("1970-01-01T00:00:00.004Z", request.getParameter("parameter2")); - } - } - - @MethodSource("data") - @ParameterizedTest - public void validateHttpServletRequestGenerationWithJson(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - // spot check some headers - assertRequest(request); - } - - @MethodSource("data") - @ParameterizedTest - public void validateRequestResponse(String jsonEvent) throws Exception { - try (ConfigurableApplicationContext context = SpringApplication.run(EmptyApplication.class);) { - ServerlessMVC mvc = ServerlessMVC.INSTANCE((ServletWebServerApplicationContext) context); - AwsProxyHttpServletResponseWriter responseWriter = new AwsProxyHttpServletResponseWriter(); - AwsProxyResponse awsResponse = AwsSpringHttpProcessingUtils.processRequest( - AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, - mvc.getServletContext(), mapper), mvc, responseWriter); - assertEquals("hello", awsResponse.getBody()); - assertEquals(200, awsResponse.getStatusCode()); - } - - } - - @MethodSource("v1Data") - @ParameterizedTest - public void validateLambdaContextAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.API_GATEWAY_EVENT_PROPERTY)); - } - - @MethodSource("data") - @ParameterizedTest - public void validateSecurityContextAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.JAX_SECURITY_CONTEXT_PROPERTY)); - } - - @MethodSource("v1Data") - @ParameterizedTest - public void validateNullMultiValueHeaders(String jsonEvent) throws Exception { - Map event = mapper.readValue(jsonEvent, Map.class); - event.put("multiValueHeaders", null); - String modifiedEvent = mapper.writeValueAsString(event); - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); - assertNotNull(request); - } - - @MethodSource("data") - @ParameterizedTest - public void validateBase64EncodedBody(String jsonEvent) throws Exception { - String base64Body = java.util.Base64.getEncoder().encodeToString("test body".getBytes(StandardCharsets.UTF_8)); - Map event = mapper.readValue(jsonEvent, Map.class); - event.put("body", base64Body); - event.put("isBase64Encoded", true); - String modifiedEvent = mapper.writeValueAsString(event); - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(modifiedEvent, null, servletContext, mapper); - assertNotNull(request); - } - - @MethodSource("v2Data") - @ParameterizedTest - public void validateHttpApiContextAttribute(String jsonEvent) { - ServerlessServletContext servletContext = new ServerlessServletContext(); - HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_CONTEXT_PROPERTY)); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_STAGE_VARS_PROPERTY)); - assertNotNull(request.getAttribute(RequestReader.HTTP_API_EVENT_PROPERTY)); - } - - @EnableAutoConfiguration - @Configuration - public static class EmptyApplication { - @RestController - @EnableWebMvc - public static class MyController { - @PostMapping(path = "/async") - public String async(@RequestBody String body) { - return "hello"; - } - } - - @Bean - SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.csrf((csrf) -> csrf.disable()); - return http.build(); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java deleted file mode 100644 index a111e510..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/JpaAppTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.jpaapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.jpaapp.MessageController; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class JpaAppTest { - - LambdaHandler handler; - MockLambdaContext lambdaContext = new MockLambdaContext(); - - private String type; - - public static Collection data() { - return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); - } - - public void initJpaAppTest(String reqType) { - type = reqType; - handler = new LambdaHandler(type); - } - - @MethodSource("data") - @ParameterizedTest - void asyncRequest(String reqType) { - initJpaAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") - .json() - .body("{\"name\":\"kong\"}"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals("{\"name\":\"KONG\"}", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void helloRequest_respondsWithSingleMessage(String reqType) { - initJpaAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); - } - -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java deleted file mode 100644 index d0b57950..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SecurityAppTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.securityapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.securityapp.SecurityConfig; -import org.junit.jupiter.api.Test; - -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class SecurityAppTest { - - LambdaHandler handler = new LambdaHandler(); - MockLambdaContext lambdaContext = new MockLambdaContext(); - - public SecurityAppTest() { - System.setProperty("logging.level.root", "DEBUG"); - } - - @Test - void helloRequest_withAuth_respondsWithSingleMessage() { - AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals(401, resp.getStatusCode()); - assertTrue(resp.getMultiValueHeaders().containsKey(HttpHeaders.WWW_AUTHENTICATE)); - req = new AwsProxyRequestBuilder("/hello", "GET") - .basicAuth(SecurityConfig.USERNAME, SecurityConfig.PASSWORD) - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) - .build(); - resp = handler.handleRequest(req, lambdaContext); - assertEquals(200, resp.getStatusCode()); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java deleted file mode 100644 index b87c80ce..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/ServletAppTest.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.ContainerConfig; -import com.amazonaws.serverless.proxy.spring.servletapp.*; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Collection; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.*; - -public class ServletAppTest { - - LambdaHandler handler; - MockLambdaContext lambdaContext = new MockLambdaContext(); - - private String type; - - public static Collection data() { - return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); - } - - public void initServletAppTest(String reqType) { - type = reqType; - handler = new LambdaHandler(type); - } - - @MethodSource("data") - @ParameterizedTest - void asyncRequest(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/async", "POST") - .json() - .body("{\"name\":\"bob\"}"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals("{\"name\":\"BOB\"}", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void helloRequest_respondsWithSingleMessage(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/hello", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void validateRequest_invalidData_respondsWith400(String reqType) { - initServletAppTest(reqType); - UserData ud = new UserData(); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/validate", "POST") - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .body(ud); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - try { - System.out.println(LambdaContainerHandler.getObjectMapper().writeValueAsString(resp)); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - assertEquals("3", resp.getBody()); - assertEquals(400, resp.getStatusCode()); - - UserData ud2 = new UserData(); - ud2.setFirstName("Test"); - ud2.setLastName("Test"); - ud2.setEmail("Test"); - req = new AwsProxyRequestBuilder("/validate", "POST") - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN) - .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON) - .body(ud2); - resp = handler.handleRequest(req, lambdaContext); - assertEquals("1", resp.getBody()); - assertEquals(400, resp.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void messageObject_parsesObject_returnsCorrectMessage(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") - .json() - .body(new MessageData("test message")); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("test message", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void messageObject_propertiesInContentType_returnsCorrectMessage(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") - .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") - .header(HttpHeaders.ACCEPT, "application/json;v=1") - .body(new MessageData("test message")); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("test message", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void echoMessage_fileNameLikeParameter_returnsMessage(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/echo/test.test.test", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("test.test.test", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void getUtf8String_returnsValidUtf8String(String reqType) { - initServletAppTest(reqType); - // We expect strings to come back as UTF-8 correctly because Spring itself will call the setCharacterEncoding - // method on the response to set it to UTF- - LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/utf8", "GET") - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("text/plain; charset=UTF-8", resp.getMultiValueHeaders().get(HttpHeaders.CONTENT_TYPE).stream().collect(Collectors.joining(","))); - assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void getUtf8Json_returnsValidUtf8String(String reqType) { - initServletAppTest(reqType); - LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void stream_getUtf8String_returnsValidUtf8String(String reqType) throws IOException { - initServletAppTest(reqType); - LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); - LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); - AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/utf8", "GET") - .header(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN); - InputStream req = null; - switch (type) { - case "ALB": - req = reqBuilder.alb().buildStream(); - break; - case "API_GW": - req = reqBuilder.buildStream(); - break; - case "HTTP_API": - req = reqBuilder.toHttpApiV2RequestStream(); - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - streamHandler.handleRequest(req, out, lambdaContext); - AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals(MessageController.UTF8_RESPONSE, resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void stream_getUtf8Json_returnsValidUtf8String(String reqType) throws IOException { - initServletAppTest(reqType); - LambdaContainerHandler.getContainerConfig().setDefaultContentCharset(ContainerConfig.DEFAULT_CONTENT_CHARSET); - LambdaStreamHandler streamHandler = new LambdaStreamHandler(type); - AwsProxyRequestBuilder reqBuilder = new AwsProxyRequestBuilder("/content-type/jsonutf8", "GET"); - InputStream req = null; - switch (type) { - case "ALB": - req = reqBuilder.alb().buildStream(); - break; - case "API_GW": - req = reqBuilder.buildStream(); - break; - case "HTTP_API": - req = reqBuilder.toHttpApiV2RequestStream(); - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - streamHandler.handleRequest(req, out, lambdaContext); - AwsProxyResponse resp = LambdaContainerHandler.getObjectMapper().readValue(out.toByteArray(), AwsProxyResponse.class); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("{\"s\":\"" + MessageController.UTF8_RESPONSE + "\"}", resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void springExceptionMapping_throw404Ex_expectMappedTo404(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/ex/customstatus", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(404, resp.getStatusCode()); - } - - @MethodSource("data") - @ParameterizedTest - void echoMessage_populatesSingleValueHeadersForHttpApiV2(String reqType) { - initServletAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") - .header(HttpHeaders.CONTENT_TYPE, "application/json;v=1") - .header(HttpHeaders.ACCEPT, "application/json;v=1") - .body(new MessageData("test message")); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - if ("HTTP_API".equals(type)) { - assertNotNull(resp.getHeaders()); - } else { - assertNull(resp.getHeaders()); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java deleted file mode 100644 index f5e83e85..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SlowAppTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.slowapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.slowapp.MessageController; -import com.amazonaws.serverless.proxy.spring.slowapp.SlowTestApplication; -import org.junit.jupiter.api.Test; - -import java.time.Instant; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class SlowAppTest { - - @Test - void slowAppInit_continuesInBackgroundThread_returnsCorrect() { - LambdaHandler slowApp = new LambdaHandler(); - System.out.println("Start time: " + slowApp.getConstructorTime()); - assertTrue(slowApp.getConstructorTime() < 10_000); - AwsProxyRequest req = new AwsProxyRequestBuilder("/hello", "GET").build(); - long startRequestTime = Instant.now().toEpochMilli(); - AwsProxyResponse resp = slowApp.handleRequest(req, new MockLambdaContext()); - long endRequestTime = Instant.now().toEpochMilli(); - assertTrue(endRequestTime - startRequestTime > SlowTestApplication.SlowDownInit.INIT_SLEEP_TIME_MS - 10_000); - assertEquals(200, resp.getStatusCode()); - assertEquals(MessageController.HELLO_MESSAGE, resp.getBody()); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java deleted file mode 100644 index 871a751b..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringBootLambdaContainerHandlerTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication; -import com.amazonaws.serverless.proxy.spring.webfluxapp.WebFluxTestApplication; -import java.util.Collection; -import java.util.List; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mockito; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.builder.SpringApplicationBuilder; - -class SpringBootLambdaContainerHandlerTest { - - SpringBootLambdaContainerHandler handler; - SpringApplicationBuilder springApplicationBuilder; - - public static Collection data() { - return List.of(new TestData(WebApplicationType.SERVLET, ServletApplication.class), - new TestData(WebApplicationType.REACTIVE, WebFluxTestApplication.class)); - } - - private void initSpringBootLambdaContainerHandlerTest(Class springBootInitializer, - WebApplicationType applicationType) { - handler = Mockito.spy(new SpringBootLambdaContainerHandler<>(AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - springBootInitializer, - new InitializationWrapper(), - applicationType)); - - doAnswer(d -> { - springApplicationBuilder = ((SpringApplicationBuilder) Mockito.spy(d.callRealMethod())); - return springApplicationBuilder; - }).when(handler).getSpringApplicationBuilder(any(Class[].class)); - } - - @ParameterizedTest - @MethodSource("data") - void initialize_withSpringBootInitializer(TestData data) throws ContainerInitializationException { - initSpringBootLambdaContainerHandlerTest(data.springBootApplication(), data.applicationType()); - handler.initialize(); - - verify(springApplicationBuilder, times(1)).main(data.springBootApplication()); - } - - @ParameterizedTest - @EnumSource(WebApplicationType.class) - void initialize_withoutSpringBootInitializer(WebApplicationType webApplicationType) { - initSpringBootLambdaContainerHandlerTest(null, webApplicationType); - assertThrows(IllegalArgumentException.class, handler::initialize, "Source must not be null"); - - verify(springApplicationBuilder, never()).main(any()); - } - - record TestData(WebApplicationType applicationType, Class springBootApplication) {} -} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java deleted file mode 100644 index 02ef21d9..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/SpringDelegatingLambdaContainerHandlerTests.java +++ /dev/null @@ -1,350 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.util.CollectionUtils; - -import com.amazonaws.serverless.proxy.spring.servletapp.MessageData; -import com.amazonaws.serverless.proxy.spring.servletapp.ServletApplication; -import com.amazonaws.serverless.proxy.spring.servletapp.UserData; -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.ws.rs.core.HttpHeaders; - -@SuppressWarnings("rawtypes") -public class SpringDelegatingLambdaContainerHandlerTests { - - private static String API_GATEWAY_EVENT = "{\n" - + " \"version\": \"1.0\",\n" - + " \"resource\": \"$default\",\n" - + " \"path\": \"/async\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"headers\": {\n" - + " \"Content-Length\": \"45\",\n" - + " \"Content-Type\": \"application/json\",\n" - + " \"Host\": \"i76bfh111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"User-Agent\": \"curl/7.79.1\",\n" - + " \"X-Amzn-Trace-Id\": \"Root=1-64087690-2151375b219d3ba3389ea84e\",\n" - + " \"X-Forwarded-For\": \"109.210.252.44\",\n" - + " \"X-Forwarded-Port\": \"443\",\n" - + " \"X-Forwarded-Proto\": \"https\",\n" - + " \"accept\": \"*/*\"\n" - + " },\n" - + " \"multiValueHeaders\": {\n" - + " \"Content-Length\": [\n" - + " \"45\"\n" - + " ],\n" - + " \"Content-Type\": [\n" - + " \"application/json\"\n" - + " ],\n" - + " \"Host\": [\n" - + " \"i76bfhczs0.execute-api.eu-west-3.amazonaws.com\"\n" - + " ],\n" - + " \"User-Agent\": [\n" - + " \"curl/7.79.1\"\n" - + " ],\n" - + " \"X-Amzn-Trace-Id\": [\n" - + " \"Root=1-64087690-2151375b219d3ba3389ea84e\"\n" - + " ],\n" - + " \"X-Forwarded-For\": [\n" - + " \"109.210.252.44\"\n" - + " ],\n" - + " \"X-Forwarded-Port\": [\n" - + " \"443\"\n" - + " ],\n" - + " \"X-Forwarded-Proto\": [\n" - + " \"https\"\n" - + " ],\n" - + " \"accept\": [\n" - + " \"*/*\"\n" - + " ]\n" - + " },\n" - + " \"queryStringParameters\": {\n" - + " \"abc\": \"xyz\",\n" - + " \"name\": \"Ricky\",\n" - + " \"foo\": \"baz\"\n" - + " },\n" - + " \"multiValueQueryStringParameters\": {\n" - + " \"abc\": [\n" - + " \"xyz\"\n" - + " ],\n" - + " \"name\": [\n" - + " \"Ricky\"\n" - + " ],\n" - + " \"foo\": [\n" - + " \"bar\",\n" - + " \"baz\"\n" - + " ]\n" - + " },\n" - + " \"requestContext\": {\n" - + " \"accountId\": \"123456789098\",\n" - + " \"apiId\": \"i76bfhczs0\",\n" - + " \"domainName\": \"i76bfhc111.execute-api.eu-west-3.amazonaws.com\",\n" - + " \"domainPrefix\": \"i76bfhczs0\",\n" - + " \"extendedRequestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"httpMethod\": \"POST\",\n" - + " \"identity\": {\n" - + " \"accessKey\": null,\n" - + " \"accountId\": null,\n" - + " \"caller\": null,\n" - + " \"cognitoAmr\": null,\n" - + " \"cognitoAuthenticationProvider\": null,\n" - + " \"cognitoAuthenticationType\": null,\n" - + " \"cognitoIdentityId\": null,\n" - + " \"cognitoIdentityPoolId\": null,\n" - + " \"principalOrgId\": null,\n" - + " \"sourceIp\": \"109.210.252.44\",\n" - + " \"user\": null,\n" - + " \"userAgent\": \"curl/7.79.1\",\n" - + " \"userArn\": null\n" - + " },\n" - + " \"path\": \"/pets\",\n" - + " \"protocol\": \"HTTP/1.1\",\n" - + " \"requestId\": \"Bdd2ngt5iGYEMIg=\",\n" - + " \"requestTime\": \"08/Mar/2023:11:50:40 +0000\",\n" - + " \"requestTimeEpoch\": 1678276240455,\n" - + " \"resourceId\": \"$default\",\n" - + " \"resourcePath\": \"$default\",\n" - + " \"stage\": \"$default\"\n" - + " },\n" - + " \"pathParameters\": null,\n" - + " \"stageVariables\": null,\n" - + " \"body\": \"{\\\"name\\\":\\\"bob\\\"}\",\n" - + " \"isBase64Encoded\": false\n" - + "}"; - - private static String API_GATEWAY_EVENT_V2 = "{\n" + - " \"version\": \"2.0\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"rawPath\": \"/my/path\",\n" + - " \"rawQueryString\": \"parameter1=value1¶meter1=value2&name=Ricky¶meter2=value\",\n" + - " \"cookies\": [\n" + - " \"cookie1\",\n" + - " \"cookie2\"\n" + - " ],\n" + - " \"headers\": {\n" + - " \"header1\": \"value1\",\n" + - " \"header2\": \"value1,value2\"\n" + - " },\n" + - " \"queryStringParameters\": {\n" + - " \"parameter1\": \"value1,value2\",\n" + - " \"name\": \"Ricky\",\n" + - " \"parameter2\": \"value\"\n" + - " },\n" + - " \"requestContext\": {\n" + - " \"accountId\": \"123456789012\",\n" + - " \"apiId\": \"api-id\",\n" + - " \"authentication\": {\n" + - " \"clientCert\": {\n" + - " \"clientCertPem\": \"CERT_CONTENT\",\n" + - " \"subjectDN\": \"www.example.com\",\n" + - " \"issuerDN\": \"Example issuer\",\n" + - " \"serialNumber\": \"a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1\",\n" + - " \"validity\": {\n" + - " \"notBefore\": \"May 28 12:30:02 2019 GMT\",\n" + - " \"notAfter\": \"Aug 5 09:36:04 2021 GMT\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"authorizer\": {\n" + - " \"jwt\": {\n" + - " \"claims\": {\n" + - " \"claim1\": \"value1\",\n" + - " \"claim2\": \"value2\"\n" + - " },\n" + - " \"scopes\": [\n" + - " \"scope1\",\n" + - " \"scope2\"\n" + - " ]\n" + - " }\n" + - " },\n" + - " \"domainName\": \"id.execute-api.us-east-1.amazonaws.com\",\n" + - " \"domainPrefix\": \"id\",\n" + - " \"http\": {\n" + - " \"method\": \"POST\",\n" + - " \"path\": \"/my/path\",\n" + - " \"protocol\": \"HTTP/1.1\",\n" + - " \"sourceIp\": \"IP\",\n" + - " \"userAgent\": \"agent\"\n" + - " },\n" + - " \"requestId\": \"id\",\n" + - " \"routeKey\": \"$default\",\n" + - " \"stage\": \"$default\",\n" + - " \"time\": \"12/Mar/2020:19:03:58 +0000\",\n" + - " \"timeEpoch\": 1583348638390\n" + - " },\n" + - " \"body\": \"Hello from Lambda\",\n" + - " \"pathParameters\": {\n" + - " \"parameter1\": \"value1\"\n" + - " },\n" + - " \"isBase64Encoded\": false,\n" + - " \"stageVariables\": {\n" + - " \"stageVariable1\": \"value1\",\n" + - " \"stageVariable2\": \"value2\"\n" + - " }\n" + - "}"; - - private SpringDelegatingLambdaContainerHandler handler; - - private ObjectMapper mapper = new ObjectMapper(); - - public void initServletAppTest() throws ContainerInitializationException { - this.handler = new SpringDelegatingLambdaContainerHandler(ServletApplication.class); - } - - public static Collection data() { - return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2}); - } - - @MethodSource("data") - @ParameterizedTest - public void validateComplesrequest(String jsonEvent) throws Exception { - initServletAppTest(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", - "/foo/male/list/24", "{\"name\":\"bob\"}", false,null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - String[] responseBody = ((String) result.get("body")).split("/"); - assertEquals("male", responseBody[0]); - assertEquals("24", responseBody[1]); - assertEquals("Ricky", responseBody[2]); - } - - @MethodSource("data") - @ParameterizedTest - public void testAsyncPost(String jsonEvent) throws Exception { - initServletAppTest(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/async", "{\"name\":\"bob\"}",false, null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("{\"name\":\"BOB\"}", result.get("body")); - } - - @MethodSource("data") - @ParameterizedTest - public void testValidate400(String jsonEvent) throws Exception { - initServletAppTest(); - UserData ud = new UserData(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(400, result.get("statusCode")); - assertEquals("3", result.get("body")); - } - - @MethodSource("data") - @ParameterizedTest - public void testValidate200(String jsonEvent) throws Exception { - initServletAppTest(); - UserData ud = new UserData(); - ud.setFirstName("bob"); - ud.setLastName("smith"); - ud.setEmail("foo@bar.com"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", mapper.writeValueAsString(ud),false, null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("VALID", result.get("body")); - } - - @MethodSource("data") - @ParameterizedTest - public void testValidate200Base64(String jsonEvent) throws Exception { - initServletAppTest(); - UserData ud = new UserData(); - ud.setFirstName("bob"); - ud.setLastName("smith"); - ud.setEmail("foo@bar.com"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/validate", - Base64.getMimeEncoder().encodeToString(mapper.writeValueAsString(ud).getBytes()),true, null)); - - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("VALID", result.get("body")); - } - - - @MethodSource("data") - @ParameterizedTest - public void messageObject_parsesObject_returnsCorrectMessage(String jsonEvent) throws Exception { - initServletAppTest(); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")),false, null)); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals(200, result.get("statusCode")); - assertEquals("test message", result.get("body")); - } - - - - @SuppressWarnings({"unchecked" }) - @MethodSource("data") - @ParameterizedTest - void messageObject_propertiesInContentType_returnsCorrectMessage(String jsonEvent) throws Exception { - initServletAppTest(); - - Map headers = new HashMap<>(); - headers.put(HttpHeaders.CONTENT_TYPE, "application/json;v=1"); - headers.put(HttpHeaders.ACCEPT, "application/json;v=1"); - InputStream targetStream = new ByteArrayInputStream(this.generateHttpRequest(jsonEvent, "POST", "/message", - mapper.writeValueAsString(new MessageData("test message")),false, headers)); - - ByteArrayOutputStream output = new ByteArrayOutputStream(); - handler.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toString(StandardCharsets.UTF_8), Map.class); - assertEquals("test message", result.get("body")); - } - - private byte[] generateHttpRequest(String jsonEvent, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { - Map requestMap = mapper.readValue(jsonEvent, Map.class); - if (requestMap.get("version").equals("2.0")) { - return generateHttpRequest2(requestMap, method, path, body, isBase64Encoded,headers); - } - return generateHttpRequest(requestMap, method, path, body,isBase64Encoded, headers); - } - - @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { - requestMap.put("path", path); - requestMap.put("httpMethod", method); - requestMap.put("body", body); - requestMap.put("isBase64Encoded", isBase64Encoded); - if (!CollectionUtils.isEmpty(headers)) { - requestMap.put("headers", headers); - } - return mapper.writeValueAsBytes(requestMap); - } - - @SuppressWarnings({ "unchecked"}) - private byte[] generateHttpRequest2(Map requestMap, String method, String path, String body,boolean isBase64Encoded, Map headers) throws Exception { - Map map = mapper.readValue(API_GATEWAY_EVENT_V2, Map.class); - Map http = (Map) ((Map) map.get("requestContext")).get("http"); - http.put("path", path); - http.put("method", method); - map.put("body", body); - map.put("isBase64Encoded", isBase64Encoded); - if (!CollectionUtils.isEmpty(headers)) { - map.put("headers", headers); - } - return mapper.writeValueAsBytes(map); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java deleted file mode 100644 index 9c39fd90..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/WebFluxAppTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.amazonaws.serverless.proxy.spring; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import java.util.Arrays; -import java.util.Collection; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.webfluxapp.LambdaHandler; -import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageController; -import com.amazonaws.serverless.proxy.spring.webfluxapp.MessageData; -import com.fasterxml.jackson.core.JsonProcessingException; - -public class WebFluxAppTest { - - LambdaHandler handler; - MockLambdaContext lambdaContext = new MockLambdaContext(); - - private String type; - - public static Collection data() { - return Arrays.asList(new Object[]{"API_GW", "ALB", "HTTP_API"}); - } - - public void initWebFluxAppTest(String reqType) { - type = reqType; - handler = new LambdaHandler(type); - } - - @MethodSource("data") - @ParameterizedTest - void helloRequest_respondsWithSingleMessage(String reqType) { - initWebFluxAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/single", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - System.out.println(resp.getBody()); - assertEquals(MessageController.MESSAGE, resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void helloDoubleRequest_respondsWithDoubleMessage(String reqType) { - initWebFluxAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/double", "GET"); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - - assertEquals(MessageController.MESSAGE + MessageController.MESSAGE, resp.getBody()); - } - - @MethodSource("data") - @ParameterizedTest - void messageObject_parsesObject_returnsCorrectMessage(String reqType) throws JsonProcessingException { - initWebFluxAppTest(reqType); - AwsProxyRequestBuilder req = new AwsProxyRequestBuilder("/message", "POST") - .json() - .body(new MessageData("test message")); - AwsProxyResponse resp = handler.handleRequest(req, lambdaContext); - assertNotNull(resp); - assertEquals(200, resp.getStatusCode()); - assertEquals("test message", resp.getBody()); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java deleted file mode 100644 index 5ffd4a31..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/embedded/ServerlessServletEmbeddedServerFactoryTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.embedded; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler; -import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import org.junit.jupiter.api.Test; -import org.springframework.boot.WebApplicationType; -import org.springframework.boot.web.servlet.ServletContextInitializer; - -import jakarta.servlet.ServletContext; -import jakarta.servlet.ServletException; - -import static org.junit.jupiter.api.Assertions.fail; - -public class ServerlessServletEmbeddedServerFactoryTest { - private SpringBootLambdaContainerHandler handler = new SpringBootLambdaContainerHandler<>( - AwsProxyRequest.class, - AwsProxyResponse.class, - new AwsProxyHttpServletRequestReader(), - new AwsProxyHttpServletResponseWriter(), - new AwsProxySecurityContextWriter(), - new AwsProxyExceptionHandler(), - null, - new InitializationWrapper(), - WebApplicationType.REACTIVE - ); - - public ServerlessServletEmbeddedServerFactoryTest() throws ContainerInitializationException { - } - - @Test - void getWebServer_callsInitializers() { - ServerlessServletEmbeddedServerFactory factory = new ServerlessServletEmbeddedServerFactory(); - factory.getWebServer(new ServletContextInitializer() { - @Override - public void onStartup(ServletContext servletContext) throws ServletException { - if (servletContext == null) { - fail("Null servlet context"); - } - } - }); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java deleted file mode 100644 index aeef7c65..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/DatabaseConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.jpaapp; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.jdbc.datasource.DriverManagerDataSource; - -import javax.sql.DataSource; - -@Configuration -public class DatabaseConfig { - - @Bean - public DataSource dataSource() { - DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName("org.h2.Driver"); - dataSource.setUrl("jdbc:h2:mem:testdb"); - dataSource.setUsername("sa"); - dataSource.setPassword(""); - - return dataSource; - } -} - diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java deleted file mode 100644 index 5aced5e2..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/JpaApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.jpaapp; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.logging.LogLevel; -import org.springframework.boot.logging.LoggingSystem; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; - -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class -}) -@Import(MessageController.class) -public class JpaApplication {} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java deleted file mode 100644 index 0cf67c10..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/LambdaHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.jpaapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -public class LambdaHandler implements RequestHandler { - private static SpringBootLambdaContainerHandler handler; - private static SpringBootLambdaContainerHandler httpApiHandler; - private String type; - - public LambdaHandler(String reqType) { - type = reqType; - try { - switch (type) { - case "API_GW": - case "ALB": - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(JpaApplication.class) - .buildAndInitialize(); - break; - case "HTTP_API": - httpApiHandler = new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(JpaApplication.class) - .buildAndInitialize(); - break; - } - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { - switch (type) { - case "API_GW": - return handler.proxy(awsProxyRequest.build(), context); - case "ALB": - return handler.proxy(awsProxyRequest.alb().build(), context); - case "HTTP_API": - return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); - default: - throw new RuntimeException("Unknown request type: " + type); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java deleted file mode 100644 index a8529226..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/jpaapp/MessageController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.jpaapp; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.context.request.async.DeferredResult; -import java.util.Collections; -import java.util.Map; - -@RestController -public class MessageController { - - public static final String HELLO_MESSAGE = "Hello"; - - @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) - public String hello() { - return HELLO_MESSAGE; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @RequestMapping(path = "/async", method = RequestMethod.POST) - @ResponseBody - public DeferredResult> asyncResult(@RequestBody Map value) { - DeferredResult result = new DeferredResult<>(); - result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); - return result; - } - -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java deleted file mode 100644 index ae8ba21a..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/LambdaHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.securityapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -public class LambdaHandler implements RequestHandler { - private static SpringBootLambdaContainerHandler handler; - - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(SecurityApplication.class); - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - return handler.proxy(awsProxyRequest, context); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java deleted file mode 100644 index ad67d476..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/MessageController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.securityapp; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; - - -@RestController -public class MessageController { - public static final String HELLO_MESSAGE = "Hello"; - - @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) - public Mono hello() { - return Mono.just(HELLO_MESSAGE); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java deleted file mode 100644 index d4036dcf..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.securityapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.web.reactive.config.EnableWebFlux; - -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class -}) -@EnableWebFluxSecurity -@EnableWebFlux -@Import(SecurityConfig.class) -public class SecurityApplication { -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java deleted file mode 100644 index d83b81db..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/securityapp/SecurityConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.securityapp; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.config.web.server.ServerHttpSecurity; -import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.server.SecurityWebFilterChain; - -@Configuration -@EnableWebFluxSecurity -public class SecurityConfig -{ - public static final String USERNAME = "admin"; - public static final String PASSWORD = "{noop}password"; - private static BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - - @Bean - public SecurityWebFilterChain securitygWebFilterChain( - ServerHttpSecurity http) { - return http.authorizeExchange() - .anyExchange().authenticated().and().csrf().disable() - .httpBasic() - .and().build(); - } - - @Bean - public static BCryptPasswordEncoder passwordEncoder() { - return passwordEncoder; - } - - @Bean - public MapReactiveUserDetailsService userDetailsService() { - UserDetails user = User - .withUsername(USERNAME) - .password(passwordEncoder.encode(PASSWORD)) - .roles("USER") - .build(); - return new MapReactiveUserDetailsService(user); - } -} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java deleted file mode 100644 index 88441988..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -public class LambdaHandler implements RequestHandler { - private static SpringBootLambdaContainerHandler handler; - private static SpringBootLambdaContainerHandler httpApiHandler; - private String type; - - public LambdaHandler(String reqType) { - type = reqType; - try { - switch (type) { - case "API_GW": - case "ALB": - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(ServletApplication.class) - .buildAndInitialize(); - break; - case "HTTP_API": - httpApiHandler = new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(ServletApplication.class) - .buildAndInitialize(); - break; - } - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { - switch (type) { - case "API_GW": - return handler.proxy(awsProxyRequest.build(), context); - case "ALB": - return handler.proxy(awsProxyRequest.alb().build(), context); - case "HTTP_API": - return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); - default: - throw new RuntimeException("Unknown request type: " + type); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java deleted file mode 100644 index fd7d71d7..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/LambdaStreamHandler.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -public class LambdaStreamHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - private static SpringBootLambdaContainerHandler httpApiHandler; - private String type; - - public LambdaStreamHandler(String reqType) { - type = reqType; - try { - switch (type) { - case "API_GW": - case "ALB": - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(ServletApplication.class) - .buildAndInitialize(); - break; - case "HTTP_API": - httpApiHandler = new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .servletApplication() - .springBootApplication(ServletApplication.class) - .buildAndInitialize(); - break; - } - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { - switch (type) { - case "API_GW": - case "ALB": - handler.proxyStream(inputStream, outputStream, context); - break; - case "HTTP_API": - httpApiHandler.proxyStream(inputStream, outputStream, context); - } - - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java deleted file mode 100644 index 1923396c..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageController.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.Errors; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.context.request.async.DeferredResult; -import org.springframework.web.server.ResponseStatusException; - -import jakarta.validation.Valid; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -@RestController -public class MessageController { - public static final String HELLO_MESSAGE = "Hello"; - public static final String VALID_MESSAGE = "VALID"; - public static final String UTF8_RESPONSE = "öüäß фрыцшщ"; - public static final String EX_MESSAGE = "404 exception message"; - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @RequestMapping(path = "/async", method = RequestMethod.POST) - @ResponseBody - public DeferredResult> asyncResult(@RequestBody Map value) { - DeferredResult result = new DeferredResult<>(); - result.setResult(Collections.singletonMap("name", value.get("name").toUpperCase())); - return result; - } - - @RequestMapping(path="/hello", method=RequestMethod.GET, produces = {"text/plain"}) - public String hello() { - return HELLO_MESSAGE; - } - - @RequestMapping(path="/validate", method=RequestMethod.POST, produces = {"text/plain"}) - public ResponseEntity validateBody(@RequestBody @Valid UserData userData, Errors errors) { - if (errors != null && errors.hasErrors()) { - return ResponseEntity.badRequest().body(errors.getErrorCount() + ""); - } - return ResponseEntity.ok(VALID_MESSAGE); - } - - @RequestMapping(path="/message", method = RequestMethod.POST) - public String returnMessage(@RequestBody MessageData data) { - if (data == null) { - throw new RuntimeException("No message data"); - } - return data.getMessage(); - } - - @RequestMapping(path="/echo/{message}", method=RequestMethod.GET) - public String returnPathMessage(@PathVariable(value="message") String message) { - return message; - } - - @GetMapping(value = "/content-type/utf8", produces = "text/plain") - public ResponseEntity getUtf8String() { - return ResponseEntity.ok(UTF8_RESPONSE); - } - - @GetMapping(value = "/content-type/jsonutf8", produces=MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity> getUtf8Json() { - Map resp = new HashMap(); - resp.put("s", UTF8_RESPONSE); - return ResponseEntity.ok(resp); - } - - @GetMapping(value = "/ex/customstatus") - public String throw404Exception() { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, EX_MESSAGE); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java deleted file mode 100644 index 129101cb..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/MessageData.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - -public class MessageData { - private String message; - - public MessageData() { - } - - public MessageData(String m) { - setMessage(m); - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java deleted file mode 100644 index 9f01859a..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/ServletApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class -}) -@Import(MessageController.class) -@RestController -public class ServletApplication { - - @RequestMapping(path = "/foo/{gender}/list/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public String complexRequest( - @PathVariable("gender") String gender, - @PathVariable("age") String age, - @RequestParam("name") String name - ) { - return gender + "/" + age + "/" + name; - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java deleted file mode 100644 index 379291a3..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/servletapp/UserData.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.servletapp; - - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - -public class UserData { - @NotBlank - private String firstName; - @NotBlank - private String lastName; - @NotNull @Email - private String email; - private String error; - - public UserData() { - - } - - public UserData(String err) { - error = err; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getError() { return error; } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java deleted file mode 100644 index 22f75e7a..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/LambdaHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.slowapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -import java.time.Instant; - -public class LambdaHandler implements RequestHandler { - private SpringBootLambdaContainerHandler handler; - private long constructorTime; - - public LambdaHandler() { - try { - long startTime = Instant.now().toEpochMilli(); - System.out.println("startCall: " + startTime); - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .springBootApplication(SlowTestApplication.class) - .buildAndInitialize(); - constructorTime = Instant.now().toEpochMilli() - startTime; - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - public long getConstructorTime() { - return constructorTime; - } - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context context) { - return handler.proxy(awsProxyRequest, context); - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java deleted file mode 100644 index 098e8e7d..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/MessageController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.slowapp; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class MessageController { - public static final String HELLO_MESSAGE = "Hello"; - - @RequestMapping(path="/hello", method= RequestMethod.GET) - public String hello() { - return HELLO_MESSAGE; - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java deleted file mode 100644 index 006e51e4..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/slowapp/SlowTestApplication.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.slowapp; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.stereotype.Component; - -import java.time.Instant; - -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class -}) -public class SlowTestApplication { - - @Component - public static class SlowDownInit implements InitializingBean { - public static final int INIT_SLEEP_TIME_MS = 13_000; - - @Override - public void afterPropertiesSet() throws Exception { - Thread.sleep(INIT_SLEEP_TIME_MS); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java deleted file mode 100644 index 0eb52a7b..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/LambdaHandler.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.webfluxapp; - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.InitializationWrapper; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; - -public class LambdaHandler implements RequestHandler { - private static SpringBootLambdaContainerHandler handler; - private static SpringBootLambdaContainerHandler httpApiHandler; - - private String type; - - public LambdaHandler(String reqType) { - type = reqType; - try { - switch (type) { - case "API_GW": - case "ALB": - handler = new SpringBootProxyHandlerBuilder() - .defaultProxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(WebFluxTestApplication.class) - .buildAndInitialize(); - break; - case "HTTP_API": - httpApiHandler = new SpringBootProxyHandlerBuilder() - .defaultHttpApiV2Proxy() - .initializationWrapper(new InitializationWrapper()) - .springBootApplication(WebFluxTestApplication.class) - .buildAndInitialize(); - break; - } - } catch (ContainerInitializationException e) { - e.printStackTrace(); - } - } - - @Override - public AwsProxyResponse handleRequest(AwsProxyRequestBuilder awsProxyRequest, Context context) { - switch (type) { - case "API_GW": - return handler.proxy(awsProxyRequest.build(), context); - case "ALB": - return handler.proxy(awsProxyRequest.alb().build(), context); - case "HTTP_API": - return httpApiHandler.proxy(awsProxyRequest.toHttpApiV2Request(), context); - default: - throw new RuntimeException("Unknown request type: " + type); - } - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java deleted file mode 100644 index a0460461..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.webfluxapp; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import reactor.core.publisher.Flux; - -@RestController -public class MessageController { - public static final String MESSAGE = "Hello"; - - @RequestMapping(path="/single", method= RequestMethod.GET, produces = {"text/plain"}) - Flux singleMessage(){ - return Flux.just( - MESSAGE - ); - } - - @RequestMapping(path="/double", method= RequestMethod.GET, produces={"text/plain"}) - Flux doubleMessage(){ - return Flux.just( - MESSAGE, - MESSAGE - ); - } - - @RequestMapping(path="/message", method = RequestMethod.POST, produces={"text/plain"}, consumes = {"application/json"}) - public Flux returnMessage(@RequestBody MessageData data) { - if (data == null) { - throw new RuntimeException("No message data"); - } - return Flux.just(data.getMessage()); - } -} \ No newline at end of file diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java deleted file mode 100644 index 2be6b4f2..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/MessageData.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.webfluxapp; - -public class MessageData { - private String message; - - public MessageData() { - } - - public MessageData(String m) { - setMessage(m); - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java b/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java deleted file mode 100644 index fc6aecd6..00000000 --- a/aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/webfluxapp/WebFluxTestApplication.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.amazonaws.serverless.proxy.spring.webfluxapp; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.reactive.config.EnableWebFlux; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -@SpringBootApplication(exclude = { - org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration.class, - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class, - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.class -}) -public class WebFluxTestApplication { - -} diff --git a/aws-serverless-springboot3-archetype/pom.xml b/aws-serverless-springboot3-archetype/pom.xml deleted file mode 100644 index a435098d..00000000 --- a/aws-serverless-springboot3-archetype/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - 4.0.0 - - - com.amazonaws.serverless - aws-serverless-java-container - 3.0.1-SNAPSHOT - - - com.amazonaws.serverless.archetypes - aws-serverless-springboot3-archetype - 2.1.5 - maven-archetype - - - https://github.com/aws/serverless-java-container.git - HEAD - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - - src/main/resources - true - - archetype-resources/pom.xml - archetype-resources/README.md - - - - src/main/resources - false - - archetype-resources/pom.xml - - - - - - - org.apache.maven.archetype - archetype-packaging - 3.4.0 - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.3.1 - - \ - - - - org.apache.maven.plugins - maven-archetype-plugin - 3.4.0 - - - - integration-test - - - - - - - - diff --git a/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml deleted file mode 100644 index 5379692b..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - src/main/java - - **/*.java - - - - src/main/resources - - **/*.properties - - - - src/test/java - - **/*.java - - - - src/assembly - - * - - - - - - template.yml - README.md - build.gradle - - - - \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md deleted file mode 100644 index 311c40ae..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/README.md +++ /dev/null @@ -1,99 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -# \${artifactId} serverless API -The \${artifactId} project, created with [`aws-serverless-java-container`](https://github.com/aws/serverless-java-container). - -The starter project defines a simple `/ping` resource that can accept `GET` requests with its tests. - -The project folder also includes a `template.yml` file. You can use this [SAM](https://github.com/awslabs/serverless-application-model) file to deploy the project to AWS Lambda and Amazon API Gateway or test in local with the [SAM CLI](https://github.com/awslabs/aws-sam-cli). - -#[[##]]# Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -#[[##]]# Building the project -You can use the SAM CLI to quickly build the project -```bash -$ mvn archetype:generate -DartifactId=\${artifactId} -DarchetypeGroupId=com.amazonaws.serverless.archetypes -DarchetypeArtifactId=aws-serverless-jersey-archetype -DarchetypeVersion=${project.version} -DgroupId=\${groupId} -Dversion=\${version} -Dinteractive=false -$ cd \${artifactId} -$ sam build -Building resource '\${resourceName}Function' -Running JavaGradleWorkflow:GradleBuild -Running JavaGradleWorkflow:CopyArtifacts - -Build Succeeded - -Built Artifacts : .aws-sam/build -Built Template : .aws-sam/build/template.yaml - -Commands you can use next -========================= -[*] Invoke Function: sam local invoke -[*] Deploy: sam deploy --guided -``` - -#[[##]]# Testing locally with the SAM CLI - -From the project root folder - where the `template.yml` file is located - start the API with the SAM CLI. - -```bash -$ sam local start-api - -... -Mounting ${groupId}.StreamLambdaHandler::handleRequest (java11) at http://127.0.0.1:3000/{proxy+} [OPTIONS GET HEAD POST PUT DELETE PATCH] -... -``` - -Using a new shell, you can send a test ping request to your API: - -```bash -$ curl -s http://127.0.0.1:3000/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` - -#[[##]]# Deploying to AWS -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... -------------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue -------------------------------------------------------------------------------------------------------------- -\${resourceName}Api - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/pets -------------------------------------------------------------------------------------------------------------- -``` - -Copy the `OutputValue` into a browser or use curl to test your first request: - -```bash -$ curl -s https://xxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/ping | python -m json.tool - -{ - "pong": "Hello, World!" -} -``` diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle deleted file mode 100644 index 3aa54825..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() - maven {url "https://repo.spring.io/milestone"} - maven {url "https://repo.spring.io/snapshot"} -} - -dependencies { - implementation ( - 'org.springframework.boot:spring-boot-starter-web:3.4.5', - 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', - ) - - testImplementation("com.amazonaws.serverless:aws-serverless-java-container-core:[2.0-SNAPSHOT,):tests") - testImplementation("org.apache.httpcomponents.client5:httpclient5:5.5") - testImplementation(platform("org.junit:junit-bom:5.13.1")) - testImplementation("org.junit.jupiter:junit-jupiter") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -test { - useJUnitPlatform() -} - -build.dependsOn buildZip diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index 39f5f603..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,180 +0,0 @@ -#set($dollar = '$') - - - 4.0.0 - - \${groupId} - \${artifactId} - \${version} - jar - - Serverless Spring Boot 3 API - https://github.com/aws/serverless-java-container - - - org.springframework.boot - spring-boot-starter-parent - 3.4.5 - - - - 17 - 5.12.1 - - - - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - 2.1.5 - - - com.amazonaws.serverless - aws-serverless-java-container-core - 2.1.5 - tests - test-jar - test - - - org.apache.httpcomponents.client5 - httpclient5 - 5.4.3 - test - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - org.junit.jupiter - junit-jupiter - test - - - - - - - org.junit - junit-bom - ${junit.version} - import - pom - - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.2 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.8.1 - - - copy-dependencies - package - - copy-dependencies - - - ${dollar}{project.build.directory}${dollar}{file.separator}lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - zip-assembly - package - - single - - - ${dollar}{project.artifactId}-${dollar}{project.version} - - src${dollar}{file.separator}assembly${dollar}{file.separator}bin.xml - - false - - - - - - - - - diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java deleted file mode 100644 index 1b74086f..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/Application.java +++ /dev/null @@ -1,24 +0,0 @@ -#macro(loggingOff) - logging.level.root:OFF -#end -#set($logging = "#loggingOff()") -#set($logging = $logging.replaceAll("\n", "").trim()) -package ${groupId}; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; - -import ${groupId}.controller.PingController; - - -@SpringBootApplication -// We use direct @Import instead of @ComponentScan to speed up cold starts -// @ComponentScan(basePackages = "${groupId}.controller") -@Import({ PingController.class }) -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java deleted file mode 100644 index e022540c..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/StreamLambdaHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java deleted file mode 100644 index 94f517f0..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/java/controller/PingController.java +++ /dev/null @@ -1,20 +0,0 @@ -package ${groupId}.controller; - - -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.util.HashMap; -import java.util.Map; - - -@RestController -@EnableWebMvc -public class PingController { - @RequestMapping(path = "/ping", method = RequestMethod.GET) - public Map ping() { - Map pong = new HashMap<>(); - pong.put("pong", "Hello, World!"); - return pong; - } -} diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties deleted file mode 100644 index 070e632f..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Reduce logging level to make sure the application works with SAM local -# https://github.com/aws/serverless-java-container/issues/134 -logging.level.root=WARN \ No newline at end of file diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java deleted file mode 100644 index 26d5360b..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/src/test/java/StreamLambdaHandlerTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package ${groupId}; - - -import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler; -import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder; -import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.services.lambda.runtime.Context; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import jakarta.ws.rs.HttpMethod; -import jakarta.ws.rs.core.HttpHeaders; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.*; - -public class StreamLambdaHandlerTest { - - private static StreamLambdaHandler handler; - private static Context lambdaContext; - - @BeforeAll - public static void setUp() { - handler = new StreamLambdaHandler(); - lambdaContext = new MockLambdaContext(); - } - - @Test - public void ping_streamRequest_respondsWithHello() { - InputStream requestStream = new AwsProxyRequestBuilder("/ping", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.OK.getStatusCode(), response.getStatusCode()); - - assertFalse(response.isBase64Encoded()); - - assertTrue(response.getBody().contains("pong")); - assertTrue(response.getBody().contains("Hello, World!")); - - assertTrue(response.getMultiValueHeaders().containsKey(HttpHeaders.CONTENT_TYPE)); - assertTrue(response.getMultiValueHeaders().getFirst(HttpHeaders.CONTENT_TYPE).startsWith(MediaType.APPLICATION_JSON)); - } - - @Test - public void invalidResource_streamRequest_responds404() { - InputStream requestStream = new AwsProxyRequestBuilder("/pong", HttpMethod.GET) - .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON) - .buildStream(); - ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); - - handle(requestStream, responseStream); - - AwsProxyResponse response = readResponse(responseStream); - assertNotNull(response); - assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatusCode()); - } - - private void handle(InputStream is, ByteArrayOutputStream os) { - try { - handler.handleRequest(is, os, lambdaContext); - } catch (IOException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - private AwsProxyResponse readResponse(ByteArrayOutputStream responseStream) { - try { - return LambdaContainerHandler.getObjectMapper().readValue(responseStream.toByteArray(), AwsProxyResponse.class); - } catch (IOException e) { - e.printStackTrace(); - fail("Error while parsing response: " + e.getMessage()); - } - return null; - } -} diff --git a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml b/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml deleted file mode 100644 index fe96b1fa..00000000 --- a/aws-serverless-springboot3-archetype/src/main/resources/archetype-resources/template.yml +++ /dev/null @@ -1,52 +0,0 @@ -#set($resourceName = $artifactId) -#macro(replaceChar $originalName, $char) - #if($originalName.contains($char)) - #set($tokens = $originalName.split($char)) - #set($newResourceName = "") - #foreach($token in $tokens) - #set($newResourceName = $newResourceName + $token.substring(0,1).toUpperCase() + $token.substring(1).toLowerCase()) - #end - ${newResourceName} - #else - #set($newResourceName = $originalName.substring(0,1).toUpperCase() + $originalName.substring(1)) - ${newResourceName} - #end -#end -#set($resourceName = "#replaceChar($resourceName, '-')") -#set($resourceName = "#replaceChar($resourceName, '.')") -#set($resourceName = $resourceName.replaceAll("\n", "").trim()) -#macro(regionVar) - AWS::Region -#end -#set($awsRegion = "#regionVar()") -#set($awsRegion = $awsRegion.replaceAll("\n", "").trim()) -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: AWS Serverless Spring Boot 2 API - ${groupId}::${artifactId} -Globals: - Api: - EndpointConfiguration: REGIONAL - -Resources: - ${resourceName}Function: - Type: AWS::Serverless::Function - Properties: - Handler: ${groupId}.StreamLambdaHandler::handleRequest - Runtime: java21 - CodeUri: . - MemorySize: 512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Events: - ProxyResource: - Type: Api - Properties: - Path: /{proxy+} - Method: any - -Outputs: - ${resourceName}Api: - Description: URL for application - Value: !Sub 'https://${ServerlessRestApi}.execute-api.${${awsRegion}}.amazonaws.com/Prod/ping' - Export: - Name: ${resourceName}Api diff --git a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties deleted file mode 100644 index 7df3bf6e..00000000 --- a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/archetype.properties +++ /dev/null @@ -1,3 +0,0 @@ -groupId=test.service -artifactId=springboot-archetype-test -version=1.0-SNAPSHOT diff --git a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt b/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt deleted file mode 100644 index 597acc76..00000000 --- a/aws-serverless-springboot3-archetype/src/test/resources/projects/base/goal.txt +++ /dev/null @@ -1 +0,0 @@ -package \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/README.md b/samples/springboot3/alt-pet-store/README.md deleted file mode 100644 index b91cd42f..00000000 --- a/samples/springboot3/alt-pet-store/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Serverless Spring Boot 3 example -A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). Unlike older examples, this example is relying on the new -`SpringDelegatingLambdaContainerHandler`, which you simply need to identify as a _handler_ of the Lambda function. The main configuration class identified as `MAIN_CLASS` -environment variable or `Start-Class` or `Main-Class` entry in Manifest file. See provided `template.yml` file for reference. - - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ sam build -``` - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets ---------------------------------------------------------------------------------------------------------- - -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets -``` - -You can also try a complex request passing both path and request parameters to complex endpoint such as this: - - -``` -@RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) -public String complexRequest(@RequestBody String body, - @PathVariable("gender") String gender, - @PathVariable("age") String age, - @RequestParam("name") String name -) -``` -For example. - -``` -curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST https://zuhd709386.execute-api.us-east-2.amazonaws.com/foo/male/bar/25?name=Ricky -``` diff --git a/samples/springboot3/alt-pet-store/build.gradle b/samples/springboot3/alt-pet-store/build.gradle deleted file mode 100644 index d2c99b90..00000000 --- a/samples/springboot3/alt-pet-store/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() - maven {url "https://repo.spring.io/milestone"} - maven {url "https://repo.spring.io/snapshot"} -} - -dependencies { - implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.5.7') { - exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' - }, - 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', - ) -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -build.dependsOn buildZip diff --git a/samples/springboot3/alt-pet-store/pom.xml b/samples/springboot3/alt-pet-store/pom.xml deleted file mode 100644 index 64cbb083..00000000 --- a/samples/springboot3/alt-pet-store/pom.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - petstore-springboot3-example - 2.0-SNAPSHOT - Spring Boot example for the aws-serverless-java-container library - Simple pet store written with the Spring framework and Spring Boot - https://aws.amazon.com/lambda/ - - - org.springframework.boot - spring-boot-starter-parent - 3.5.0 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - 17 - - - - - org.springframework.boot - spring-boot-starter - - - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - [2.2.0-SNAPSHOT,),[2.1.1,) - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.4 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.8.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - zip-assembly - package - - single - - - ${project.artifactId}-${project.version} - - src${file.separator}assembly${file.separator}bin.xml - - false - - - - - - - - - - - diff --git a/samples/springboot3/alt-pet-store/src/assembly/bin.xml b/samples/springboot3/alt-pet-store/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/samples/springboot3/alt-pet-store/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java deleted file mode 100644 index 428d6726..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import com.amazonaws.serverless.sample.springboot3.controller.PetsController; -import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; - -import jakarta.servlet.Filter; - - -@SpringBootApplication -@Import({ PetsController.class }) -public class Application { - - // silence console logging - @Value("${logging.level.root:OFF}") - String message = ""; - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } - - @Bean("CognitoIdentityFilter") - public Filter cognitoFilter() { - return new CognitoIdentityFilter(); - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java deleted file mode 100644 index 769db35f..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.controller; - - - -import com.amazonaws.serverless.sample.springboot3.model.Pet; -import com.amazonaws.serverless.sample.springboot3.model.PetData; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.security.Principal; -import java.util.Optional; -import java.util.UUID; - - -@RestController -@EnableWebMvc -public class PetsController { - - @RequestMapping(path = "/pets", method = RequestMethod.POST) - public Pet createPet(@RequestBody Pet newPet) { - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) - public Pet listPets() { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - return newPet; - } - - @RequestMapping(path = "/foo/{gender}/bar/{age}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) - public String complexRequest(@RequestBody String body, - @PathVariable("gender") String gender, - @PathVariable("age") String age, - @RequestParam("name") String name - ) { - System.out.println("Body: " + body + " - " + gender + "/" + age + "/" + name); - return gender + "/" + age + "/" + name; - } - -} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java deleted file mode 100644 index d6ccae76..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - return; - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java deleted file mode 100644 index 320f2158..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -public class Error { - private String message; - - public Error(String errorMessage) { - message = errorMessage; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java deleted file mode 100644 index 4f0c4ba8..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -import java.util.Date; - - -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java deleted file mode 100644 index 68ea3c18..00000000 --- a/samples/springboot3/alt-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/springboot3/alt-pet-store/src/main/resources/logback.xml b/samples/springboot3/alt-pet-store/src/main/resources/logback.xml deleted file mode 100644 index 81d89177..00000000 --- a/samples/springboot3/alt-pet-store/src/main/resources/logback.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/samples/springboot3/alt-pet-store/template.yml b/samples/springboot3/alt-pet-store/template.yml deleted file mode 100644 index c883f085..00000000 --- a/samples/springboot3/alt-pet-store/template.yml +++ /dev/null @@ -1,41 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with spring-cloud-function web-proxy support - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: -# AutoPublishAlias: bcn - FunctionName: pet-store-boot-3 - Handler: com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler::handleRequest - Runtime: java21 - SnapStart: - ApplyOn: PublishedVersions - CodeUri: . - MemorySize: 1024 - Policies: AWSLambdaBasicExecutionRole - Timeout: 30 - Environment: - Variables: - MAIN_CLASS: com.amazonaws.serverless.sample.springboot3.Application - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - SpringPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: SpringPetStoreApi - - diff --git a/samples/springboot3/graphql-pet-store/README.md b/samples/springboot3/graphql-pet-store/README.md deleted file mode 100644 index e5bfad12..00000000 --- a/samples/springboot3/graphql-pet-store/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Serverless Spring Boot 3 with GraphQL example -A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). Unlike older examples, this example uses the [Spring for GraphQl](https://docs.spring.io/spring-graphql/reference/) library. - - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ sam build -``` - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` to make a call to the URL - -``` -... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl ---------------------------------------------------------------------------------------------------------- - -$ curl -X POST https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/graphQl -d '{"query":"query petDetails {\n petById(id: \"pet-1\") {\n id\n name\n breed\n owner {\n id\n firstName\n lastName\n }\n }\n}","operationName":"petDetails"}' -H "Content-Type: application/json" - -``` \ No newline at end of file diff --git a/samples/springboot3/graphql-pet-store/pom.xml b/samples/springboot3/graphql-pet-store/pom.xml deleted file mode 100644 index 23ac0bae..00000000 --- a/samples/springboot3/graphql-pet-store/pom.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - serverless-springboot3-example - 2.0-SNAPSHOT - Spring Boot example for the aws-serverless-java-container library - Simple pet store written with the Spring framework and Spring Boot - https://aws.amazon.com/lambda/ - - - org.springframework.boot - spring-boot-starter-parent - 3.5.0 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - 17 - - - - - org.springframework.boot - spring-boot-starter-graphql - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - org.springframework.graphql - spring-graphql-test - test - - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - [2.0.0-SNAPSHOT,),[2.0.0-M1,) - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.4 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.8.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - zip-assembly - package - - single - - - ${project.artifactId}-${project.version} - - src${file.separator}assembly${file.separator}bin.xml - - false - - - - - - - - - - - diff --git a/samples/springboot3/graphql-pet-store/src/assembly/bin.xml b/samples/springboot3/graphql-pet-store/src/assembly/bin.xml deleted file mode 100644 index efc312c2..00000000 --- a/samples/springboot3/graphql-pet-store/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java deleted file mode 100644 index 9cf0ea61..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - -import com.amazonaws.serverless.sample.springboot3.controller.PetsController; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - - -@SpringBootApplication -@Import({ PetsController.class }) -public class Application { - - // silence console logging - @Value("${logging.level.root:OFF}") - String message = ""; - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java deleted file mode 100644 index a65c6f1e..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.EnumSet; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - - // we use the onStartup method of the handler to register our custom filter - handler.onStartup(servletContext -> { - FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - }); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - public StreamLambdaHandler() { - // we enable the timer for debugging. This SHOULD NOT be enabled in production. - Timer.enable(); - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java deleted file mode 100644 index 93eb999b..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.controller; - -import org.springframework.graphql.data.method.annotation.Argument; -import org.springframework.graphql.data.method.annotation.QueryMapping; -import org.springframework.graphql.data.method.annotation.SchemaMapping; -import org.springframework.stereotype.Controller; -import com.amazonaws.serverless.sample.springboot3.model.Owner; -import com.amazonaws.serverless.sample.springboot3.model.Pet; - -@Controller -public class PetsController { - @QueryMapping - public Pet petById(@Argument String id) { - return Pet.getById(id); - } - - @SchemaMapping - public Owner owner(Pet pet) { - return Owner.getById(pet.ownerId()); - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java deleted file mode 100644 index d6ccae76..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - return; - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java deleted file mode 100644 index f048e690..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Owner.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.model; - -import java.util.Arrays; -import java.util.List; - -public record Owner (String id, String firstName, String lastName) { - - private static List owners = Arrays.asList( - new Owner("owner-1", "Joshua", "Bloch"), - new Owner("owner-2", "Douglas", "Adams"), - new Owner("owner-3", "Bill", "Bryson") - ); - - public static Owner getById(String id) { - return owners.stream() - .filter(owner -> owner.id().equals(id)) - .findFirst() - .orElse(null); - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java deleted file mode 100644 index f97b973d..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.model; - -import java.util.Arrays; -import java.util.List; - -public record Pet (String id, String name, String breed, String ownerId) { - - private static List pets = Arrays.asList( - new Pet("pet-1", "Alpha", "Bulldog", "owner-1"), - new Pet("pet-2", "Max", "German Shepherd", "owner-2"), - new Pet("pet-3", "Rockie", "Golden Retriever", "owner-3") - ); - - public static Pet getById(String id) { - return pets.stream() - .filter(pet -> pet.id().equals(id)) - .findFirst() - .orElse(null); - } -} diff --git a/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls b/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls deleted file mode 100644 index 293cdcc4..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/resources/graphql/schema.graphqls +++ /dev/null @@ -1,16 +0,0 @@ -type Query { - petById(id: ID): Pet -} - -type Pet { - id: ID - name: String - breed: String - owner: Owner -} - -type Owner { - id: ID - firstName: String - lastName: String -} diff --git a/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml b/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml deleted file mode 100644 index 8ff98899..00000000 --- a/samples/springboot3/graphql-pet-store/src/main/resources/logback.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/springboot3/graphql-pet-store/template.yml b/samples/springboot3/graphql-pet-store/template.yml deleted file mode 100644 index ce5dcc6b..00000000 --- a/samples/springboot3/graphql-pet-store/template.yml +++ /dev/null @@ -1,32 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with SpringBoot3, Spring for GraphQl and the aws-serverless-java-container library - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler::handleRequest - Runtime: java21 - CodeUri: . - MemorySize: 1024 - Policies: AWSLambdaBasicExecutionRole - Timeout: 60 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - SpringBootPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/graphql' - Export: - Name: SpringBootPetStoreApi diff --git a/samples/springboot3/pet-store-native/.gitignore b/samples/springboot3/pet-store-native/.gitignore deleted file mode 100644 index 549e00a2..00000000 --- a/samples/springboot3/pet-store-native/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar b/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index cb28b0e37c7d206feb564310fdeec0927af4123a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62547 zcmb5V1CS=sk~Z9!wr$(CZEL#U=Co~N+O}=mwr$(Cds^S@-Tij=#=rmlVk@E|Dyp8$ z$UKz?`Q$l@GN3=8fq)=^fVx`E)Pern1@-q?PE1vZPD);!LGdpP^)C$aAFx&{CzjH` zpQV9;fd0PyFPNN=yp*_@iYmRFcvOrKbU!1a*o)t$0ex(~3z5?bw11HQYW_uDngyer za60w&wz^`W&Z!0XSH^cLNR&k>%)Vr|$}(wfBzmSbuK^)dy#xr@_NZVszJASn12dw; z-KbI5yz=2awY0>OUF)&crfPu&tVl|!>g*#ur@K=$@8N05<_Mldg}X`N6O<~3|Dpk3 zRWb!e7z<{Mr96 z^C{%ROigEIapRGbFA5g4XoQAe_Y1ii3Ci!KV`?$ zZ2Hy1VP#hVp>OOqe~m|lo@^276Ik<~*6eRSOe;$wn_0@St#cJy}qI#RP= zHVMXyFYYX%T_k3MNbtOX{<*_6Htq*o|7~MkS|A|A|8AqKl!%zTirAJGz;R<3&F7_N z)uC9$9K1M-)g0#}tnM(lO2k~W&4xT7gshgZ1-y2Yo-q9Li7%zguh7W#kGfnjo7Cl6 z!^wTtP392HU0aVB!$cPHjdK}yi7xNMp+KVZy3_u}+lBCloJ&C?#NE@y$_{Uv83*iV zhDOcv`=|CiyQ5)C4fghUmxmwBP0fvuR>aV`bZ3{Q4&6-(M@5sHt0M(}WetqItGB1C zCU-)_n-VD;(6T1%0(@6%U`UgUwgJCCdXvI#f%79Elbg4^yucgfW1^ zNF!|C39SaXsqU9kIimX0vZ`U29)>O|Kfs*hXBXC;Cs9_Zos3%8lu)JGm~c19+j8Va z)~kFfHouwMbfRHJ``%9mLj_bCx!<)O9XNq&uH(>(Q0V7-gom7$kxSpjpPiYGG{IT8 zKdjoDkkMTL9-|vXDuUL=B-K)nVaSFd5TsX0v1C$ETE1Ajnhe9ept?d;xVCWMc$MbR zL{-oP*vjp_3%f0b8h!Qija6rzq~E!#7X~8^ZUb#@rnF~sG0hx^Ok?G9dwmit494OT z_WQzm_sR_#%|I`jx5(6aJYTLv;3U#e@*^jms9#~U`eHOZZEB~yn=4UA(=_U#pYn5e zeeaDmq-$-)&)5Y}h1zDbftv>|?GjQ=)qUw*^CkcAG#o%I8i186AbS@;qrezPCQYWHe=q-5zF>xO*Kk|VTZD;t={XqrKfR|{itr~k71VS?cBc=9zgeFbpeQf*Wad-tAW7(o ze6RbNeu31Uebi}b0>|=7ZjH*J+zSj8fy|+T)+X{N8Vv^d+USG3arWZ?pz)WD)VW}P z0!D>}01W#e@VWTL8w1m|h`D(EnHc*C5#1WK4G|C5ViXO$YzKfJkda# z2c2*qXI-StLW*7_c-%Dws+D#Kkv^gL!_=GMn?Y^0J7*3le!!fTzSux%=1T$O8oy8j z%)PQ9!O+>+y+Dw*r`*}y4SpUa21pWJ$gEDXCZg8L+B!pYWd8X;jRBQkN_b=#tb6Nx zVodM4k?gF&R&P=s`B3d@M5Qvr;1;i_w1AI=*rH(G1kVRMC`_nohm~Ie5^YWYqZMV2<`J* z`i)p799U_mcUjKYn!^T&hu7`Lw$PkddV&W(ni)y|9f}rGr|i-7nnfH6nyB$Q{(*Nv zZz@~rzWM#V@sjT3ewv9c`pP@xM6D!StnV@qCdO${loe(4Gy00NDF5&@Ku;h2P+Vh7 z(X6De$cX5@V}DHXG?K^6mV>XiT768Ee^ye&Cs=2yefVcFn|G zBz$~J(ld&1j@%`sBK^^0Gs$I$q9{R}!HhVu|B@Bhb29PF(%U6#P|T|{ughrfjB@s- zZ)nWbT=6f6aVyk86h(0{NqFg#_d-&q^A@E2l0Iu0(C1@^s6Y-G0r32qll>aW3cHP# zyH`KWu&2?XrIGVB6LOgb+$1zrsW>c2!a(2Y!TnGSAg(|akb#ROpk$~$h}jiY&nWEz zmMxk4&H$8yk(6GKOLQCx$Ji-5H%$Oo4l7~@gbHzNj;iC%_g-+`hCf=YA>Z&F)I1sI z%?Mm27>#i5b5x*U%#QE0wgsN|L73Qf%Mq)QW@O+)a;#mQN?b8e#X%wHbZyA_F+`P%-1SZVnTPPMermk1Rpm#(;z^tMJqwt zDMHw=^c9%?#BcjyPGZFlGOC12RN(i`QAez>VM4#BK&Tm~MZ_!#U8PR->|l+38rIqk zap{3_ei_txm=KL<4p_ukI`9GAEZ+--)Z%)I+9LYO!c|rF=Da5DE@8%g-Zb*O-z8Tv zzbvTzeUcYFgy{b)8Q6+BPl*C}p~DiX%RHMlZf;NmCH;xy=D6Ii;tGU~ zM?k;9X_E?)-wP|VRChb4LrAL*?XD6R2L(MxRFolr6GJ$C>Ihr*nv#lBU>Yklt`-bQ zr;5c(o}R!m4PRz=CnYcQv}m?O=CA(PWBW0?)UY)5d4Kf;8-HU@=xMnA#uw{g`hK{U zB-EQG%T-7FMuUQ;r2xgBi1w69b-Jk8Kujr>`C#&kw-kx_R_GLRC}oum#c{je^h&x9 zoEe)8uUX|SahpME4SEog-5X^wQE0^I!YEHlwawJ|l^^0kD)z{o4^I$Eha$5tzD*A8 zR<*lss4U5N*JCYl;sxBaQkB3M8VT|gXibxFR-NH4Hsmw|{={*Xk)%!$IeqpW&($DQ zuf$~fL+;QIaK?EUfKSX;Gpbm8{<=v#$SrH~P-it--v1kL>3SbJS@>hAE2x_k1-iK# zRN~My-v@dGN3E#c!V1(nOH>vJ{rcOVCx$5s7B?7EKe%B`bbx(8}km#t2a z1A~COG(S4C7~h~k+3;NkxdA4gbB7bRVbm%$DXK0TSBI=Ph6f+PA@$t){_NrRLb`jp zn1u=O0C8%&`rdQgO3kEi#QqiBQcBcbG3wqPrJ8+0r<`L0Co-n8y-NbWbx;}DTq@FD z1b)B$b>Nwx^2;+oIcgW(4I`5DeLE$mWYYc7#tishbd;Y!oQLxI>?6_zq7Ej)92xAZ z!D0mfl|v4EC<3(06V8m+BS)Vx90b=xBSTwTznptIbt5u5KD54$vwl|kp#RpZuJ*k) z>jw52JS&x)9&g3RDXGV zElux37>A=`#5(UuRx&d4qxrV<38_w?#plbw03l9>Nz$Y zZS;fNq6>cGvoASa2y(D&qR9_{@tVrnvduek+riBR#VCG|4Ne^w@mf2Y;-k90%V zpA6dVw|naH;pM~VAwLcQZ|pyTEr;_S2GpkB?7)+?cW{0yE$G43`viTn+^}IPNlDo3 zmE`*)*tFe^=p+a{a5xR;H0r=&!u9y)kYUv@;NUKZ)`u-KFTv0S&FTEQc;D3d|KEKSxirI9TtAWe#hvOXV z>807~TWI~^rL?)WMmi!T!j-vjsw@f11?#jNTu^cmjp!+A1f__Dw!7oqF>&r$V7gc< z?6D92h~Y?faUD+I8V!w~8Z%ws5S{20(AkaTZc>=z`ZK=>ik1td7Op#vAnD;8S zh<>2tmEZiSm-nEjuaWVE)aUXp$BumSS;qw#Xy7-yeq)(<{2G#ap8z)+lTi( ziMb-iig6!==yk zb6{;1hs`#qO5OJQlcJ|62g!?fbI^6v-(`tAQ%Drjcm!`-$%Q#@yw3pf`mXjN>=BSH z(Nftnf50zUUTK;htPt0ONKJq1_d0!a^g>DeNCNpoyZhsnch+s|jXg1!NnEv%li2yw zL}Y=P3u`S%Fj)lhWv0vF4}R;rh4&}2YB8B!|7^}a{#Oac|%oFdMToRrWxEIEN<0CG@_j#R4%R4i0$*6xzzr}^`rI!#y9Xkr{+Rt9G$*@ zQ}XJ+_dl^9@(QYdlXLIMI_Q2uSl>N9g*YXMjddFvVouadTFwyNOT0uG$p!rGF5*`1 z&xsKPj&;t10m&pdPv+LpZd$pyI_v1IJnMD%kWn{vY=O3k1sJRYwPoDV1S4OfVz4FB z$^ygjgHCW=ySKSsoSA&wSlq83JB+O-)s>>e@a{_FjB{@=AlrX7wq>JE=n@}@fba(;n4EG| zge1i)?NE@M@DC5eEv4; z#R~0aNssmFHANL@-eDq2_jFn=MXE9y>1FZH4&v<}vEdB6Kz^l)X%%X@E#4)ahB(KY zx8RH+1*6b|o1$_lRqi^)qoLs;eV5zkKSN;HDwJIx#ceKS!A$ZJ-BpJSc*zl+D~EM2 zm@Kpq2M*kX`;gES_Dd1Y#UH`i!#1HdehqP^{DA-AW^dV(UPu|O@Hvr>?X3^~=1iaRa~AVXbj z-yGL<(5}*)su2Tj#oIt+c6Gh}$0|sUYGGDzNMX+$Oi$e&UJt3&kwu)HX+XP{es(S3 z%9C9y({_fu>^BKjI7k;mZ4DKrdqxw`IM#8{Sh?X(6WE4S6-9M}U0&e32fV$2w{`19 zd=9JfCaYm@J$;nSG3(|byYDqh>c%`JW)W*Y0&K~g6)W?AvVP&DsF_6!fG3i%j^Q>R zR_j5@NguaZB{&XjXF+~6m|utO*pxq$8?0GjW0J-e6Lnf0c@}hvom8KOnirhjOM7!n zP#Iv^0_BqJI?hR5+Dl}p!7X}^NvFOCGvh9y*hgik<&X)3UcEBCdUr$Dt8?0f&LSur ze*n!(V(7umZ%UCS>Hf(g=}39OcvGbf2+D;OZ089m_nUbdCE0PXJfnyrIlLXGh2D!m zK=C#{JmoHY1ws47L0zeWkxxV=A%V8a&E^w%;fBp`PN_ndicD@oN?p?Bu~20>;h;W` ztV=hI*Ts$6JXOwOY?sOk_1xjzNYA#40dD}|js#3V{SLhPEkn5>Ma+cGQi*#`g-*g56Q&@!dg)|1YpLai3Bu8a;l2fnD6&)MZ~hS%&J}k z2p-wG=S|5YGy*Rcnm<9VIVq%~`Q{g(Vq4V)CP257v06=M2W|8AgZO0CC_}HVQ>`VU zy;2LDlG1iwIeMj?l40_`21Qsm?d=1~6f4@_&`lp~pIeXnR)wF0z7FH&wu~L~mfmMr zY4_w6tc{ZP&sa&Ui@UxZ*!UovRT})(p!GtQh~+AMZ6wcqMXM*4r@EaUdt>;Qs2Nt8 zDCJi#^Rwx|T|j_kZi6K!X>Ir%%UxaH>m6I9Yp;Sr;DKJ@{)dz4hpG>jX?>iiXzVQ0 zR$IzL8q11KPvIWIT{hU`TrFyI0YQh`#>J4XE*3;v^07C004~FC7TlRVVC}<}LC4h_ zZjZ)2*#)JyXPHcwte!}{y%i_!{^KwF9qzIRst@oUu~4m;1J_qR;Pz1KSI{rXY5_I_ z%gWC*%bNsb;v?>+TbM$qT`_U8{-g@egY=7+SN#(?RE<2nfrWrOn2OXK!ek7v`aDrH zxCoFHyA&@^@m+#Y(*cohQ4B76me;)(t}{#7?E$_u#1fv)vUE5K;jmlgYI0$Mo!*EA zf?dx$4L(?nyFbv|AF1kB!$P_q)wk1*@L0>mSC(A8f4Rgmv1HG;QDWFj<(1oz)JHr+cP|EPET zSD~QW&W(W?1PF-iZ()b|UrnB(#wG^NR!*X}t~OS-21dpXq)h)YcdA(1A`2nzVFax9rx~WuN=SVt`OIR=eE@$^9&Gx_HCfN= zI(V`)Jn+tJPF~mS?ED7#InwS&6OfH;qDzI_8@t>In6nl zo}q{Ds*cTG*w3CH{Mw9*Zs|iDH^KqmhlLp_+wfwIS24G z{c@fdgqy^Y)RNpI7va^nYr9;18t|j=AYDMpj)j1oNE;8+QQ)ap8O??lv%jbrb*a;} z?OvnGXbtE9zt;TOyWc|$9BeSGQbfNZR`o_C!kMr|mzFvN+5;g2TgFo8DzgS2kkuw@ z=`Gq?xbAPzyf3MQ^ZXp>Gx4GwPD))qv<1EreWT!S@H-IpO{TPP1se8Yv8f@Xw>B}Y z@#;egDL_+0WDA)AuP5@5Dyefuu&0g;P>ro9Qr>@2-VDrb(-whYxmWgkRGE(KC2LwS z;ya>ASBlDMtcZCCD8h+Awq1%A|Hbx)rpn`REck#(J^SbjiHXe-jBp!?>~DC7Wb?mC z_AN+^nOt;3tPnaRZBEpB6s|hCcFouWlA{3QJHP!EPBq1``CIsgMCYD#80(bsKpvwO)0#)1{ zos6v&9c=%W0G-T@9sfSLxeGZvnHk$SnHw57+5X4!u1dvH0YwOvuZ7M^2YOKra0dqR zD`K@MTs(k@h>VeI5UYI%n7#3L_WXVnpu$Vr-g}gEE>Y8ZQQsj_wbl&t6nj{;ga4q8SN#Z6cBZepMoyv7MF-tnnZp*(8jq848yZ zsG_fP$Y-rtCAPPI7QC^nzQjlk;p3tk88!1dJuEFZ!BoB;c!T>L>xSD<#+4X%*;_IB z0bZ%-SLOi5DV7uo{z}YLKHsOHfFIYlu8h(?gRs9@bbzk&dkvw*CWnV;GTAKOZfbY9 z(nKOTQ?fRRs(pr@KsUDq@*P`YUk4j=m?FIoIr)pHUCSE84|Qcf6GucZBRt;6oq_8Z zP^R{LRMo?8>5oaye)Jgg9?H}q?%m@2bBI!XOOP1B0s$%htwA&XuR`=chDc2)ebgna zFWvevD|V882V)@vt|>eeB+@<-L0^6NN%B5BREi8K=GwHVh6X>kCN+R3l{%oJw5g>F zrj$rp$9 zhepggNYDlBLM;Q*CB&%w zW+aY{Mj{=;Rc0dkUw~k)SwgT$RVEn+1QV;%<*FZg!1OcfOcLiF@~k$`IG|E8J0?R2 zk?iDGLR*b|9#WhNLtavx0&=Nx2NII{!@1T78VEA*I#65C`b5)8cGclxKQoVFM$P({ zLwJKo9!9xN4Q8a2F`xL&_>KZfN zOK?5jP%CT{^m4_jZahnn4DrqgTr%(e_({|z2`C2NrR6=v9 z*|55wrjpExm3M&wQ^P?rQPmkI9Z9jlcB~4IfYuLaBV95OGm#E|YwBvj5Z}L~f`&wc zrFo!zLX*C{d2}OGE{YCxyPDNV(%RZ7;;6oM*5a>5LmLy~_NIuhXTy-*>*^oo1L;`o zlY#igc#sXmsfGHA{Vu$lCq$&Ok|9~pSl5Q3csNqZc-!a;O@R$G28a@Sg#&gnrYFsk z&OjZtfIdsr%RV)bh>{>f883aoWuYCPDP{_)%yQhVdYh;6(EOO=;ztX1>n-LcOvCIr zKPLkb`WG2;>r)LTp!~AlXjf-Oe3k`Chvw$l7SB2bA=x3s$;;VTFL0QcHliysKd^*n zg-SNbtPnMAIBX7uiwi&vS)`dunX$}x)f=iwHH;OS6jZ9dYJ^wQ=F#j9U{wJ9eGH^#vzm$HIm->xSO>WQ~nwLYQ8FS|?l!vWL<%j1~P<+07ZMKkTqE0F*Oy1FchM z2(Nx-db%$WC~|loN~e!U`A4)V4@A|gPZh`TA18`yO1{ z(?VA_M6SYp-A#%JEppNHsV~kgW+*Ez=?H?GV!<$F^nOd+SZX(f0IoC#@A=TDv4B2M z%G-laS}yqR0f+qnYW_e7E;5$Q!eO-%XWZML++hz$Xaq@c%2&ognqB2%k;Cs!WA6vl z{6s3fwj*0Q_odHNXd(8234^=Asmc0#8ChzaSyIeCkO(wxqC=R`cZY1|TSK)EYx{W9 z!YXa8GER#Hx<^$eY>{d;u8*+0ocvY0f#D-}KO!`zyDD$%z1*2KI>T+Xmp)%%7c$P< zvTF;ea#Zfzz51>&s<=tS74(t=Hm0dIncn~&zaxiohmQn>6x`R+%vT%~Dhc%RQ=Cj^ z&%gxxQo!zAsu6Z+Ud#P!%3is<%*dJXe!*wZ-yidw|zw|C`cR z`fiF^(yZt?p{ZX|8Ita)UC$=fg6wOve?w+8ww|^7OQ0d zN(3dmJ@mV8>74I$kQl8NM%aC+2l?ZQ2pqkMs{&q(|4hwNM z^xYnjj)q6uAK@m|H$g2ARS2($e9aqGYlEED9sT?~{isH3Sk}kjmZ05Atkgh^M6VNP zX7@!i@k$yRsDK8RA1iqi0}#Phs7y(bKYAQbO9y=~10?8cXtIC4@gF#xZS;y3mAI`h zZ^VmqwJ%W>kisQ!J6R?Zjcgar;Il%$jI*@y)B+fn^53jQd0`)=C~w%Lo?qw!q3fVi{~2arObUM{s=q)hgBn64~)W0tyi?(vlFb z>tCE=B1cbfyY=V38fUGN(#vmn1aY!@v_c70}pa(Lrle-(-SH8Nd!emQF zf3kz0cE~KzB%37B24|e=l4)L}g1AF@v%J*A;5F7li!>I0`lfO9TR+ak`xyqWnj5iwJ$>t_vp(bet2p(jRD;5Q9x2*`|FA4#5cfo8SF@cW zeO{H7C0_YJ*P@_BEvm2dB}pUDYXq@G1^Ee#NY9Q`l`$BUXb01#lmQk^{g3?aaP~(* zD;INgi#8TDZ&*@ZKhx$jA^H-H1Lp`%`O{Y{@_o!+7ST}{Ng^P;X>~Bci{|Qdf1{}p z_kK+zL;>D30r6~R?|h!5NKYOi6X&I5)|ME+NG>d9^`hxKpU^)KBOpZiU^ z;|SzGWtbaclC-%9(zR-|q}kB8H&($nsB1LPAkgcm+Qs@cAov{IXxo5PHrH(8DuEMb z3_R#>7^jjGeS7$!`}m8!8$z|)I~{dhd)SvoH9oR9#LjO{{8O&r7w{d9V1z^syn&E6 z{DG0vlQF_Yb3*|>RzVop^{$mWp|%NDYj@4{d*-@O^<(=L=DMFIQHEp-dtz@1Rumd; zadt^4B#(uUyM6aeUJkGl0GfaULpR!2Ql&q$nEV^+SiDptdPbuJ=VJ)`czZ@&HPUuj zc5dSRB&xk)dI~;6N?wkzI}}4K3i%I=EnlKGpPJ9hu?mNzH7|H0j(mN3(ubdaps3GM z1i+9gk=!$mH=L#LRDf4!mXw0;uxSUIXhl|#h*uK+fQPilJc8RCK9GNPt=X^8`*;3$ zBBo77gkGB5F8a8)*OR10nK&~8CEMPVQyhY>i`PS{L^-*WAz$ljtU%zlG1lm%%U4Zw zms0oZR8b|`>4U1X*9JLQQ>m9MF5%ppoafz^;`7DbmmIENrc$hucekkE4I83WhT%(9 zMaE;f7`g4B#vl(#tNP8$3q{$&oY*oa0HLX6D?xTW3M6f<^{%CK4OE1Pmfue`M6Dh= z&Z-zrq$^xhP%|hU&)(+2KSSpeHgX^0?gRZ5wA8@%%9~@|*Ylux1M{WQ4ekG(T+_b` zb6I)QRGp%fRF)^T?i^j&JDBhfNU9?>Sl6WVMM%S?7< ze|4gaDbPooB=F4Y=>~_+y~Q1{Ox@%q>v+_ZIOfnz5y+qy zhi+^!CE*Lv-}>g^%G=bGLqD(aTN;yHDBH#tOC=X02}QU~Xdme``Wn>N>6{VwgU~Z>g+0 zxv0`>>iSfu$baHMw8(^FL6QWe;}(U>@;8j)t)yHAOj?SdeH;evFx-kpU@nT>lsrUt zqhV}2pD^5bC4786guG1`5|fK@pE6xcT#ns)vR|^?A08G62teHaE&p`ZrCBj_Swt*~dVt=5*RK6Y{% zABqK$X59BnrK3r3u=wxklRnA1uh+q`?T0kE1YhvDWF4OY#<(+V|R@R%tdkq2huF(!Ip+EpZF3zr*|9pmKHPo)Cu z;H+^s&`Ql}u=Jt~ZWj`bAw|i-3#7(2WuRU3DU{BW8`?!O?YO1M$*MMTsaEM!5Jyp~ z!gp6yR4$O%wQ8%dyz43ZPeoJwy;o;yg=S0^Y}%|)to>=N^`!3VMf1~}OZ`Dl$q&|w z9$!i3!i1uAgPTuKSWdBrDr*N$g=E#mdqfj*h;Z}OG`{n245+g;IKfdn!&gF2OtHaD zyGDzj@@d2!P(_Ux)3v;1ABTj__{w*kaRF-1YVU`})Acgk?(T*1YqEve3=5)8bkZK* z!Tus*e$h@^u z>#zV0771Bix~r&h2FJ9)%N{>s>?2tk1$bId)1#G;OKgn-U8jUo^AK;Hu)hQEi}swD(264kAS-SBCD$R(Ro0rh8~Le zzRwxbz_JHDbD+hTX15AWmVw!#rC)-zeZahQQmo6FG1)ah3uuyIuTMof}RO!`Y3^Fxn_-G$23RDOh(@NU?r6`*S?#E50)w zpcsgDZ-iO{;EesgDQq9;p*C#QH(sp~2w^zAJWaUL%@yo)iIL6y8;e_}=dwQc%k%;H zFt5lenH*`}LWd+fPqi;exJeRZgl&nLR%|a!%1x0RQ54cgyWBYrL>sskcAtPxi&8c( zw_K?sI*3n%S;lKiYpveBN08{rgV&-B1NN5Jiu07~%n#%&f!(R(z1)xsxtRBkg#+Lv zh21zX?aYDd_f}qdA`Os*j!eC<5)iUJ&Twj7?*p%vEOGElGhpRZsccM!<k}DeC;TY;rULQs3e}lZyP#UVb=6 zB$Dkm2FaHWUXr7<{R&46sfZ)&(HXxB_=e`%LZci`s7L6c-L7iF&wdmTJz`*^=jD~* zpOZ@jcq8LezVkE^M6D9^QgZqnX&x*mr1_Cf#R9R3&{i3%v#}V$UZzGC;Or*=Dw5SXBC6NV|sGZp^#%RTimyaj@!ZuyJ z6C+r}O1TsAzV9PAa*Gd!9#FQMl)ZLHzTr99biAqA(dz-m9LeIeKny3YB=*+|#-Gq# zaErUR5Z*Wh^e<+wcm70eW;f-g=YTbMiDX)AznDM6B73)T4r%nq+*hKcKF?)#vbv?K zPMe=sFCuC*ZqsBPh-?g!m*O`}6<}Pfj}Y1n9|Y@cUdD5GX_)6Sx9pPfS7 zxkt?g6ZwJ+50C7qrh6dMFmr7qah`FskT_H=GC92vkVh$WfZa2%5L99_DxyM{$#6HQ zx$VR-Wwt!q9JL2{ybEGJr$^?!V4m_BqDqt!mbs=QjHf340+^a{)waVvP0+98(BA$M ztWr&sM=juyYgvf`(SC}+y@QtYgU>0ghJ6VbU}|kEraR&&W%#;!#KI?le%g`e>ZVPiDrneh#&1(Y?uiMo^f5qo@{JEr(p9>8GhDa+PC9yG;lX+D?hQ^fZB&Sdox219zUj_5;+n<0@Wi3@DK`MU8FM!OFJ z8*_mTA-u!Ab#95FRVWTIqAL#BVQGxE_s?>Ql|@0o9vos&r<_4d!+Q6(_270)6#lu$ zV!j$a?_V0I<(3Z=J7C-K0a^Kc1Go9p&T6yQeAD+)dG-$a&%Fo0AOte~_Z&_m2@ue~ z9cKFf-A41Dz31Ooj9FSR`l?H5UtdP?JS=UU$jF#znE1k@0g%K?KQuwZkfDI3Ai)(q z#x_Yo6WR_Y@#6I_02S&NpcP<%sw!!M_3#*8qa+*4rS@x=i{-2K#*Qr)*Q$-{<_(<| z0730e+rubnT38*m;|$-4!1r6u&Ua2kO_s-(7*NGgDTe##%I>_9uW;X__b_k)xlv$; zW%K2hsmr>5e^Z~`tS-eUgWmSF9}Yg8E}qydSVX0nYZMX_x94QK?tw2>^;raVTqstR zIrNAX2`X~|h->dTOb9IrA!i5INpLV}99ES|i0ldzC`;R$FBY5&7+TIy8%GO8SZ37_ zw=^Swk?z+j-&0-cTE|LU0q@IKRa&C6ZlXbSa2vN5r-)*f<3{wLV*uJUw980AFkWN7 zKh{?97GmVu-0rs9FB6ludy|n`gN5p~?y51aJzBg6#+-=0pWdZ2n4xTiQ=&3As-!-6 zFlb|ssAJEJL#s8(=odfz8^9b#@RrvNE4gjuEITzAd7R4+rq$yEJKXP?6D@yM7xZ&^ z@%jnE3}bteJo{p(l`hu`Yvzg9I#~>(T;>c;ufeLfc!m3D&RaQS=gAtEO-WbI+f_#| zaVpq-<%~=27U8*qlVCuI6z9@j)#R!z3{jc>&I(qT-8IBW57_$z5Qm3gVC1TcWJNc% zDk?H3%QHno@fu9nT%L^K)=#sRiRNg|=%M zR;8BE)QA4#Dsg^EakzttRg9pkfIrF3iVYVM#*_+#3X+~qeZc^WQJvEyVlO@9=0pl!ayNOh|{j0j^a z+zi_$_0QKhwArW)sJ$wji;A`?$ecbr?(4x5%2pLgh#wggbt)#T^2R3a9m+>GcrUxU z*u-WTgHAN*e!0;Wa%1k)J_P(Vdp>vwrROTVae@6Wn04q4JL-)g&bWO6PWGuN2Q*s9 zn47Q2bIn4=!P1k0jN_U#+`Ah59zRD??jY?s;U;k@%q87=dM*_yvLN0->qswJWb zImaj{Ah&`)C$u#E0mfZh;iyyWNyEg;w0v%QS5 zGXqad{`>!XZJ%+nT+DiVm;lahOGmZyeqJ-;D&!S3d%CQS4ZFM zkzq5U^O|vIsU_erz_^^$|D0E3(i*&fF-fN}8!k3ugsUmW1{&dgnk!|>z2At?h^^T@ zWN_|`?#UM!FwqmSAgD6Hw%VM|fEAlhIA~^S@d@o<`-sxtE(|<><#76_5^l)Xr|l}Q zd@7Fa8Bj1ICqcy2fKl1rD4TYd84)PG5Ee2W4Nt@NNmpJWvc3q@@*c;~%^Vasf2H`y z+~U-19wtFT?@yIFc4SE_ab?s@wEUfSkOED}+qVjjy>=eac2^S^+|_3%cjH%EUTJ&r znp9q?RbStJcT*Vi{3KDa^jr4>{5x+?!1)8c2SqiCEzE$TQ+`3KPQQnG8_Qk<^)y_o zt1Q^f{#yCUt!1e(3;E6y?>p+7sGAYLp`lA3c~Y`re9q&`c6>0?c0E2Ap5seFv92#X z1Vldj!7A8@8tWr&?%;EBQ_Fwd)8A3!wIx`V!~~h(!$pCy7=&*+*uIzG@*d%*{qG#4 zX0^}}sRN^N=p{w(+yjv%xwb!%lnVTE7l1l6gJwQmq_G83J&Y98$S!r*L8}IiIa2E= zE!0tbOuEDb*No0-KB{zjo1k#_4FHtr{!)>o+Y@bll}Sa6D^xktI0H&l{jKAK)A(iz zB-N00F?~Z}Y7tG+vp)-q*v71(C}65$-=uXx^|R$xx9zZip-V>Hqeyfd(wteM)+!!H z$s+>g4I@+`h2>C|J;PhvtOq)`xm4;CyF}R<)!ma3T{Vf_5|zo;D4YI4ZDBkE(vMeE zb#ZV;n}CgA0w8x!UC2&5Z(K)9bibj#?~>R(72lFx_Am~jS?;7mo~p+05~XGD+(wV4 zEVYnf0N5+-7O+Gc1L!sPGUHv<6=cV8}*m$m`kBs@z zy;goR(?J^JrB7uXXpD00+SD0luk!vK3wwp(N%|X!HmO{xC#OMYQ&a7Yqv-54iEUK4 zVH;)rY6)pUX~ESvQK^w|&}>J{I?YlvOhpMgt-JB}m5Br`Q9X+^8+Xa%S81hO<1t#h zbS+MljFP1J0GGNR1}KwE=cfey%;@n&@Kli+Z5d>daJjbvuO3dW{r$1FT0j zR$c9$t~P50P+NhG^krLH%k}wsQ%mm+@#c;-c9>rYy;8#(jZ|KA8RrmnN2~>w0ciU7 zGiLC?Q^{^Ox-9F()RE^>Xq(MAbGaT0^6jc>M5^*&uc@YGt5Iw4i{6_z5}H$oO`arY z4BT(POK%DnxbH>P$A;OWPb@gYS96F7`jTn6JO@hdM za>_p!1mf?ULJZb1w-+HamqN__2CtI%VK`k^(++Ga0%z*z@k0wYJDqT^)~%|4O299; zh1_iRtc7you(kOK8?Q$R7v-@Qk4+i=8GD2_zI0%{Ra`_prF{+UPW^m5MCA&4ZUpZb z2*!)KA8b--Upp~U%f+rsmCmV~!Y>Gzl#yVvZER2h;f&rkdx{r#9mc8DZMJaQXs?SL zCg3#>xR6ve8&YkP*`Z=lng|Ow+h@t*!Ial*XQg3P;VS8@E1C)VS`?L9N+rxlD7bxC z3@Ag)Vu?#ykY`ND+GvRYTUP&-KDMiqly$Z~uFXt^)4Jjk9RIs*&$?-UPM*d7&m${m zm12kaN3mV1J|c6f$>V+{lvHp~XVW3DU0;cBR>7|)4bo{xa1-ts-lYU-Q-b)_fVVl`EP5X}+J9EzT20x8XIv=m7witdu7!3Lh=KE#OyKpT1GWk{YAo^ny|fvZt<+jmsFs=l*%e& zmRkBt5ccv4O7!HAyv2~rsq*(FmMTm?@TX3&1`nu|7C^F{ad%GLuoX}Rl}6`)uHF_xlx^gVca+mGH4T8u8;q{S*x3=j;kelz^atO~)v!Q_BT z4H6%IA}bvfuk0_vweELeEl8N5w-Q1GF!@f{VKnbyYB2?}d&QvI-j}~RI_+9t9$tC2 z94m=3eLi=sQb^S5;fqP?3aaXc&`}`lq z&M8dOXvxx9Y1^u_ZQHhO+qP}nwkvJhwoz$Mp6Qcq^7M#eWm}!3U@s07hop` zW24|J{t$aB`W>uBTssEvYMyi$hkaOqWh+^(RV_1MYnE0XPgW?7sBDk=Cqs(;$qrPEflqa0ZE?A3cBfW%0RPA235Wb6@=R_d>Sez; z`spwa50bq?-zh+id~Q!T`AYn`$GHzs;jxIw(A1_Ql&f|qP}|bon#H;sjKmSDM!nyn z>bU8l%3DB3F+$}|J^da!!pN|DO!Ndc2J)wMk!+Rr1hes#V}5o(?(yQSphn|9_aU<- zn|nsDS{^x&tweP;Ft`2ur>Koo2IdXJDsr6IN)7vB41Yy-^Wbo9*2th2QA@C zE0-0Gk12YOO?d_Guu6b3&(PIL`d zh4{`k54hu9o%v1K3PGuccez-wdC<&2fp)>`qIIaf)R{5un7-vwm=>LD7ibnJ$|KyE zzw`X*tM0S|V(I3vf454PY{yA5lbE+36_<1kd=&0Xy4jfvUKZ0$Jq!AG4KS7DrE9rph;dK^6*#CIU9qu7 z?)6O`TN&MCWGmUVd1@E2ow2`vZ1A#nGo8_n!dmX77DCgAP1va*ILU+!a&$zdm6Pa6 z4#|*&3dM+r_RJb%!0}7X!An&T4a4@ejqNJ;=1YVQ{J6|oURuj8MBZ8i7l=zz%S4-; zL}=M^wU43lZVwNJgN|#xIfo$aZfY#odZ6~z?aNn=oR1@zDb=a(o3w`IGu&j>6lYxL z&MtqINe4Z>bdsHNkVIu$Dbq0wc#X-xev221e~L zbm8kJ(Xzij$gF4Ij0(yuR?H1hShSy@{WXsHyKtAedk4O!IdpR{E32Oqp{1TD{usJi zGG@{3A$x%R*pp8b$RQo4w&eDhN`&b~iZ2m3U>@9p1o5kXoEVmHX7I6Uw4dn((mFw` zilWrqFd=F5sH$&*(eJB52zaLwRe zz`sruIc=Ck75>v5P5kd>B2u=drvGPg6s&k5^W!%CDxtRO)V6_Y_QP{%7B>E~vyMLG zhrfn8kijyK&bX+rZsnSJ26!j$1x+V!Pyn|ph%sXWr9^f&lf|C;+I^Fi_4;`-LJI&F zr;5O@#4jZX=Yaw0`pUyfF4J8A9wE#7_9!X|_s8~YUzWu&#E^%4NxUA3*jK-F5R3LP2|msHBLmiMIzVpPAEX)2 zLKYjm3VI4r#7|nP^}-}rL+Q4?LqlmBnbL+R8P%8VmV{`wP0=~2)LptW_i682*sUR# z+EifOk_cWVKg-iWr^Qf4cs^3&@BFRC6n0vu{HqZzNqW1{m)3K@gi$i}O(hT`f#bT- z8PqCdSj~FncPNmMKl9i9QPH1OMhvd42zLL~qWVup#nIJRg_?7KQ-g3jGTt5ywN;Qx zwmz4dddJYIOsC8VqC2R%NQ>zm=PJH70kS|EsEB>2Otmtf-18`jUGA6kMZL3vEASDN zNX%?0+=vgsUz!dxZ@~)eU17m4pN3xGC0T;#a@b9Iu0g_v*a3|ck^s_DVA^%yH-wt= zm1)7&q6&Rq#)nc9PQ6DKD{NU=&ul10rTiIe!)x^PS~=K(wX9|?k&{Mv&S$iL9@H7= zG0w~UxKXLF003zJ-H%fGA4Db9{~#p&Bl7ki^SWwv2sfoAlrLMvza)uh;7Aa_@FL4b z4G>`j5Mn9e5JrrN#R$wiB(!6@lU@49(tawM&oma6lB$-^!Pmmo;&j57CDmKi)yesg~P;lJPy9D(!;n;^1ql)$5uYf~f z&GywSWx=ABov_%8pCx=g-gww_u26?5st=rdeExu?5dvj^C?ZZxDv@Si^nX~2qA&K= z2jr;{=L(x~9GLXrIGXs>dehU^D}_NMCMegdtNVWyx)8xHT6Qu!R>?%@RvADs9er;NMkweUBFNrBm1F5e0_>^%CwM6ui}K_MpRqLS0*@lAcj zB6TTCBv>w2qh)qU3*kN+6tPmMQx|5Z0A4n67U-nss90Ec_rDF}r)IR4PE{$8;BSt= zT%6|jyD^(w6a*A5>_|TkMqx~e$n@8{`q?|)Q&Y4UWcI!yP-8AwBQ#P`%M&ib;}pli z9KAPU_9txQ3zOM#(x}*lN8q$2(Tq1yT4RN0!t~|&RdQMXfm!81d0ZuyD}aG3r4+g` z8Aevs3E_ssRAMR+&*Q30M!J5&o%^(3$ZJ=PLZ9<@x^0nb>dm17;8EQJE>hLgR(Wc% zn_LXw|5=b$6%X zS~ClDAZ?wdQrtKcV9>_v1_IXqy)?<@cGGq#!H`DNOE1hb4*P_@tGbMy6r@iCN=NiA zL1jLwuMw&N-e9H(v7>HGwqegSgD{GSzZ@sZ?g5Y`fuZ^X2hL=qeFO(;u|QZl1|HmW zYv+kq#fq_Kzr_LaezT zqIkG6R+ve#k6!xy*}@Kz@jcRaG9g|~j5fAYegGOE0k8+qtF?EgI99h*W}Cw z7TP&T0tz4QxiW!r zF4?|!WiNo=$ZCyrom-ep7y}(MVWOWxL+9?AlhX<>p||=VzvX`lUX(EdR^e5m%Rp_q zim6JL6{>S%OKoX(0FS>c1zY|;&!%i-sSE>ybYX3&^>zb`NPj7?N^ydh=s=0fpyyz% zraFILQ17_9<ettJJt~I+sl=&CPHwz zC9dEb#QFQcY?bk11Y=tEl{t+2IG`QFmYS>ECl;kv=N6&_xJLQt>}ZQiFSf+!D*4Ar zGJ~LFB7e_2AQaxg*h{$!eJ6=smO(d2ZNmwzcy3OG@)kNymCWS44|>fP^7QkJHkE9JmLryhcxFASKb4GYkJ|u^Fj=VdF0%6kgKllkt zC|_ov2R4cJ2QjjYjT6jE#J1J<xaNC>Xm;0SX<`LuW*}*{yQ3c9{Zl=<9NP z^2g5rAdO!-b4XfeBrXa4f{M0&VDrq+ps&2C8FYl@S59?edhp~7ee>GR$zQI4r8ONi zP^OA+8zrTAxOMx5ZBS03RS@J_V`3{QsOxznx6Yt*$IuEd3%R|Ki&zZkjNvrxlPD$m z%K+rwM!`E&Z46ogXCu!3 z8use`FJJ?g_xi?~?MxZYXEu=F=XTC8P3{W*CbG3Wk)^31nD~W>*cJ@W4xg%Qqo7rq z`pUu8wL!6Cm~@niI*YmQ+NbldAlQRh?L!)upVZ)|1{2;0gh38FD&8h#V{7tR&&J}I zX1?;dBqK}5XVyv;l(%?@IVMYj3lL4r)Wx9$<99}{B92UthUfHW3DvGth^Q0-=kcJ1 z!*I9xYAc$5N$~rXV>_VzPVv`6CeX(A_j3*ZkeB~lor#8O-k+0OOYzTkri@PVRRpOP zmBV|NKlJT?y4Q82er)@lK&P%CeLbRw8f+ZC9R)twg5ayJ-Va!hbpPlhs?>297lC8 zvD*WtsmSS{t{}hMPS;JjNf)`_WzqoEt~Pd0T;+_0g*?p=dEQ0#Aemzg_czxPUspzI z^H5oelpi$Z{#zG$emQJ#$q#|K%a0_x5`|;7XGMuQ7lQB9zsnh6b75B9@>ZatHR_6c z0(k}`kfHic{V|@;ghTu>UOZ_jFClp>UT#piDniL(5ZNYXWeW0VRfBerxamg4su5<; z(}Ct2AhR@I-ro0}DdZLRtgI@dm+V`cRZjgV-H+aXm5|Mgz`aZX63i<|oHk-E)cABn z0$NR?(>fla7)Ong28FZSi9Yk0LtYl5lZw5wT!K5=fYT$avgkMKJWx~V#i@7~6_{dM zxDDPIW2l{O2Elv#i^cjYg~lGHRj(W*9gD`(FILKY$R`tL2qo&rtU*c;li!V`O$aV{ z!m|n!FAB2>MR_FVN*Ktv5+2dW4rr3YmfEheyD+48%USM#q6)w%#2}~=5yZE1LLcth zF%VtefH&#AcMx7)JNC$P>~OFuG6sK}F7V$D7m!{ixz&inpAVpFXiu^QruAw@Sc7Y2 z_A^V(2W_+KTGRp2aQSMAgyV#b3@{?5q@hPEP6oF3^}|@8GuD6iKbX;!LI!L=P#Za zL$Zuv#=x3fseRMZ()#SQcXv->xW`C|6quwqL1M&KByBj z2V`}(uL4JB-hUs6304@%QL~S6VF^6ZI=e-Nm9Tc^7gWLd*HM-^S&0d1NuObw-Y3e> zqSXR3>u^~aDQx>tHzn9x?XRk}+__h_LvS~3Fa`#+m*MB9qG(g(GY-^;wO|i#x^?CR zVsOitW{)5m7YV{kb&Z!eXmI}pxP_^kI{}#_ zgjaG)(y7RO*u`io)9E{kXo@kDHrbP;mO`v2Hei32u~HxyuS)acL!R(MUiOKsKCRtv z#H4&dEtrDz|MLy<&(dV!`Pr-J2RVuX1OUME@1%*GzLOchqoc94!9QF$QnrTrRzl`K zYz}h+XD4&p|5Pg33fh+ch;6#w*H5`@6xA;;S5)H>i$}ii2d*l_1qHxY`L3g=t? z!-H0J5>kDt$4DQ{@V3$htxCI;N+$d^K^ad8q~&)NCV6wa5(D${P!Y2w(XF!8d0GpJ zRa=xLRQ;=8`J2+A334};LOIhU`HQ*0v4Upn?w|sciL|{AJSrG_(%-(W9EZb%>EAGG zpDY?z1rQLps`nbCtzqJ#@wxU4}(j!ZQ{`g`g*SXlLah*W9 zyuh)UWoRCknQtd~Lk#BT_qjwj&Kw8U)w=owaJ;A5ae}3)y>{neYNS`|VHJdcSEBF# zBJ6a;T)u;^i#L~LVF-X7!E$SggILXMlsEy~v}K*DM2)f@U~g|Q6I-Pss@)`>fgFWx zsq&7pe!|VA-h;@=fBF{(mR1^{1>ukTYUdyF^#A+(|I_&nm{_xaKn3h4&yMyym2k-wMFg(s@ez=DPmuB%`| z6;e@HQKB(|!PU1sW)W6~x|=8m6rL~4dQ9LTk|RzL-_(_77B4I~ZG=q7K%qHiv!FD8 zmt;Vnhb{ymaydv2V;X-5p zTt2ln?kaB9&(dH_X70^@rrCfz)nwfa9LYTHXO(IPcTEf$QiEhTpl??L+`Eetyqof8 zzl=q)?KdYni!C_9b8Z3xm7r5<5ZG-0uA`u^7Dm7k4mAsQ(rkoWy*^DZJa~#y6+hNG zh?7{D9$a9LS`a@SvZ5?C{JUHovWU9KI}z8YV4pWftx21v*Q;MpU{+b@>Or(}pwO^fu0qA3_k_Bo2}lIxvmMhucG-o>O=+R6YxZ zjs!o%K1AA*q#&bs@~%YA@C;}?!7yIml1`%lT3Cvq4)%A)U0o1)7HM;mm4-ZZK2`Lj zLo?!Kq1G1y1lk>$U~_tOW=%XFoyIui^Cdk511&V}x#n4JeB7>bpQkYIkpGQRHxH$L z%tS=WHC~upIXSem>=TTv?BLsQ37AO88(X+L1bI<;Bt>eY!}wjYoBn#2RGEP49&ZH-Z_}R_JK_ z>o*_y!pOI6?Vf*{x-XT;^(_0}2twfk`*)_lLl0H-g|}BC?dm7CU|^-gNJ~rx z($>97WTKf71$?2|V$Ybpf~Aj@ZZOcb3#uRq51%4^ts-#RMrJhgm|K3QpCsPGW=2dZ zAr5-HYX!D*o#Q&2;jL%X?0{}yH}j*(JC4ck;u%=a_D6CrXyBIM&O#7QWgc?@7MCsY zfH6&xgQmG$U6Miu$iF(*6d8Mq3Z+en_Fi`6VFF=i6L8+;Hr6J zmT=k0A2T{9Ghh9@)|G5R-<3A|qe_a#ipsFs6Yd!}Lcdl8k)I22-)F^4O&GP&1ljl~ z!REpRoer@}YTSWM&mueNci|^H?GbJcfC_Y@?Y+e4Yw?Qoy@VLy_8u2d#0W~C6j(pe zyO6SqpGhB-;)%3lwMGseMkWH0EgErnd9a_pLaxbWJug8$meJoY@o-5kNv&A$MJZ=U z^fXPLqV6m3#x%4V*OYD zUPS&WHikdN<{#Yj|EFQ`UojD4`Zh*CZO4Cv`w^&*FfqBi`iXsWg%%a< zk@*c%j1+xib(4q^nHHO^y5d8iNkvczbqZ5;^ZVu%*PJ!O?X-CoNP*&tOU!5%bwUEw zQN?P*a=KKlu{`7GoA}DE=#nDibRgecw>-*da~7&wgow}|DyCJq!-Lp8a~(zR@tO1 zgu(4s4HptPGn(HmN2ayYs@g+yx1n`nU3KM{tQHhMHBw7f#gwru$=C()`aKZAl^dYc ze7fC)8EZEXOryk6AD&-4L+4cJ&M@3;;{R)mi4=`ti7IZByr^|_HNsjcNFu?mIE)jD za2j)FPwRY!R_YR-P?URm0Pti*e#5jmfK)6EvaKCT{h)kbJl{AGr1Ekt}pG?^e z*botRf-RsB8q10BTroj{ZP**)2zkXTF+{9<4@$aNDreO7%tttKkR3z`3ljd?heAJEe<0%4zYK?};Ur*!a>PbGYFFi(OF-%wyzbKeBdbkjv^i9mn@UocSS z4;J%-Q$l`zb&r*Pb`U;3@qkc=8QaPE9KwmlVwAf01sa*uI2*N`9U^3*1lLsM9dJ(4 zZBkU}os|5YT#Z;PD8xVv!yo$-n{-n4JM5ukjnTciniiT`(cZ6sD6~67e5_?8am%!w zeCLUxq~7x-!Xg#PgKV&caC@7mu<86am{WaXo(lAemt4~I$utSp(URWpYNo$RvU*$N z#%iiA+h`(E;BUg;=I!#EaxO89bUK3*v5Nc3GPmURC5TqzC|))DsFNtJICH6oBW6#q z+B(N{ey+^mk_{!@ z)VhAWXG=_0j|0f9iJ;c404PiIFqK)(AD05Xh`Fk`r$^b`v+>*g+_+h@r)e+ELJ45) z?20~u<}HQyQ5AsBz(teF9!!_GLXnm{5Z0e{Ki*@!=&3x4-RcjBn##DDzHJ|KSZ5(E z9=tFZ)p~-}x%9sCY27)2i>(E-^OiYT?_)a;yXAGR$y+E`myMd;xDA#_Q49t*E}&ql#H~|x z2J2R1_#2lt91NnF!uqW%_=HlbF?A{B{n>}9$g5QF!bh_a7LTU~Jyz}7>W5{_LAov{ zy2_dmGy)d)&7^bJyUjEw%3xj{cuG0Eo zwL*XQB*Oi=r&HIIecC1%lbE;Y-*5|cL955S+2@uR18JDL<0;;Uc2Q9JEyo1R!!sz_ z#BqnkGfbLP#oQJk3y}nwMd(3Tt^PVA#zXnYF7D0W1)#+`i?@cm}fBkKD z+Mpcuim53|v7;8Tv(KraEyOK`HvJq^;rlNzOjIbW&HJDFqW>doN&j7)`RDv#v|PQ+ z03WnB4Y4X@Fe-@%3;He*FjY1MFmkyv0>64Cp~FIDKQTwmFP~_CxZOf{8gPy}I<=JC zo%_bmue&$UU0|GG%%99eI!m#5Y1MD3AsJqG#gt3u{%sj5&tQ&xZpP%fcKdYPtr<3$ zAeqgZ=vdjA;Xi##r%!J+yhK)TDP3%C7Y#J|&N^))dRk&qJSU*b;1W%t1;j#2{l~#{ zo8QYEny2AY>N{z4S6|uBzYp>7nP_tqX#!DfgQfeY6CO7ZRJ10&$5Rc+BEPb{ns!Bi z`y;v{>LQheel`}&OniUiNtQv@;EQP5iR&MitbPCYvoZgL76Tqu#lruAI`#g9F#j!= z^FLRVg0?m$=BCaL`u{ZnNKV>N`O$SuDvY`AoyfIzL9~ zo|bs1ADoXMr{tRGL% zA#cLu%kuMrYQXJq8(&qS|UYUxdCla(;SJLYIdQp)1luCxniVg~duy zUTPo9%ev2~W}Vbm-*=!DKv$%TktO$2rF~7-W-{ODp{sL%yQY_tcupR@HlA0f#^1l8 zbi>MV~o zz)zl1a?sGv)E}kP$4v3CQgTjpSJo?s>_$e>s2i+M^D5EfrwjFAo(8E%(^ROV0vz0o z-cg0jIk24n!wxZainfH)+?MGu@kg$XgaMY-^H}z^vG~XC7z2;p2Kv`b^3S#b5ssMOJ7724v>S36dD zeypxJ<=E~sD4f5wX060RIF-AR0#{Z z=&y$r8A-e6q18lIF{@O9Mi%dYSYT6erw!@zrl=uj>o(3=M*Bg4E$#bLhNUPO+Mn}>+IVN-`>5gM7tT7jre|&*_t;Tpk%PJL z%$qScr*q7OJ6?p&;VjEZ&*A;wHv2GdJ+fE;d(Qj#pmf2WL5#s^ZrXYC8x7)>5vq_7 zMCL}T{jNMA5`}6P5#PaMJDB2~TVt;!yEP)WEDAoi9PUt89S2Cj?+E0V(=_sv4Vn6b z_kS6~X!G;PKK>vZF@gWpg8Zuh%YX^2UYPdCg7?EH#^gkdOWpy(%RnXyyrhmJT~UJw zAR;%Zgb6z(mS+o9MT|Sc6O({!i0pzk;s9?Dq)%tTW3*XdM3zhPn*`z45$Bg!P4xfy zD*{>30*JsSk?bQ-DgG62v>Vw-w`SA}{*Za7%N(d-mr@~xq5&OvPa*F2Q3Mqzzf%Oe z4N$`+<=;f5_$9nBd=PhPRU>9_2N8M`tT<-fcvc&!qkoAo4J{e3&;6(YoF8Wd&A+>; z|MSKXb~83~{=byCWHm57tRs{!AI<5papN(zKssb_p_WT@0kL0T0Z5#KLbz%zfk?f7 zR!vXBs36XaNcq5usS7<>skM_*P$e*^8y1ksiuokbsGFQ_{-8BAMfu!Z6G=88;>Fxt z|F-RU{=9i6obkTa0k~L#g;9ot8GCSxjAsyeN~1;^E=o5`m%u7dO1C*nn1gklHCBUw z;R(LgZ}sHld`c%&=S+Vx%;_I1*36P`WYx%&AboA1W@P;BvuFW+ng*wh?^aH4-b7So zG?9kFs_6ma85@wo!Z`L)B#zQAZz{Mc7S%d<*_4cKYaKRSY`#<{w?}4*Z>f2gvK`P1 zfT~v?LkvzaxnV|3^^P5UZa1I@u*4>TdXADYkent$d1q;jzE~%v?@rFYC~jB;IM5n_U0;r>5Xmdu{;2%zCwa&n>vnRC^&+dUZKy zt=@Lfsb$dsMP}Bn;3sb+u76jBKX(|0P-^P!&CUJ!;M?R?z7)$0DXkMG*ccBLj+xI) zYP=jIl88MY5Jyf@wKN--x@We~_^#kM2#Xg$0yD+2Tu^MZ1w%AIpCToT-qQbctHpc_ z>Z97ECB%ak;R<4hEt6bVqgYm(!~^Yx9?6_FUDqQQVk=HETyWpi!O^`EZ_5AoSv@VbUzsqusIZ;yX!4CsMiznO}S{4e>^0`c<)c~mC#*{90@+T@%EQ~>bovc8n_$bvqkOU7CrYe8uI5~{3O7EijeX`js z-$LNz4pJA7_V5~JA_Wl*uSrQYSh9Wm($%@jowv^fSPW<~kK&M*hAleywHd?7v{`;Y zBhL2+-O+7QK_)7XOJAbdTV-S`!I)t~GE8z+fV7y;wp#!wj75drv;R*UdSh(}u$%{VSd0gLeFp;h6FkiVz%g=EY3G#>RU;alRy;vQmk*| z@x-ba0XKE%IyL4OYw6IXzMiS(q^UDk=t(#XgkuF`{P?=k8k3r)rmhkv`vg@kiWd34 z-~t+1aV3SabTbG=nQYs>3~E<}{5@0g**LAWi*~SfRZhGcgP{e5T!0M7CU}`f@r8xI z0bx%sI!?5);-wG+Mx&S=NRfIi>V-wP(n&$X0Bhd)qI^ch%96s6&u7qpiK8ijA=X_R zk&|9f$GXf-;VgnrxV83Cp-Q!!sHH`5O^o~qZu!xny1t?(Au(EAn)D??v<1Uo;#m7-M@ovk|()C(`o>QMTp}F?> zakm3bHBKUjH-MHXDow7#Z|@wea1X9ePH;%YA)fCZ9-MD)p^(p!2E`aU9nmJlm;CXQ zkx~$WQ`Yq{1h5k>E>Ex{Z=P=)N*0b8_O({IeKg?vqQ)hk=JHe z5iqUKm!~mLP0fnRwkCO(xxTV@&p+o8wdSP$jZofYP}yEkvSc z5yD-^>04{zTP7X44q9Af&-wgt7k|XtncO&L@y-wFFR44RsPu57FRvIBaI^Pqy_*DV z@i13CsaR5@X@xH=NT3}T`_vsy!a02n80eQqya=-p7#YW`Jc0z!QglGg`1zeg6uXwI zsB~hlNMo)kFL(V3Q1<%8yoI6X7ncn-&&Uh3rL@S(6@wKAXt6Wr=a2ObI7}8$D-FoI z>AJA>WsBEMi5ba6JhJ%9EAi&ocd(ZsD|MsXwu@X;2h#|(bSWu@2{+c7soC`%uo{sMYq&Vyufb)?OI59ds)O+kyE8@G z@tlpNr0UO~}qd0HQve6njJ zda2+l$gdX7AvvGhxM6OToCuQ|Zw|9!g1)O+7>~{KNvASjp9#Cqce-or+y5xdzWL3gLWt2oa+T(I+{j(&bF1laUsJB{fOgE-B}qslaS>C z)TjzG8XecbS%a+?yT!0QmTex?E478;D|sL*oS4C-g0Tq(YoH|eyxJ#1j088C|U-w5id`%Sz7X_w#l+U9+)$|2no<}5J zRb_9@0esSr?n}HvVGbD5@$p$8k4?qOe-GNOk3-K^Mw>Xg+drCKi5@$GTeijpI;;IG ziD<&go`ptLC&^<0jw^l0aY?_pUUK+xp#0Bk66iQ29vpR)VBE{JOJ&OL^gKsN<&t<| zCMLTYMSDG5Ie9O>6Dl#T{@cscz%)}?tC#?rj>iwQ0!YUk~R z$rB-k=fa9x&631Z9Mfqj_GRoS1MzqSMEdaZ2!isP19Sr>qG8!yL(WWF)_&{F)r>KnJGSciSp!P0fqHr+G=fGO02Q#9gHK zpwz+yhpC4w*<9JO@#(MdkZcWbdCO5B!H`Z|nV?UtcBo96$BgX+7VYMwp@b-%;BrJu zMd*K!{1txv{kHKPDs9?WZrz_^o1Tq2P=+=|E=Oy4#WE{>9}*9(apqhmE`&AeBzQgQ zELFLCmb~q|6y0FCt|B}*uI*ayZ#6=$BpGtF{Jfye#Q>FZ?BPnk)*Qmd?rNG^tvFUU z_b&antYsZnUR6Q9tQUy81r$&ovT#fy;(Db4F&M*C=KxQgHDrRcVR#d+ z0(D|*9#u`w_%2o3faI{?dNd9$#5nj1PROHNq z7HJ(;7B1ThyM>a@Fo^lJb2ls2lD`}ocREH|5pKN;$>gFyM6k)kZG;lA;@kSJIqUhf zX%dhcN(Jtomz4(rNng&1br3Xx33EvCWz%o8s;SpRiKEUFd+KJ+u|gn|J85dZ)Exc&=V|Ns8Xs#P>qv6PX&VAJXJ(ILZO!WJd0 z`+|f5HrEj~isRN7?dBHotcPI7;6W48*%J(9 zftl1Tr`bKH*WNdFx+h;BZ+`p!qKl~|Zt5izh}#pU9FQKE97#$@*pf38Hr8A+`N+50U3$6h%^!4fBN zjh^cl#8qW5OZbvxCfYzKHuyeKLF4z^@~+oqlz9(Hx8vypIiUlt!(vs}_t#4@nh$s; z>FYERg*KD#Xs+W4q-V-IBQK!)M1)Aa+h+V+is)z!_=gEn&^ci7<DEEmYcoSh?WdXUsP7O4)&lQXA(BVM5jI8s6;mO}94AC0gG(`>|T)yuV1l~i-ejCCt zoejDhX0nrZDP|x9u4zp%S2UeDzV`o#pBGu1tZ-$<9TIbN=ALwhQ0=9S{8#}Uu8n-~ z5~xIvUhLSz@c@0|me$CdZCpZl(vQw@a0Y4^{T0w_>pOkwI^x4KkBf3qGmm)nG|Ps5 z_XTY~^b^mL&_*yjl~RRIi&eS(>y?y}O4-)nWyTEPpQAb#Xz8SnnfIL+nAcNL9nqV9 zRL|eyF)RKI5-kJO6}>Q89XmgY@b1&!JI>g3ryZ@jN2v3vm7O`AL!BTWNouJzV+$+Y zYY}u%i>K6=IYU2O$2TAyVjGt?wgF9xCj;?EK(8fWu!!~48`3u^W$eUlCh*91PLxu1 zRY(F7Q3s7h$Q-p&L$ucN}it*-9KR z_<wHu?!dav0$P+PI3{J8?{+l|n&2YMLV2 z+hRta$A5WpCXl1RNbYBsX8IGX{2v>U|8_I-JD56K|GexW>}F_e_g_1r?08v8Kz{V$ zT=6aGMk>ibvRO@Yrc@ezaD0%ydHkXGHrR{7>q~~tO7ChJflwa4-xL|@#YIJejC5VT zInU4CjQ9V0+lClQY=vh^s4MadwQmk7li{54Y;Ht}gkZOIh9(vfK?3kXLoD72!lHD# zwI-Jg|IhT=Y#s|tso1PWp;|aJ2}M?Y{ETyYG<86woO_b+WVRh<9eJu#i5jxKu(s~3 z4mz+@3=aNl^xt{E2_xewFIsHJfCzEkqQ0<7e|{vT>{;WlICA|DW4c@^A*osWudRAP zJut4A^wh@}XW4*&iFq|rOUqg*x%1F+hu3U6Am;CLXMF&({;q0uEWG2w2lZtg)prt` z=5@!oRH~lpncz1yO4+)?>NkO4NEgP4U~VPmfw~CEWo`!#AeTySp3qOE#{oUW>FwHkZ3rBaFeISHfiVSB7%}M) z=10EZ1Ec&l;4 zG98m5sU!pVqojGEFh8P{2|!ReQ&hfDEH2dmTVkrS;$dN~G2v-qnxn^A2VeHqY@;P} zudZD5vHtVvB*loIDF1M7AEEvS&h0;X`u}!1vj6S-NmdbeL=r{*T2J6^VA7F`S`CDd zY|=AA6|9Tu8>ND6fQhfK4;L3vAdJPBA}d6YOyKP&ZVi%z6{lbkE|VyB*p1_julR^k zqBwjkqmFK=u&e8MfArjW-(Ei8{rWso1vt5NhUdN|zpXqK{ylJ8@}wq-nV~L4bIjtt zt$&(1FTIs+aw}{&0SO4*sa0H2h&7g}VN5uYjfed5h7eGp$2Wu*@m9WIr0kxOc}fX9eOWh zFKfV>+SD$@kESKYm{F*J90XQjr$!<~v(J%&RMuQM+6CkmnYZDGlOUdq}%)VA& zl#acS%XE2KuX~7IamK`og@C`21~*cEEc#PZM6HT*Veb_l&Ej~j0zL7p0Eo`mMu(=X zJ$v;&Lya75I4C^saKROgfi(fdP0C$GM3WyZn%mm3yEI>|S&O(u{{S<}ihUp#`X&_z zmQBma;82#`C;dR5Sx09e07FvtJLhZ{9R~|$FCdU6TDNUwTc9kNct?8e@o2MpQDrkg zN?G+aYtTjiUPA=RX5o{4RYu}6;)ET>TcgL^VpfIpluJ|lQR(_)>6k%L^FZmoK-Wm- zR5qy0P)hm8yvqOL>>Z;k4U}!s?%1~7v7K~m+gh=0c9Ip_9UC3nwr$%^I>yU6`;2kV z-uJ%y-afzA7;BC7jc-=XnpHK+Kf*tcOS>f5ab2&J&5hIOfXzs=&cz|Qmrpu6Z);`R z0%3^dioK5x?o7t~SK7u5m{dyUZ#QUPqBHYn@jETeG>VU=ieZuJ;mm^j>dZM7))cw?a`w8R z%3M0R=kdOt^W^$Kq5Z%aJ(a$(*qFpy^W}Ij$h+Jnmc9eaP(vB@{@8t zz=RQ$x4XYC#enS$fxh@;cSZ|D%7ug;0z{C8I8h{KocN-cyv3UG_nk99UNS4ki^OFkYea`q`rs zG@qdMI;4ogcd5Tr`di1JBg4I*6CFvCID_2SN5&)DZG&wXW{|c+BdQ4)G9_{YGA@A* zaf}o^hQFJCFtzt&*ua~%3NylCjLtqWTfmA-@zw;@*?d&RE3O8G&d;AVC|rZrU}jx# zC-9SF`9;CbQ(?07o8Q9E12vi)EP@tOIYKEKnO@-o!ggkC)^#L-c40iZtb4Y-cS>$I zTn~+>rn*Ts>*y*z^b3-fAlne+M-*%ecrI^rmKAVv23cB`aWD?JDJ5NIafRvRr*~~C z)99Afs`BPK!5BFT)b_^8GyH*{22}yDq;be`GnPl=vW+ITnaqzl(uYOHhXi}S!P+QZ z4SwfEPuu&z4t#?6Zaw}bvN{;|80DfxCTuOdz-}iY%AO}SBj1nx1(*F%3A-zdxU0aj z`zzw9-l?C(2H7rtBA*_)*rea>G?SnBgv#L)17oe57KFyDgzE36&tlDunHKKW$?}ta ztJc>6h<^^#x1@iTYrc}__pe0yf1OnQmoTjWaCG`#Cbdb?g5kXaXd-7;tfx?>Y-gI| zt7_K}yT5WM-2?bD-}ym*?~sZ{FgkQ9tXFSF zls=QGy?fZ=+(@M>P3Y>@O{f44yU^fP>zNzIQ0(&O$JCd_!p?2;} zI6E1j@`DxzgJvqcE@zgapQ?tophO14`=14DUZ*#@%rRi``pi0lkNgidSsHGjXK8gO{drQoNqR&tRjM4>^DtW`)fiRFO4LE=Z+nCBS~|B3gZsh`Y?-$g z@8@Z$D7C!L9l=SWoE;(+*YirPLWvBd$5Ztn3J3EaGM+#pW#@{3%yksGqy(2Bt5PVE zf*fICtPp77%}5j#0G8<=v=)LR>-a3dxja8cy3m$=MZ2#$8mbLvxE%NptMd+L?mG`v zF1cANFv17DqP^P5)AYHDQWHk*s~HFq6OaJ3h#BUqUOMkh)~!(ptZ2WP!_$TBV}!@>Ta#eQS_{ffgpfiRbyw1f)X4S z_iU`lNuTy86;%!sF3yh?$5zjW4F?6E9Ts-TnA zDyx5p1h$Z3IsHv7b*Q{5(bkPc{f`2Wfxg*Z#IvQ;W_q9|GqXGj<@abo)FyPtzI~i25&o zC!cJR%0!}lLf^L2eAfZg7Z69wp{J?D6UhXr%vvAn?%)7Ngct4Hrs@LZqD9qFHYAWy z4l=2LI?ER&$He2n`RiG&nsfLv?8$Cl)&d8a-~-N`I|&EPa@Y=v@>0Gl?jlt>AUY;H z`**5bpS#VGhdp4pKbf3iEF*>-eXg_$bqt5Dc%q0+)R50>zd^l7sN5R5Z)Ut+oz-8_ zJ`Z9HE9(=wRTD)T=%GZTEi9K5naPzlfE$|3GYGLRCLsnqLi8Sc6y&iskqA&Z$#7Ng z7Q@C0)6k;J$TlQ+VKZ5)-Ff_BNoIMm+~!@Cv1yAUI-U!R)LHc@+nSUzo$GlRb+8W< zYPG%NFfr;!(RlnvBbN~~EpT6Xj5*^Z&73tdIQ$LZu`vkfzdTKa5|JJtQ_rm4g$9LO zKtgYVdW=b<2WGM3I_j|Rd8gZ3j;)S#AT(aP^d>9wrtQS_+K>pZDX^?mN!Z>f^jP@1 zlJ;i79_MgOAJa`%S9EdVn>ip{d!k6c5%zizdIoB9Nr!n`*X#%6xP1?vHKc6*6+vKx zmEt|f^02)S_u_wlW_<`7uLQU%{wdH0iojOf_=}2=(krE<*!~kn%==#0Zz`?8v@4gP zPB=-O-W=OO3tD19%eX>PZj3YfrCt0sEjgTd#b$buAgBri#)wW14x7QcHf2Cneuizz z368r7`zpf`YltXY9|2V{stf8VCHgKXVGjv$m!hdDf0gi`(Q!(Pyg~FO28Vr#!BYP| zI)qG2?Ho=1Us9dTml}-ZOR?g5Vk)f+r=dbCN*N1=qNfG>UCLeA8pd3Ub-pRx1b3FA zEn`CIMf`2Mt3>>#3RkE19o}aMzi^C`+Z>8iIPHSdTdmjCdJBtNmd9o0^LrJc9|U9c zD~=FUnSyghk7jScMWT|SHkP(&DK$Z=n&lGm+FDTpGxfoIyKV)H6^nY~INQ#=OtIT! zyB*J=(#oHf=S)MNOncW->!c0r0H#=2QzobO&f@x&Y8sYi-)Ld;83zO$9@nPPhD}yt z{P`*fT@Z(?YAmF{1)C;o?G@dfd2$c+=Av*|;P@Yz1KnclB-Z-fJQ-=+T*g>0B7!g# zQH{dHt_%wj=wlmT&m59)TQ~xK)gB6f^EY$=1zcbGf~Q>p_PzDCHR6lndGmqPY2)&w z$Th^K%1v@KeY-5DpLr4zeJcHqB`HqX0A$e)AIm(Y(hNQk5uqovcuch0v=`DU5YC3y z-5i&?5@i$icVgS3@YrU<+aBw+WUaTr5Ya9$)S>!<@Q?5PsQIz560=q4wGE3Ycs*vK z8@ys>cpbG8Ff74#oVzfy)S@LK27V5-0h|;_~=j1TTZ9_1LrbBUHb?)F4fc)&F7hX1v160!vJc!aRI>vp*bYK=CB(Qbtw7 zDr2O^J%%#zHa7M5hGBh#8(2IBAk}zdhAk$`=QYe^0P6Bb+j5X)Grmi$ z6YH?*kx9hX>KCI04iaM_wzSVD+%EWS)@DR&nWsSBc2VIZ>C(jX((ZiV0=cp}rtTO&|GMvbmE4FpBF5Rd z6ZG=>X&>N3?ZN2^11pXEP4L?XUo`qrwxgQm4X~RCttXmZAhnhu4KDK=VkKq?@@Q_Z za`*xyHrsAEsR zV(7)2+|h)%EHHLD3>Qg{>G|ns_%5g5aSzA#z91R zMDKNuIt@|t?PkPsjCxUy&fu^At*yUYdBV!R_KOyVb?DO&z$GLJh9~b|3ELsysL7U6 zp24`RH+;%C(!bWHtX&*bF!l-jEXsR_|K~XL+9c+$`<11IzZ4>se?JZh1Ds60y#7sW zoh+O!Tuqd}w)1VxzL>W?;A=$xf1Os={m;|NbvBxm+JC@H^Fj$J=?t2XqL|2KWl$3+ zz$K+#_-KW(t)MEg6zBSF8XqU$IUhHj+&VwsZqd7) ztjz$#CZrccfmFdi_1$#&wl~A*RisBaBy~)w|txu1QrvR1?)2mb&m2N$C(5MS%hSX)VJnb@ZGXB5^%(<#1L@ zL^>fBd+dEe`&hxXM<0A9tviIs^BDkByJdc~mtTYr!%F7Q1XnK2$%h$Ob30*hSP$Bt zDd#w{2Z%x^Wpv8!)hm>6u01mY!xmPgwZ#Q0148)SxJc3Udt!-&}eRO^LN ze26pQB!Jhg&Z>#FD>`C`sU44><=v>O>tJdLs!HPpV#AM32^J@Za-9J(CQjKxpzXao zQfRkWP%g9P8XV21MmoHfx{DICLSc*t4qVeQL9t}&Pz0rM}YTba@XsD=XMW@FxFM{QYQJHvM(JsUSa3mcTUl9^qcVA zBveO--fqw%{#QGR1vy;x88+qMcgzmcYc#8U`CPPt6bl?uj%w_`b~9JliftnOa|ziW z|6(q&STs_*0{KNa(Z79@{`X&JY1^+;Xa69b|Dd7D&H!hVf6&hh4NZ5v0pt&DEsMpo zMr0ak4U%PP5+e(ja@sKj)2IONU+B`cVR&53WbXAm5=K>~>@0Qh7kK*=iU^KaC~-ir zYFQA7@!SSrZyYEp95i%GCj*1WgtDId*icG=rKu~O#ZtEB2^+&4+s_Tv1;2OIjh~pG zcfHczxNp>;OeocnVoL-HyKU!i!v0vWF_jJs&O1zm%4%40S7_FVNX1;R4h^c1u9V@f z`YzP6l>w>%a#*jk(Y82xQ@`@L(*zD&H>NY`iH(iyEU5R$qwTKC5jm4>BikQGHp^)u z-RQ`UCa70hJaYQeA=HtU1;fyxkcB2oY&q&->r-G9pis)t$`508$?eDDueFdW=n5hJ z08lH$dKN$y#OEE@k{#|<%GYY=_c~fHfC@pD54KSP9{Ek@T47ez$;m$}iwR}3?)hbkwS$@p2iVH0IM$lB*XYA+#}-re|UNzCE)SOYwy z=Y!fkG4&I%3J(_H#UsV#SjHulRIVcpJ`utDTY{k&6?#fzt~@Om=L(vs6cxAJxkIWI z@H7)f2h%9!jl@C!lm+X4uu;TT6o0pd7 zteFQ(ND@djf#o2kTkjcgT=dHs7ukmP0&l8{f;o3JuHGd2Op*?p7?Ct=jA*tIg{MZk z$2Lsc0e8Tdcwrjx|_Ok?9uB3Il|^2FF%X#ck}WoIvrzQXN%kT$9NI{79Wm~gZ3`8I+O`)`n30feZ( zDO-fl6IG3c^8S;Y_M-)+^CmM0tT^g0?H#>H8!oC8W%oU!~3|DJ?)~LT9*&GAQG13zOGq6gs*={cu|(V7{R$y@{-iV*9q@AD(#Ktb}J&3&k|5Djs$)9WM7!6#EaJ_ilvbfUvyh8c?-{n zfuFrC0u6}UJZ7aj@(cNG_(CKgjQQTA-UK@-MVmick zot}6F%@jhq(*}!rVFp5d6?dg|G}M*moyLriI!PQDI;E1L1eOa6>F9E6&mdLD>^0jJ z09l?1PptuV65gm=)VYiv<5?*<+MH~*G|$~9Z3XEy@B1-M(}o&*Fr9Sv6NYAP#`h{p zbwbUE3xeJ;vD}QMqECN)!yvDHRwb7c1s6IRmW!094`?Fm!l~45w)0X`Hg+6Y0-xf# zSMemBdE)Q=e^58HR{kWrL5-H0X6pDu%o{0=#!KxGp0A;6{N5kI+EoY_eTE%2q|rwm zekNeLY-R?htk!YP2|@dbd8TWG4#G)=bXlE{^ZTb^Q$}Er zz)Fp)ul24tBtQFIegdI37`K$VR3tVdi<(fIsu{#QMx=$&CK9M8oN%3Mk;>ZPd-;Q- zn|sSKSnc-S0yrw#TlA$+p{J~u=u98s>IoL@cNLOxH=+1m?;t1bR$vR=M$US&Z8DO3 z_&zhQuId1$wVNsS=X?&s(ecIi#00o{kuPs6kpYkL$jMyGW8U7mlCVaZeEL=HsIxqm zFRLxWin8B>!Dc#9Z#t0RNQiR-@5J+=;tC7|1D*~rxcwHa5iIVD@99cCFE@BukUC-S z^iJdt?dwU)kH2VY9?|zVShMbZctzFRz5Q4tiXa^>@U%jDYq}$rSyc#p2wXr}mc0qq z^lT>$y)N(Qg0dwmEwTopneoU(y)>Mj+f{iHM0o|>ZtCg-itPj4addYz??aE)Rp&hk z_SI)%XeSf=SjZq18h!Cc>Xy&EynnxdHQ){(x@g|ZA%`3LU^KzX02c5N;F#tEk1)7v z(|V9tO3>?^X|kQ*rRBf4>mWW2$-Lx})|M7z125&VHcxsCqB!<$l1F$zCrJ+nm0f3Z z%Hq^=SKpHyV2@Y*Cu2x>fXC0SscnR*($zEB{KOniJcpn@e`PMH*_Q6*0Z^8RNCEvZ z+UU9!927p9YZ&g=bnUvQUZcdisyn;-4;ACXOe-Xor9K8Qbp{ldE17+G@VQT+9ZJQ*9dZoXfU2ue|mMhrrZk2R7&~YjFW4`BTq45UwVc6JORKU)wBCTanITh0GD}s$`C5pb(9{b9 znwee6j%?-UV)_7opOioCf5@C?@w^@g& z&68+oMmV;5JW@TT63&CSDrfYL2$L)pVseDtAwPwleEM3F^-Ufn3PpfxFmx6o zQ`Wq9x#d$e`VKn5LOXNsrqhGao7~|s(u~drPrZ+;aP!C%z4NskZstCbAibD}O%8Ij zb~C(taxco~WzJLxhL1T}3ctXMbV6}_z=IZN9L0|SxLSe`$X`<)BhM`$1&&)e_}fCh z=idVL<+u6Vn{&ksP*ZLlMo$fC`dtzF_?~L?4Rril2G4%v5^7sUa^&8aMtMX&mtapl zD(dW|cisM3fqMaB`8?QbkyiUl2g>hMB5EoS&IB8TdoC~)b$nT=`%GgU`k-)+8}`)F*~I~DXMaTP%kZftx11~?iALs5J+&Rom#p%Y z>dH}-euH4u=_V3hc6^*2WMtL!9%yRTJ93p}@aV0zdY*?xchFI>m+UivV=;aMFp0P~ zwB8P)wvV6D-GL?6hJ#g7Hy7=2i^&Od#S=j!;Rc_yjO!*4aN7{vqzg2t-R|Dav%_NDk z`H_FVlSi==(~f-#65VmQ{EE92x<03lwo5p)s=ZJ^L7PlS>132Whr zR6v~t(#I+(`usYLCoO;Rt8j&b^5g_xgs*98Gp|N}b>-`HtVm)MscD)71y?(K6DRCZV26RsHPHKk)EKKZA%C99t3$t^B0-k5@?E>A-YMbFe?>ms?J?_guHHNU(;id*>xH zTrtam+Aq?n@-y@uY@A?hy?1qX^eLu_RaH4Ave?A8NapgQF=C%XI7wlcCf4<6BRo_% zBXxxc*A6-3CruF?3i8HOdbc%>N=-iiOF+9HX|ht6SCkz;A^am&qi_I&qk1B(x<=(m z>QG)nswCOLl_1{SZ@_eE#m^qb6#6DoMsB*)`17ui+XvF%(}|J4G$z2G*;E!1ERnAH z@q%=#uV6kBddqy4=g>!VTV)9*1=i{wJ}Ep!I*?)uJdA(LwE?(!?;}_u=^M2NShWC_ z*7l4aBJ=!QVU2-iehgb`$vOI8zkm{W%QO~?xOD;NgI;Iqa3#^$^U5D&McReLe&qs# zR<^@QpR4#W~Laz+QBsPt@3L#KF`Yr8}jgHe;5(cfpQ=;Zjtbt;c%y^#-m=hqOT z;KAYakW+$w0&F}>K10&SiPcD9SrDOuczj@U#W})5jGU-_htU`U6Q%wdy((%?J}y+$ z=$4jw1N nJo)qTxG{D(`3*#8tY|67hJRF;)r6F|#I`Ar6I0aafRa=kr-Z0I^}9xf^u;G5iEQCbpv3b#S#%H|HYHsQaHK$! zU#3Fpz8*^pK%RRmX<_09eIVziB0jOgPgFnI-*QcwEBtBiO#v!>{W1cLNXyw3D9M|A z*oGy(u8BkDA1c;MsXmpK^-~pl=We^RYnhZ4bz*)Q)C2G+E3tgx9PzU0T>c|1ilS!T zyE=bz`=wskDiOi!@!l?Y))#%{FM`}7r~X)i1)1*c6_2Q!_1{)fp%cS|YF+Q-CB%d< z=zYus`Vt@Mx*a7V)=mpLS$-5viaKgNB=+zN657qy0qR94!cTtX-Z%KBCg4OKw7b=t zr=`7q5Ox=lJ%!G5WIyNQC1xpqYU0{!I$hyrk!6%De$gp<_*Gc?ES(OwY8U^)Kjgc{ zSlhpXDb|;{+y9`u{EuMz54rlky2~p6xX2>MV6BZ&k`$q%q7v(xYps2wr9e8^4<;CB zc)eAT~B^rjzO6<4BDDH;il6 zFsM8jL+agQ;zazW(uiQjM%fPf2N~_p{cy29XP11_lQFpt`t#9nlk}>fv((FZt-dBa zuMIc4HmPHW04n0TTG9ug9;&OV9euL$Ib|+M7}}L~z4e%%%b|r~6OQj(S2d7XfYn#xp8;KQ55UYu#gY*De5j6Cc z#R%?rqwpy7I1(kpU7B*Pq=etXeYUn04jg%ZPjYqQNa$==yTG=6KX+=;i2Xg+kjV2T*Gc!(ef z`Q4fR*TA=M5-}z+s%YO+!K{k}S**ic&>o4_Tmv$EQTOp7F6TXPCj-UTXy?OQ=%*y62Qajk{rXbR%jMCOFMiVE3KekQa4xR}B%=iPtd8BXo~q$OX_ zSp910{Ew;m|GATsq_XiJ3w@s(jrj^NDtr(Dp!`Ve!Oq?|EJ9=vY2>IfrV{rT%(jiY zi}W@jA2iqd=?q>s;3%?@oi7~Ndo3Ge-2!zX58j(w&zVlPuXm3rcHb7O0RsM|!Ys(b zh(=*&Aywo3vuJoWZnU!u2_4bNkDTc&&bCYc%T zM~~xYxS#3KXFzQ@OXdc%9QDOxqiTd_> zT;(DX9{5dIuC4pO_xy+3{Ov)1I7j!Z)6&nHUvTRP>VU5dm#849icG)cvl0QOPkCIzG^lOp4#UcNr`VhBp(Ha%8@KPlvT*5u!v_$b#b~%sn3K{mu zaxeD%Q~{;Lw03ZAq(Pc-IVj>n*h3l2{sqioCMGatQY0kx zi`1(WWDQ=;gmLSGptEQ%UFC)th@|71<8eiRtX&Mx@#1q#nMF_BMfQdS>!!Qkx2o}= zuqRi?`UOX5P3fP%M+71Q$ctH4Av}bXED#fQ`KR4!b~60nsAv^*M7c-x`|~B}XIuq% zlqIJOf>WvlhQ@Uw$du|14)tZ?; zPNZ|xZSwp1y+d4sut8E4*l2JWR|~o0A9vD-?zC-w zDc@=wE1YKb*OMSi_Kx}&w;#h3>sHp|8^hnA3w?-WK)X?@Z2dgV7`9Cupf-B2RE4x^ zwlw+~!V9C^tyb`J;m2}ksD`w}G9`yu(^--{SQ+wt^Fu4Li~Fft!3QO`upSkAU?o;# z(1Q%GUVWbbkTK-M=T+ULkk3s6Dc9`G4CO6|=&-S&D+rbJQ$`Y-xL~ol;kc(l)VbU>{&>bV+*?ua;$bnDc29RW+Ig16)Vf6=L|fMR_P2b7>6}0 zdlB#-gj|j*C~M=F^2=K*k~=tl6YM3SXXi&K-`EvEXnWz&4D-^hQRBJI3gKKDj^6|> z*WhHSim1qAffNt60Mve9lfw^+&0bx-AM0%j>QP3%W=S@(l=(nrJ678mRQ(#+sI@d{ zdb#5fo#T;hK7xJ=M58wZf|?DHwD%!OZ3JrTGV5#{cfQwuiMvz%!CQ}CubJ7`z?@rSF<+KHNV2goc)a6hP0oHB@3LLKSH2w{um&J*z1Ka2 zLIR>lvOvh>Oxe%?3A@v<_T|}${zf_&@C~^FCo#jB(W9VLO?DX{)n(BQ0(V0`mI|9Y z#U3WwxixJkU_NTvA>5q(A@r2dnEXJp#6B=pww$XGU}~1~c``UKqQb=^*2P|4Dq*_! zhY^i61Sy%T5$Td0O6^C>h(xVvT!}Y##WeT8+s+Uuz=7)~V$>!zU;%d>H)rm*6^IrsCma%|cifwDLk_ z!^W2voQ)D;I$=v2E>iSaBw!d7aD+|LWl2iD!cBw`Q5p1~fk_xGiPi8e^mY&#viTAk zmaKL8m;JQ4bY(n6uBZt02z#noMMxTfF-RzjKre-c+@B)#J3pN-Zv7F}JtAwNk3j?OkpVCL6W1)Q$FLAj zGI!tX;g`O{%pt=0|q54Jyj##w*4e*|_;Us2Tn?!#^R(>u}|FAw1G_ z#wQsagnj9$TAC`2B_XgB$wNq~Sxgl?#0+QWWcB{G`c6~&SosbtRt}Tukw`TQ!oG1= zYyL(y<;Wh+H24>=E}Gs=Hs2%fg;&Qdvr74{E!R?Bd zIRQ?{{xkLJ_44P@y3^#(Be%(pk%$liKbUUo76wSoVfJmt9iTKL3z{uW6L&?jYg>EY zsx{kRiW@q%<$VZvbS(TKKTO4{Ad6l^IeY(F^3}=mX9|FZmQ`~RErNxlBPl3ast}W$T4V?SW=6kIGn@-^`qJv| zZXwhK4Kl1a4E}nLI`rdOi?^pd6;LZ-|8G&INHgOeC5q{_#s+SXb0r(;5ryHFsoTJD zx$VtNDh=-Tx3t!NTlk=hgAaSM)#U}e>_-Ex(|JoX*hWmBPPdTIa-2(BIOUJ|Iddy| zwY*J%z%W$}*;uSoB!BIJB6N6UhQUIQE_yz_qzI>J^KBi}BY>=s6i!&Tc@qiz!=i?7 zxiX$U`wY+pL|g$eMs`>($`tgd_(wYg79#sL4Fo+aAXig?OQz2#X0Qak(8U8^&8==C z#-0^IygzQfJG4SWwS5vko2aaOJn*kM+f1-)aG{T43VJAgxdP(fJ4&U{XR90*#a)G8+clOwdF?hJ?D) zmxu>0>M|g_QRHe_7G|q6o`C>9x4xd$Gl7lAuR~+FtNid=%DRsnf}YI*yOToWO%xnP zY*1G5yDnTGv{{xg5FhWU65q3-|-(+-rJ2WCeSJn(7Az>ej4Jp9+l-GyZ_| zJ8}>iA4g|}q1AhEEv#uWR&$g&Uyht?fVU(qk(j?^D`))s>oG08pow!f>P1u71P%oL2)UC4GeS87&G?{)NE;D=my1Q9{~;y zJULE=bG6jXE28Y11YmoZoo945`MM*`v%5b=_02*0cwzDve#3(4M}NPt`)?SCa|7*q z-94ks(R6WH-l9fE4m4}10WSu&O`|;ZCIT%vL$_pbABY!}s33@~gIvZ0H4co|=_-T$ zF#lC7r`89_+RL9wYN=E3YwR?2{$^ki(KKd>smX(Wh*^VmQh|Ob5$n_%N{!{9xP~LJO0^=V?BK8AbCEFBhDd$^yih$>U z(o{RReCU{#zHSEavFNdc8Yt<%N9pd1flD{ZVSWQu*ea1t#$J5f6*6;tCx=&;EIN^S}*3s%=M#)`~=nz!&Q0&{EP|9nzWyS<#!QxP;!E8&3D}?QKh^ zqGum|+;xu9QE=F#fe2ws5+y1Igr&l`fLyLKry=1}(W+2W`waeOR`ZXlW1B{|;4sE3 zn^ZVlR11hiV~p<~TaSen8I~ay#7Ql=-_|U@$8yjZsZ=Vi+^`JV2+kn+oiSUi%omO_+7}saXnJ9 z5ETilbag(g#jZPopCgJu+n@(i7g}3EK2@N zd64$77H5a`i%b%a^iRjMaprwzWz(`=7E6QY)o)gek7H)yZ-BLw^6FAoHwTj9nJtWc ztKaytMlWGLg29W{?gr|rx&snb@XyvR_}x3fmC>d=-nQp5ab3*whTw}DfUcKlMDDx` z-%?ek^*|Kqooy#>2lfklZ|jN4X$&n6f)RNNPl(+0S>t(8xSeOGj~X0CGRrWmm(WXT z))DDW_t&y$D#2`9<-+JT0x1==26*gpWPV~IF=rePVF%e-I&y$@5eo~A+>yZ&z6&7> z*INESfBHGNegTWga&d@;n;FSCGyW?}e_Qw#GTLHo*fWxuuG@I~5VA!A1pOdRTiPA~ z^AGe(yo=9bwLJD}@oDf$d+34~=(vIuPtOKiP}obDc|?@hY}J*@V|UynBeAkYa?S{@ z_f$U=K+>deTAi&=a*xv>Ruyw$UsTWY=Yn=xjf;s)6NQu>_niQ_idmzIwuL`Scf)f= zyzK?D5a5)^D@H&qN%F6Zd0JeXX*Knbe~VLe^gi|?JK67&mB4jrapV-$`hCQT;C{%T z*pjxB+Y|~LD9bmMN%Iq}S$F$x1yWU7@GcR91V8h;!O2I5MN_rq*gRx(k8T!1WSDTp zr9eJO4$~H94aG^6k5p8k=kFJ>4lnY0q_Bsa$@vTRW6uY?slH|Qt)Yu6Yun&pfJ zBi!h;6x?FDs&79#PT*HSCEUsKws#s%TFy*=2PAfb`>gEPBn+D-WdfXA?MkB=<8kb_ z1+4D11mdHG0EcAyg4dneLtfJ8)RyHQl@6hWJNe(d_EjyCHf7%Xsd)S4A-4COz{G@% z5xQ!P>AS@H@;4Ws)N91)3A6PleMe2<& z!(zv#%Uc?N`(Xmm)OJPYt)BM`nRjoWA&P0Yxl@c9Y02zlPH1J5l$nhPrMwu=atkz4 z)a-1+OEL;d@ctx=s<<+3Sv1VYy0RYmiji|#hy$66#`5;u~BkH4^$EGZ-Y4xyZ=%3KuaeLYKAUr$xMtIh_5mga> zPz<#G0mQ7IxEw-yO}BueN}RaFlg$RwCDB)vLF$wDu%qZyLYsPKdcbHD23$qn9i#JFqIo#OK?u7db2-$GatzO!On87%}Br};~#}n zziVB;qf_4(K$u>Qyz$ln_kBGS!CD-t4Y}9oxL@7@Sx*?NOAzdeINUD>Hl#*V%pfA; zSA`==YatS*G*crJ3`3ll4)vKss&)UtY#7ZxiVoG%9(4<%`WWcjX2jV(^g7Yhj+h5J z$5=?S=tuCyEt74^6jo@6y|@~N>&cVfFNtaRl=)Gm!vR;Bc$3-;ySCI$%kdmjQ|si` z{$q_YCe6vjy6re9jGN|`43D``)1PODtz0)vhV4XV36nVpOnMx2uM%qZ<3TtcI%>BQ zf0(J`{JqPPJxw>k#&nIvoZ5e9Sno)B2r+E0G} z@&M|zf4E0Q$O*NBR2I;?i7N} z@2^Su#`%qeX}m3cbSojiLk#84kvW1fICNPS`OyT0SpUoA0(s^2m~J<^eKE!dhJx_N zG_T}0&(<*an>oF=@?6?55g&IxSgY3?7|@pmDRE6gJyJNPH6un~%0hZ@?h=hI6O$b^ z)29#<4$E)cE-5IFbRpk9JVrw$$966UDyw;Iym4OY4Fc!&s1ZH4BJ1-$9<)Zt1c)N- zU^&9hsk6z?3%<9kGKHW|6~k;&cghtWz`oz`_YjVuvy;B;T67=L2c6=8`7WyTBv*QH zNv*bo1#KOk{O&)@&pkd*?v+kcJ8tM>AGx$~WMhH{L40_N=bkrVg+^p!H)IqXCQf2_ z0fPig=8CEo>p4vE(nc^DKbZ|9_Xo}$i4zJ`jVh95; z5%aNP3@``=EJ=Vt9U`y+$YtX;%OPzgZ_3+;+mh{p#W&y4-%%Bf`LhOy-*kB0qnB^m z_nBTz_b?-`F$*ymByshU>D)za2g`0j^ioo;A#QeL@x3@|+_!=YXA5f6Xg(Ack&WOg zJ<2i|Fd6OmyH!@YSMVxb;=M)ZDhBt)4`5T*>cUXWPG#%@$&*>K&u3#|`fm2mj*FKVf?du{xZ}WKWETTFhq6_fO$PS5(ItF=3~pFp~*j z!ys1<4EL1)#{`mz@gW|t-FpPkd%pK)n_Rb)F;z7cQ6dym_>YI3&e!=!m006oS3Mjq{q ze%hNzW=G0jpfl2K(x`CDuZCsJV*hm9T~%5n7R_g}VFpk`G((D^MWVMAmRp--T{`P; zwMgD<;e`fm`g3|fPns|6qnd{|FCHY*YAguXH(?%sx%4+Gu|Y)_8mk4EljxmP+MP`* z`SUbI{TCIN2OV+$y#g->Jqv#$wL;}4xJmah#$0`v^ughM_XjTA$B}ux)JZuY5-GW4 zKy440I+w=ZtE-_i+0xImq}vyzD68?8;94-5L~_O6Ty>X3itdA-x?6P(c4jkr+f!H( zUDeqiG>3bn^Sf8(`_YwqPeJ9&-@OCQZm4X{FfRMeBtN4E9Ca@;GVpU*L>lVb;@=PH zTQvTr?^jKyCKh&ZVOI*<y%T*Aw(XCPrFC=39*y$A`FSzxBiQ#W+uW10d8&gYp4{teh;^p@anft+z$5!Hv&@h0X-@xJG>hbTCxjDwMiWK@1b%8wYL6BrV zT41m}tX8g-`P@vj4T!Mlk8F0S!MA`^J=SCy9-jdwDe^hVDa`WwyI^H@ryt=F5y6>b zT8&iI6&j8edAfX^ycgWbnMZQ26Q~`LmdEScKC8|~$Jgyw(>18NAQ$9AwCRmri!96L zp^)b0P2CR-9S%cG$#rU}MXnx21T#031o>2VrDs@sa-FpjfvgLPW>Q&LHUoNOtmkt# zoDZ=5OGp{^vO~=p29^`aXd8K?(+f-bW`N$U;-o;%f?RcR!k02Nod2h^^8ly%Z67#E zC3|IOuj~^YBO=Fklo@3mvd6I{Z*&FZ>iq* zxh|JuJoo2$p8MJ3zO@dQ;%1#~Mrm48 zB0053{1bDi_a@jo<4!@!`w4}B(&Qb`~IeSBh zu+_yIYl2Wgk+?x4pCmAM>x_SqBPUj#c`C`k>_fp@qPlAAwD$!zOxRkL7;=|nu(#ut zyF^;&hm-D_;ji{d6rOloACu5*NkF4IC3@rifMG(|^Skv$H&^YnYL*rpw=UCi;JOuz zN*NX(7wZXS4tF@6PIWAs%*j!$RoL*3sh)}iry%thDvN5AUM888q_(>|Tzt|Yea3AyMYBgm$H_`F^v2%)bux)3s znFIEBDK;-JS5SH|;1?afJb<*=c5puu=w%tv#ihn*R!^Hd$KWAp4$#`joJ*)$kNtZ z2Al6h>Z>(u?3tmzA4^d+jLKx{97!Pb4;CX&u;M||**7zXI7hO6nrdMx*Xa=|-`#1^ zBQ?Ha&7cd7hN=%y4yUp?zl8~Lo;%mQrDe8!ce-W_K94FFMN*g(w8q-_K5S+c0{o29X&PzpV;UJE^!xnFc%b@>kvW4m#xiOj-L*DadC&2N#0Us z;<-(m1WB7$=j6hjcPC6JB)D3T2#IC`ibu#yi!uK7W2!j|Z>~RaJ*&XXy#ytIk2DIp z5?Qd^s90_?ILjU#>ZWk5HXts}grg_!Gmgm!d?eLGR7xEP zvTCrslV~94ym5_i<5oqy(@@?wN}lIdtiY8=?|Ng!XeYnly`@9wCGx2S$3x|0x8T2h zz7A85Vb2>s44rKpI_4Y7_Pnd2^mYj2%^jM|Du>u4`^Psda^JIP%*DK6bo`Vf&f{!% zDTYCwF5Nhi=)QhU2$@eQv&ZzxsX+Hl+gP6kW|e!n9IU2>Vh~cioI{>4WvR}t*4Hpz z%5z?HjLGoka}Q3AbX9AkY|Yjf^M(>@tBAI9JO5pDCQu0R3Nns>)LC#vB2p96C*?K? zvX$un$sBDx$1=+NNj*@Oa@u*b@O*XBr_sg@8sCUq-|LK!MUmC)epklrv}5O_^<{NP zX16|c$9Wtbks3y7geI^tF5oRZJu;v zwkW8j+8Ccxo9stEDOT_Go&j%$KCgVO7pm+^%PKEPBZqbMw%s@732XS{cX+wCSjH1s z5)bc=g**<^NNsroY` z?}fHHlgu^B?2r{^^gQ&j zbF~T((>|Yg&C5WKL8DCnl1}Z3!YHFW2S1|;Xr0`Uz-;=FxEwYc4QpeAtnm7^f~uzX zl;xA!?>MLR?tL80Iudm;mi{!ewL91KhG7Hsa-XepKi<2mc6%zf0GwtbfJ1Zf-<@Xu z#|XWDzv|04t)&9Id!UxAAkN{t5qC%%8-WV3i;3duS19%m2||Y{!3pR1=g|zQYAMqc zff)_2nj-O4wfxy;UNM?|Uieo!^J$A*uDe>@V(NKH;KS;Y_dtE8${p>RdcrW;=2*fj4~d?OG0l-(g?ik}vz} z)5-wDppVts>K-=|@{=!53?=8)Jw#RGpS_FWpbwtn}{v!JEJ$q-sr7F6&OPBuI# zuVNFMPte79XgEu!P&qRq8u4J>r%$l-IQ00Lin90(_KtC)aR_de zxN=pY2<1b29_^AG2WJIGmmX4rv3$!`l15{e(H!1^+x9voZ6;882YAE12q7+lgy+>) zj|s0CyzI9=Mo!R}&LXB`&DYpZ7c?0r(&KNV+~TULd0y^e;G{KVR4nL0KvU9mr8&$^ zxrM-9P8zE`J?aZ(iB~Rz<{vvnk2HaZU#K$aVFfYnbAXVUOLU#As5JvS%+26 zi$sNuPY}dLGUS$0g&;oBqhzv2dY`l3@6Na403M!Sh${B|7(y|_cONa;6BrtUe@ZzV z7SThtHT8k?Rwc)(Z}@BP#H@JJHz&GR&M=E@P9KJ89yQKmRh&I~%vbL1L-K3E>7>CH z)Y!=jXVb1iPrAoAZZ3}3wU*5~nrV!ZjL5zqJ<@NwjHCZC>68Cc<{&E_#S;E*jOdjtg?uKN|l`P8sjz&Qf7a^z9 z;{3-8T+H4y99_zc;JYIvs!sk$G}` z??mt*Mm9Z@glCZb!X?!xXD-21sFDPEpZOK{sbQseQ$%6~b;n+*z0hRoR}0Pe>B|#t z$XrVcXv8M|q*Z8MY&r9J0A=d^1bHpjrUXu)qEj~$%%=gZp`^~%O*lzxUquG^p6;n; z^(3HL+hx4gRP?4N*b2p9!^|2~rcw3!9nQj$vmZusbXYz_x^AVc`3qBFm(jS9ueU5h z^AnNnbswfQ2Jq=W=T+p-V|nQco@bOAH$pLQZ+BKH8E$iM>IDz z3|wc?QP`yI=X5YTlp8h}%p6{Deq?S0QD$Ug>ih1SdPZg237Rl{S~=Ha4~-ckMoIWMn+X@@`V6 z#HHZj>MQbt$Qqp*9T(cjc^lxZ7UO(>PwzF-qEr(wo`vaulxdall|KP`7p4gd`23&Jy=#sAes*0diLB(U$Nx46VQvP)8idSs8^zaV91xw*O-JMH=)FoJshRob|_)O)ojtfP))WHCr(;*2;VMQ75^ zfN@a^f#o<|*9X;3IcGodLUz-3i~FAu+zI4c5h+nW^h_!^)b*B_xw-l4O$TB(ixaqW ziMoa%i=BeS<-F45kMO;Tw|FWa`G2c!SuOA3CbowPhF6csf1|&qqugUrj;UgGHm| z;j^yoH?MZhR;AYOW_XW2Lg2j%%ejL)B@*bUMD`g<#Z${1+fa57r7X82 zcqY-cfPnK%Y^3@szRner zt)bBToYCph6Jv*W+&t?&9FG4(Iu2w46 z4B#AcFy_^J@f*6<{>CN}Sj969*DYV*e7<61U>GoN{tz!Do90+jApFueVY_IW(MQF; zl?4yA_(MvMwN&pWKVyg{3uU_+y6RMdot2vu%mC?st=N0pf-~JZXE?3JFf)j<{1xsU z`2ephz)#HzsWEP!inHm2hI(V(~@W zY7gGU-lO52cHD&SY)>QHgy$=>^X%u0TQZfCizro!*weMyvZC=;MWOawdAx~`3C*W` z%^#^$uRP;gyqEE0<(i8xcQY$oc+6mY#z{-XFxsO1(cN8Y)>p;^q9|5bk`Z*p|c!?(rErw#y;yT(%@c7trQBv6cj)$3>pI z>tz+;IB?D=aQV=s(n)o63*yn8dX1m7#Z4G{%fF@K2o5n3jxR~mU?nzMi#;}8e#(>{ zy{Z4!AI)jZ8TY;nq1aq}tq;~=zzoTv)er06oeX3;9{uP{LWR*2%9cmE%S^`~!BW>X zn3PZFTf3g*dG68~^1*q@#^Ge(_8puPEFLD8OS|0b2a{5e=N4S%;~f3tC>F6UxK#v9 z)N-#Mv8=ePCh1KsUKD1A8jF_%$MPf|_yCN9oy%*@um6D{w*2|4GY zb}gafrSC+f=b*W{)!a!fqwZ9)K>fk=i4qf!4M?0v{CMNTo2A9}mQzV=%3UT&i{3{W z>ulG#M!K7%jPf6Mjff9BMslgQq3zIogY);Cv3v;&b#;^=sh#(Bn%W)H*bHNaLwdpq z85%fUTUJJNjYO_426T2TBj0D{6t zw&S_HZ|C?pI_2q(9Fas&@uJs6nVX;P*5K#6p|#)_(8PM-{L(;2wl`ma{ZAd5gA)?y z>0GSLoK<*FwW+G8@-M3vcffg7I(qm7lzF)n`Q9iCvp*mn7=|CjlpG{x z&r0n}XLWZ!>=lynUr7D`6n`7a_ZgT< zm!i;&?Fb0Q2QmqmCHfZ7ex=_tU~(7b)L?RIvPyEAU=gLIZ-VTAA~WR00yKyTXg^(G zqWLZJs!FnQYMOH3*fN&Tn(IKMLf{Ki?pRo8zZJ6YVyj)y0^)-sR}2-)%mI(Aw2AgT zbbp1T{qB(OSNJd0cVBH^tI>HR(q+#*lmi@LWe*rZz&M2h1L_=50uZ1e*n#E*`6?aw zj`ka&JpceRGe@}Ey1)Q~O}0qHRg4K_u>4e1arvJ7Q9!=t5AuzG`n=a-f0}{+lnCE#zu$`oVn44eS&T?N*wz~t~E&oQDBrB_MSg z_yVrQehWbD0xHX|v-hpselAu;O7s;P*!uAT`dr~}Lie=tknaGoiU?;*8Cwgala-65 zosOB4mATbdXJFujzgA4?UkCKE093A1KM?W&Pw>A?IACqg1z~IZYkdP70EeCfjii(n z3k%ax?4|rY(87N&_vhsyVK1zp@uils|B%`(V4e3%sj5f|i(eIhiSg-fHK1Pb0-mS^ zeh?WA7#{hhNci5e;?n*iVy|)iJiR>|8{TN3!=VBC2dN)~^ISSW_(g<^rHr$)nVrdA z39BMa5wl5q+5F@)4b%5-> zA^-P20l_e^S2PTa&HE2wf3jf)#)2ITVXzndeuMpPo8}kphQKhegB%QO+yBpDpgkcl z1nlPp14#+^bIA7__h16pMFECzKJ3p4`;Rf$gnr%{!5#oG42AH&X8hV8061%4W91ku z`OW_hyI+uBOqYXkVC&BqoKWmv;|{O|4d#Nay<)gkxBr^^N48(VDF7Sj#H1i3>9138 zkhxAU7;M)I18&d!Yw!V9zQA0tp(G4<8U5GX{YoYCQ?p56FxcD-2FwO5fqyx@__=$L zeK6Sg3>XQv)qz1?zW-k$_j`-)tf+yRU_%fXrenc>$^70d1Q-W?T#vy;6#Y-Q-<2)+ z5iTl6MA7j9m&oBhRXTKr*$3gec z3E;zX457RGZwUvD$l&8e42Qb^cbq>zYy@ive8`2N9vk=#6+AQlZZ7qk=?(ap1q0n0 z{B9Fte-{Gi-Tvax1)M+d1}Fyg@9X~sh1m|hsDcZuYOnxriBPN;z)q3<=-yBN2iM6V A?*IS* diff --git a/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties b/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 7d02699a..00000000 --- a/samples/springboot3/pet-store-native/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar diff --git a/samples/springboot3/pet-store-native/Dockerfile b/samples/springboot3/pet-store-native/Dockerfile deleted file mode 100644 index 7d5833bf..00000000 --- a/samples/springboot3/pet-store-native/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -FROM public.ecr.aws/amazonlinux/amazonlinux:2023 - -RUN yum -y update \ - && yum install -y unzip tar gzip bzip2-devel ed gcc gcc-c++ gcc-gfortran \ - less libcurl-devel openssl openssl-devel readline-devel xz-devel \ - zlib-devel glibc-static zlib-static \ - && rm -rf /var/cache/yum - -# Graal VM -ENV GRAAL_VERSION 21.0.2 -ENV ARCHITECTURE aarch64 -ENV GRAAL_FILENAME graalvm-community-jdk-${GRAAL_VERSION}_linux-${ARCHITECTURE}_bin.tar.gz -RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${GRAAL_VERSION}/${GRAAL_FILENAME} | tar -xvz -RUN mv graalvm-community-openjdk-${GRAAL_VERSION}* /usr/lib/graalvm -ENV JAVA_HOME /usr/lib/graalvm - -# Maven -ENV MVN_VERSION 3.9.9 -ENV MVN_FOLDERNAME apache-maven-${MVN_VERSION} -ENV MVN_FILENAME apache-maven-${MVN_VERSION}-bin.tar.gz -RUN curl -4 -L https://archive.apache.org/dist/maven/maven-3/${MVN_VERSION}/binaries/${MVN_FILENAME} | tar -xvz -RUN mv $MVN_FOLDERNAME /usr/lib/maven -RUN ln -s /usr/lib/maven/bin/mvn /usr/bin/mvn - -# Gradle -ENV GRADLE_VERSION 7.4.1 -ENV GRADLE_FOLDERNAME gradle-${GRADLE_VERSION} -ENV GRADLE_FILENAME gradle-${GRADLE_VERSION}-bin.zip -RUN curl -LO https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip -RUN unzip gradle-${GRADLE_VERSION}-bin.zip -RUN mv $GRADLE_FOLDERNAME /usr/lib/gradle -RUN ln -s /usr/lib/gradle/bin/gradle /usr/bin/gradle - -VOLUME /project -WORKDIR /project - -WORKDIR /pet-store-native diff --git a/samples/springboot3/pet-store-native/README.md b/samples/springboot3/pet-store-native/README.md deleted file mode 100644 index 571d5619..00000000 --- a/samples/springboot3/pet-store-native/README.md +++ /dev/null @@ -1,38 +0,0 @@ -In this sample, you'll build a native GraalVM image for running web workloads in AWS Lambda. - - -## To build the sample - -You first need to build the function, then you will deploy it to AWS Lambda. - -Please note that the sample is for `x86` architectures. In case you want to build and run it on ARM, e.g. Apple Mac M1, M2, ... -you must change the according line in the `Dockerfile` to `ENV ARCHITECTURE aarch64`. -In addition, uncomment the `arm64` Architectures section in `template.yml`. - -### Step 1 - Build the native image - -Before starting the build, you must clone or download the code in **pet-store-native**. - -1. Change into the project directory: `samples/springboot3/pet-store-native` -2. Run the following to build a Docker container image which will include all the necessary dependencies to build the application - ``` - docker build -t al2023-graalvm21:native-web . - ``` -3. Build the application within the previously created build image - ``` - docker run -it -v `pwd`:`pwd` -w `pwd` -v ~/.m2:/root/.m2 al2023-graalvm21:native-web ./mvnw clean -Pnative package -DskipTests - ``` -4. After the build finishes, you need to deploy the function: - ``` - sam deploy --guided - ``` - -This will deploy your application and will attach an AWS API Gateway -Once the deployment is finished you should see the following: -``` -Key ServerlessWebNativeApi -Description URL for application -Value https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/pets -``` - -You can now simply execute GET on this URL and see the listing fo all pets. diff --git a/samples/springboot3/pet-store-native/mvnw b/samples/springboot3/pet-store-native/mvnw deleted file mode 100755 index 8d937f4c..00000000 --- a/samples/springboot3/pet-store-native/mvnw +++ /dev/null @@ -1,308 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.2.0 -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /usr/local/etc/mavenrc ] ; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "$(uname)" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin ; then - javaHome="$(dirname "\"$javaExecutable\"")" - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "\"$javaExecutable\"")" - fi - javaHome="$(dirname "\"$javaExecutable\"")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$(cd "$wdir/.." || exit 1; pwd) - fi - # end of workaround - done - printf '%s' "$(cd "$basedir" || exit 1; pwd)" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' < "$1" - fi -} - -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi -} - -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" -else - log "Couldn't find $wrapperJarPath, downloading it ..." - - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - fi - while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; - esac - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" - - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi - - if command -v wget > /dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; - esac -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - elif command -v shasum > /dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then - wrapperSha256Result=true - fi - else - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." - exit 1 - fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 - exit 1 - fi -fi - -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] && - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] && - CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/samples/springboot3/pet-store-native/mvnw.cmd b/samples/springboot3/pet-store-native/mvnw.cmd deleted file mode 100644 index f80fbad3..00000000 --- a/samples/springboot3/pet-store-native/mvnw.cmd +++ /dev/null @@ -1,205 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.2.0 -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B -) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% diff --git a/samples/springboot3/pet-store-native/pom.xml b/samples/springboot3/pet-store-native/pom.xml deleted file mode 100644 index 96044201..00000000 --- a/samples/springboot3/pet-store-native/pom.xml +++ /dev/null @@ -1,134 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.5 - - - com.amazonaws.serverless.sample - pet-store-native - 0.0.1-SNAPSHOT - pet-store-native - Sample of AWS with Spring Native - - 17 - - - - org.springframework.boot - spring-boot-starter - - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - [2.0.0-SNAPSHOT,),[2.0.0-M1,) - - - - org.crac - crac - runtime - - - com.amazonaws - aws-lambda-java-events - 3.15.0 - - - com.amazonaws - aws-lambda-java-core - 1.2.3 - provided - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - native - - - - org.springframework.boot - spring-boot-maven-plugin - - -agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image/ --enable-preview - - - - - org.graalvm.buildtools - native-maven-plugin - - - --enable-url-protocols=http - -march=compatibility - - - - - - build - - package - - - test - - test - - test - - - - - maven-assembly-plugin - - - native-zip - package - - single - - false - - - - - src/assembly/native.xml - - - - - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/assembly/java.xml b/samples/springboot3/pet-store-native/src/assembly/java.xml deleted file mode 100644 index bd4961b5..00000000 --- a/samples/springboot3/pet-store-native/src/assembly/java.xml +++ /dev/null @@ -1,31 +0,0 @@ - - java-zip - - zip - - - - - target/classes - / - - - src/shell/java - / - true - 0775 - - bootstrap - - - - - - /lib - false - runtime - - - \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/assembly/native.xml b/samples/springboot3/pet-store-native/src/assembly/native.xml deleted file mode 100644 index 9bd97a5b..00000000 --- a/samples/springboot3/pet-store-native/src/assembly/native.xml +++ /dev/null @@ -1,29 +0,0 @@ - - native-zip - - zip - - - - - src/shell/native - / - true - 0775 - - bootstrap - - - - target - / - true - 0775 - - pet-store-native - - - - \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java deleted file mode 100644 index bf53a01f..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/DemoApplication.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DemoApplication { - - public static void main(String[] args) throws Exception { - SpringApplication.run(DemoApplication.class, args); - } -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java deleted file mode 100644 index 2c3fcfb0..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/HelloController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class HelloController { - - public HelloController() { - System.out.println("Creating controller"); - } - - @GetMapping("/hello") - public String something(){ - return "Hello World"; - } -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java deleted file mode 100644 index 849286fe..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.controller; - - - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import com.amazonaws.serverless.sample.springboot3.model.Pet; -import com.amazonaws.serverless.sample.springboot3.model.PetData; - -import java.security.Principal; -import java.util.Optional; -import java.util.UUID; - - -@RestController -@EnableWebMvc -public class PetsController { - @PostMapping(path = "/pets") - public Pet createPet(@RequestBody Pet newPet) { - System.out.println("==> Creating Pet: " + newPet); - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @GetMapping(path = "/pets") - public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { - System.out.println("==> Listing Pets"); - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @GetMapping(path = "/pets/{petId}") - public Pet listPets() { - System.out.println("==> Listing Pets"); - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - return newPet; - } - -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java deleted file mode 100644 index d6ccae76..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - return; - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java deleted file mode 100644 index 320f2158..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -public class Error { - private String message; - - public Error(String errorMessage) { - message = errorMessage; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java deleted file mode 100644 index 4f0c4ba8..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -import java.util.Date; - - -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java deleted file mode 100644 index 68ea3c18..00000000 --- a/samples/springboot3/pet-store-native/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore b/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore deleted file mode 100644 index 0726bbaa..00000000 --- a/samples/springboot3/pet-store-native/src/main/resources/META-INF/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/native-image/ diff --git a/samples/springboot3/pet-store-native/src/main/resources/application.properties b/samples/springboot3/pet-store-native/src/main/resources/application.properties deleted file mode 100644 index 8b137891..00000000 --- a/samples/springboot3/pet-store-native/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/samples/springboot3/pet-store-native/src/shell/java/bootstrap b/samples/springboot3/pet-store-native/src/shell/java/bootstrap deleted file mode 100644 index 4586728a..00000000 --- a/samples/springboot3/pet-store-native/src/shell/java/bootstrap +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -cd ${LAMBDA_TASK_ROOT:-.} - -java -Dspring.main.web-application-type=none -Dlogging.level.org.springframework=DEBUG \ - -noverify -XX:TieredStopAtLevel=1 -Xss256K -XX:MaxMetaspaceSize=128M \ - -cp .:`echo lib/*.jar | tr ' ' :` com.amazonaws.serverless.sample.springboot3.DemoApplication \ No newline at end of file diff --git a/samples/springboot3/pet-store-native/src/shell/native/bootstrap b/samples/springboot3/pet-store-native/src/shell/native/bootstrap deleted file mode 100644 index 0156b090..00000000 --- a/samples/springboot3/pet-store-native/src/shell/native/bootstrap +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -cd ${LAMBDA_TASK_ROOT:-.} - -./pet-store-native -Dlogging.level.org.springframework=DEBUG -Dlogging.level.com.amazonaws.serverless.proxy.spring=DEBUG diff --git a/samples/springboot3/pet-store-native/template.yaml b/samples/springboot3/pet-store-native/template.yaml deleted file mode 100644 index dc05e1be..00000000 --- a/samples/springboot3/pet-store-native/template.yaml +++ /dev/null @@ -1,34 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Serverless Java Container GraalVM -Resources: - ServerlessWebNativeFunction: - Type: AWS::Serverless::Function - Properties: - MemorySize: 512 - FunctionName: pet-store-native - Timeout: 15 - CodeUri: ./target/pet-store-native-0.0.1-SNAPSHOT-native-zip.zip - Handler: NOP - Runtime: provided.al2023 -# If you want to build for ARM64 uncomment the following lines -# Architectures: -# - arm64 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL -Outputs: - ServerlessWebNativeApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: ServerlessWebNativeApi - \ No newline at end of file diff --git a/samples/springboot3/pet-store/README.md b/samples/springboot3/pet-store/README.md deleted file mode 100644 index fb3fab3b..00000000 --- a/samples/springboot3/pet-store/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Serverless Spring Boot 3 example -A basic pet store written with the [Spring Boot 3 framework](https://projects.spring.io/spring-boot/). The `StreamLambdaHandler` object is the main entry point for Lambda. - -The application can be deployed in an AWS account using the [Serverless Application Model](https://github.com/awslabs/serverless-application-model). The `template.yml` file in the root folder contains the application definition. - -## Pre-requisites -* [AWS CLI](https://aws.amazon.com/cli/) -* [SAM CLI](https://github.com/awslabs/aws-sam-cli) -* [Gradle](https://gradle.org/) or [Maven](https://maven.apache.org/) - -## Deployment -In a shell, navigate to the sample's folder and use the SAM CLI to build a deployable package -``` -$ sam build -``` - -This command compiles the application and prepares a deployment package in the `.aws-sam` sub-directory. - -To deploy the application in your AWS account, you can use the SAM CLI's guided deployment process and follow the instructions on the screen - -``` -$ sam deploy --guided -``` - -Once the deployment is completed, the SAM CLI will print out the stack's outputs, including the new application URL. You can use `curl` or a web browser to make a call to the URL - -``` -... ---------------------------------------------------------------------------------------------------------- -OutputKey-Description OutputValue ---------------------------------------------------------------------------------------------------------- -PetStoreApi - URL for application https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets ---------------------------------------------------------------------------------------------------------- - -$ curl https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/pets -``` \ No newline at end of file diff --git a/samples/springboot3/pet-store/build.gradle b/samples/springboot3/pet-store/build.gradle deleted file mode 100644 index 653135db..00000000 --- a/samples/springboot3/pet-store/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'java' - -repositories { - mavenLocal() - mavenCentral() - maven {url "https://repo.spring.io/milestone"} - maven {url "https://repo.spring.io/snapshot"} -} - -dependencies { - implementation ( - implementation('org.springframework.boot:spring-boot-starter-web:3.4.5') { - exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' - }, - 'com.amazonaws.serverless:aws-serverless-java-container-springboot3:[2.0-SNAPSHOT,)', - ) -} - -task buildZip(type: Zip) { - from compileJava - from processResources - into('lib') { - from(configurations.compileClasspath) { - exclude 'tomcat-embed-*' - } - } -} - -build.dependsOn buildZip diff --git a/samples/springboot3/pet-store/pom.xml b/samples/springboot3/pet-store/pom.xml deleted file mode 100644 index 4126ead7..00000000 --- a/samples/springboot3/pet-store/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ - - - 4.0.0 - - com.amazonaws.serverless.sample - serverless-springboot3-example - 2.0-SNAPSHOT - Spring Boot example for the aws-serverless-java-container library - Simple pet store written with the Spring framework and Spring Boot - https://aws.amazon.com/lambda/ - - - org.springframework.boot - spring-boot-starter-parent - 3.5.0 - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - 17 - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - - - - - com.amazonaws.serverless - aws-serverless-java-container-springboot3 - [2.0.0-SNAPSHOT,),[2.0.0-M1,) - - - - - - shaded-jar - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - - false - - - - package - - shade - - - - - org.apache.tomcat.embed:* - - - - - - - - - - - assembly-zip - - true - - - - - - org.apache.maven.plugins - maven-jar-plugin - 3.4.2 - - - default-jar - none - - - - - org.apache.maven.plugins - maven-install-plugin - 3.1.4 - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - 3.8.1 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - runtime - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.7.1 - - - zip-assembly - package - - single - - - ${project.artifactId}-${project.version} - - src${file.separator}assembly${file.separator}bin.xml - - false - - - - - - - - - - - diff --git a/samples/springboot3/pet-store/src/assembly/bin.xml b/samples/springboot3/pet-store/src/assembly/bin.xml deleted file mode 100644 index 1e085057..00000000 --- a/samples/springboot3/pet-store/src/assembly/bin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - lambda-package - - zip - - false - - - - ${project.build.directory}${file.separator}lib - lib - - tomcat-embed* - - - - - ${project.build.directory}${file.separator}classes - - ** - - ${file.separator} - - - \ No newline at end of file diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java deleted file mode 100644 index c576521f..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/Application.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - -import com.amazonaws.serverless.sample.springboot3.controller.PetsController; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.web.servlet.HandlerAdapter; -import org.springframework.web.servlet.HandlerExceptionResolver; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - - -@SpringBootApplication -@Import({ PetsController.class }) -public class Application { - - // silence console logging - @Value("${logging.level.root:OFF}") - String message = ""; - - /* - * Create required HandlerMapping, to avoid several default HandlerMapping instances being created - */ - @Bean - public HandlerMapping handlerMapping() { - return new RequestMappingHandlerMapping(); - } - - /* - * Create required HandlerAdapter, to avoid several default HandlerAdapter instances being created - */ - @Bean - public HandlerAdapter handlerAdapter() { - return new RequestMappingHandlerAdapter(); - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} \ No newline at end of file diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java deleted file mode 100644 index a65c6f1e..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/StreamLambdaHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3; - - -import com.amazonaws.serverless.exceptions.ContainerInitializationException; -import com.amazonaws.serverless.proxy.internal.testutils.Timer; -import com.amazonaws.serverless.proxy.model.AwsProxyRequest; -import com.amazonaws.serverless.proxy.model.AwsProxyResponse; -import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler; -import com.amazonaws.serverless.sample.springboot3.filter.CognitoIdentityFilter; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestStreamHandler; - -import jakarta.servlet.DispatcherType; -import jakarta.servlet.FilterRegistration; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.EnumSet; - - -public class StreamLambdaHandler implements RequestStreamHandler { - private static SpringBootLambdaContainerHandler handler; - static { - try { - handler = SpringBootLambdaContainerHandler.getAwsProxyHandler(Application.class); - - // we use the onStartup method of the handler to register our custom filter - handler.onStartup(servletContext -> { - FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); - registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); - }); - } catch (ContainerInitializationException e) { - // if we fail here. We re-throw the exception to force another cold start - e.printStackTrace(); - throw new RuntimeException("Could not initialize Spring Boot application", e); - } - } - - public StreamLambdaHandler() { - // we enable the timer for debugging. This SHOULD NOT be enabled in production. - Timer.enable(); - } - - @Override - public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) - throws IOException { - handler.proxyStream(inputStream, outputStream, context); - } -} diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java deleted file mode 100644 index 680e629d..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/controller/PetsController.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.controller; - - - -import com.amazonaws.serverless.sample.springboot3.model.Pet; -import com.amazonaws.serverless.sample.springboot3.model.PetData; - -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -import java.security.Principal; -import java.util.Optional; -import java.util.UUID; - - -@RestController -@EnableWebMvc -public class PetsController { - @RequestMapping(path = "/pets", method = RequestMethod.POST) - public Pet createPet(@RequestBody Pet newPet) { - if (newPet.getName() == null || newPet.getBreed() == null) { - return null; - } - - Pet dbPet = newPet; - dbPet.setId(UUID.randomUUID().toString()); - return dbPet; - } - - @RequestMapping(path = "/pets", method = RequestMethod.GET) - public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) { - int queryLimit = 10; - if (limit.isPresent()) { - queryLimit = limit.get(); - } - - Pet[] outputPets = new Pet[queryLimit]; - - for (int i = 0; i < queryLimit; i++) { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setName(PetData.getRandomName()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - outputPets[i] = newPet; - } - - return outputPets; - } - - @RequestMapping(path = "/pets/{petId}", method = RequestMethod.GET) - public Pet listPets() { - Pet newPet = new Pet(); - newPet.setId(UUID.randomUUID().toString()); - newPet.setBreed(PetData.getRandomBreed()); - newPet.setDateOfBirth(PetData.getRandomDoB()); - newPet.setName(PetData.getRandomName()); - return newPet; - } - -} diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java deleted file mode 100644 index d6ccae76..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/filter/CognitoIdentityFilter.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.amazonaws.serverless.sample.springboot3.filter; - - -import com.amazonaws.serverless.proxy.RequestReader; -import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.FilterConfig; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; - -import java.io.IOException; - - -/** - * Simple Filter implementation that looks for a Cognito identity id in the API Gateway request context - * and stores the value in a request attribute. The filter is registered with aws-serverless-java-container - * in the onStartup method from the {@link com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler} class. - */ -public class CognitoIdentityFilter implements Filter { - public static final String COGNITO_IDENTITY_ATTRIBUTE = "com.amazonaws.serverless.cognitoId"; - - private static Logger log = LoggerFactory.getLogger(CognitoIdentityFilter.class); - - @Override - public void init(FilterConfig filterConfig) - throws ServletException { - // nothing to do in init - } - - - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) - throws IOException, ServletException { - Object apiGwContext = servletRequest.getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY); - if (apiGwContext == null) { - log.warn("API Gateway context is null"); - filterChain.doFilter(servletRequest, servletResponse); - return; - } - if (!AwsProxyRequestContext.class.isAssignableFrom(apiGwContext.getClass())) { - log.warn("API Gateway context object is not of valid type"); - filterChain.doFilter(servletRequest, servletResponse); - } - - AwsProxyRequestContext ctx = (AwsProxyRequestContext)apiGwContext; - if (ctx.getIdentity() == null) { - log.warn("Identity context is null"); - filterChain.doFilter(servletRequest, servletResponse); - } - String cognitoIdentityId = ctx.getIdentity().getCognitoIdentityId(); - if (cognitoIdentityId == null || "".equals(cognitoIdentityId.trim())) { - log.warn("Cognito identity id in request is null"); - } - servletRequest.setAttribute(COGNITO_IDENTITY_ATTRIBUTE, cognitoIdentityId); - filterChain.doFilter(servletRequest, servletResponse); - } - - - @Override - public void destroy() { - // nothing to do in destroy - } -} diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java deleted file mode 100644 index 320f2158..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Error.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -public class Error { - private String message; - - public Error(String errorMessage) { - message = errorMessage; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java deleted file mode 100644 index 4f0c4ba8..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/Pet.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - -import java.util.Date; - - -public class Pet { - private String id; - private String breed; - private String name; - private Date dateOfBirth; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getBreed() { - return breed; - } - - public void setBreed(String breed) { - this.breed = breed; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getDateOfBirth() { - return dateOfBirth; - } - - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java b/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java deleted file mode 100644 index 68ea3c18..00000000 --- a/samples/springboot3/pet-store/src/main/java/com/amazonaws/serverless/sample/springboot3/model/PetData.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -package com.amazonaws.serverless.sample.springboot3.model; - - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - - -public class PetData { - private static List breeds = new ArrayList<>(); - static { - breeds.add("Afghan Hound"); - breeds.add("Beagle"); - breeds.add("Bernese Mountain Dog"); - breeds.add("Bloodhound"); - breeds.add("Dalmatian"); - breeds.add("Jack Russell Terrier"); - breeds.add("Norwegian Elkhound"); - } - - private static List names = new ArrayList<>(); - static { - names.add("Bailey"); - names.add("Bella"); - names.add("Max"); - names.add("Lucy"); - names.add("Charlie"); - names.add("Molly"); - names.add("Buddy"); - names.add("Daisy"); - names.add("Rocky"); - names.add("Maggie"); - names.add("Jake"); - names.add("Sophie"); - names.add("Jack"); - names.add("Sadie"); - names.add("Toby"); - names.add("Chloe"); - names.add("Cody"); - names.add("Bailey"); - names.add("Buster"); - names.add("Lola"); - names.add("Duke"); - names.add("Zoe"); - names.add("Cooper"); - names.add("Abby"); - names.add("Riley"); - names.add("Ginger"); - names.add("Harley"); - names.add("Roxy"); - names.add("Bear"); - names.add("Gracie"); - names.add("Tucker"); - names.add("Coco"); - names.add("Murphy"); - names.add("Sasha"); - names.add("Lucky"); - names.add("Lily"); - names.add("Oliver"); - names.add("Angel"); - names.add("Sam"); - names.add("Princess"); - names.add("Oscar"); - names.add("Emma"); - names.add("Teddy"); - names.add("Annie"); - names.add("Winston"); - names.add("Rosie"); - } - - public static List getBreeds() { - return breeds; - } - - public static List getNames() { - return names; - } - - public static String getRandomBreed() { - return breeds.get(ThreadLocalRandom.current().nextInt(0, breeds.size() - 1)); - } - - public static String getRandomName() { - return names.get(ThreadLocalRandom.current().nextInt(0, names.size() - 1)); - } - - public static Date getRandomDoB() { - GregorianCalendar gc = new GregorianCalendar(); - - int year = ThreadLocalRandom.current().nextInt( - Calendar.getInstance().get(Calendar.YEAR) - 15, - Calendar.getInstance().get(Calendar.YEAR) - ); - - gc.set(Calendar.YEAR, year); - - int dayOfYear = ThreadLocalRandom.current().nextInt(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR)); - - gc.set(Calendar.DAY_OF_YEAR, dayOfYear); - return gc.getTime(); - } -} diff --git a/samples/springboot3/pet-store/src/main/resources/logback.xml b/samples/springboot3/pet-store/src/main/resources/logback.xml deleted file mode 100644 index 14a3a84f..00000000 --- a/samples/springboot3/pet-store/src/main/resources/logback.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/samples/springboot3/pet-store/template.yml b/samples/springboot3/pet-store/template.yml deleted file mode 100644 index a8474349..00000000 --- a/samples/springboot3/pet-store/template.yml +++ /dev/null @@ -1,32 +0,0 @@ -AWSTemplateFormatVersion: '2010-09-09' -Transform: AWS::Serverless-2016-10-31 -Description: Example Pet Store API written with SpringBoot with the aws-serverless-java-container library - -Globals: - Api: - # API Gateway regional endpoints - EndpointConfiguration: REGIONAL - -Resources: - PetStoreFunction: - Type: AWS::Serverless::Function - Properties: - Handler: com.amazonaws.serverless.sample.springboot3.StreamLambdaHandler::handleRequest - Runtime: java21 - CodeUri: . - MemorySize: 1512 - Policies: AWSLambdaBasicExecutionRole - Timeout: 60 - Events: - HttpApiEvent: - Type: HttpApi - Properties: - TimeoutInMillis: 20000 - PayloadFormatVersion: '1.0' - -Outputs: - SpringBootPetStoreApi: - Description: URL for application - Value: !Sub 'https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/pets' - Export: - Name: SpringBootPetStoreApi From df448270ef384319eea031bb94936ebbdf9a9cbe Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 15 Jun 2026 20:54:32 +0000 Subject: [PATCH 1213/1214] chore: release - prepare release aws-serverless-java-container-3.0.2 --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index f3edfd4b..aefabd38 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index ef60040c..419c81c9 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 8fb9d67a..9e50fddf 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index 10e97715..b7686b0f 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.2-SNAPSHOT + 3.0.2 .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index f19504c1..abfc0382 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.2-SNAPSHOT + 3.0.2 maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.2 diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index dec94010..7612070c 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.2-SNAPSHOT + 3.0.2 maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.2 diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 9830c6e6..06d0ba53 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2-SNAPSHOT + 3.0.2 com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.2-SNAPSHOT + 3.0.2 maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.2 diff --git a/pom.xml b/pom.xml index cb32e8a4..1cf44200 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.2-SNAPSHOT + 3.0.2 AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - HEAD + aws-serverless-java-container-3.0.2 From 75822fea77d6bd2045c9cfad30d8e136122edec2 Mon Sep 17 00:00:00 2001 From: tobixlea Date: Mon, 15 Jun 2026 20:54:34 +0000 Subject: [PATCH 1214/1214] chore: release - prepare for next development iteration --- aws-serverless-java-container-core/pom.xml | 4 ++-- aws-serverless-java-container-jersey/pom.xml | 4 ++-- aws-serverless-java-container-spring/pom.xml | 4 ++-- aws-serverless-java-container-springboot4/pom.xml | 2 +- aws-serverless-jersey-archetype/pom.xml | 6 +++--- aws-serverless-spring-archetype/pom.xml | 6 +++--- aws-serverless-springboot4-archetype/pom.xml | 6 +++--- pom.xml | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml index aefabd38..feb8f587 100644 --- a/aws-serverless-java-container-core/pom.xml +++ b/aws-serverless-java-container-core/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Core Allows Java applications written for a servlet container to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT .. diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml index 419c81c9..b022eefe 100644 --- a/aws-serverless-java-container-jersey/pom.xml +++ b/aws-serverless-java-container-jersey/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Jersey implementation Allows Java applications written for Jersey to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT .. diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml index 9e50fddf..590f3c7c 100644 --- a/aws-serverless-java-container-spring/pom.xml +++ b/aws-serverless-java-container-spring/pom.xml @@ -6,12 +6,12 @@ AWS Serverless Java container support - Spring implementation Allows Java applications written for the Spring framework to run in AWS Lambda https://aws.amazon.com/lambda - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT .. diff --git a/aws-serverless-java-container-springboot4/pom.xml b/aws-serverless-java-container-springboot4/pom.xml index b7686b0f..cddeb7d7 100644 --- a/aws-serverless-java-container-springboot4/pom.xml +++ b/aws-serverless-java-container-springboot4/pom.xml @@ -3,7 +3,7 @@ aws-serverless-java-container com.amazonaws.serverless - 3.0.2 + 3.0.3-SNAPSHOT .. 4.0.0 diff --git a/aws-serverless-jersey-archetype/pom.xml b/aws-serverless-jersey-archetype/pom.xml index abfc0382..310041ca 100644 --- a/aws-serverless-jersey-archetype/pom.xml +++ b/aws-serverless-jersey-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-jersey-archetype - 3.0.2 + 3.0.3-SNAPSHOT maven-archetype AWS Serverless Jersey Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.2 + HEAD diff --git a/aws-serverless-spring-archetype/pom.xml b/aws-serverless-spring-archetype/pom.xml index 7612070c..669f5c20 100644 --- a/aws-serverless-spring-archetype/pom.xml +++ b/aws-serverless-spring-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-spring-archetype - 3.0.2 + 3.0.3-SNAPSHOT maven-archetype AWS Serverless Spring Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.2 + HEAD diff --git a/aws-serverless-springboot4-archetype/pom.xml b/aws-serverless-springboot4-archetype/pom.xml index 06d0ba53..a89b26e1 100644 --- a/aws-serverless-springboot4-archetype/pom.xml +++ b/aws-serverless-springboot4-archetype/pom.xml @@ -4,18 +4,18 @@ com.amazonaws.serverless aws-serverless-java-container - 3.0.2 + 3.0.3-SNAPSHOT com.amazonaws.serverless.archetypes aws-serverless-springboot4-archetype - 3.0.2 + 3.0.3-SNAPSHOT maven-archetype AWS Serverless Spring Boot 4 Archetype https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.2 + HEAD diff --git a/pom.xml b/pom.xml index 1cf44200..3bf29adb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.amazonaws.serverless aws-serverless-java-container pom - 3.0.2 + 3.0.3-SNAPSHOT AWS Serverless Java container A Java framework to run Spring, Spring Boot, Jersey, Spark, and Struts applications inside AWS Lambda https://github.com/aws/serverless-java-container @@ -37,7 +37,7 @@ https://github.com/aws/serverless-java-container scm:git:https://github.com/aws/serverless-java-container.git - aws-serverless-java-container-3.0.2 + HEAD