diff --git a/gxawsserverless/GXApplicationClasses.txt b/gxawsserverless/GXApplicationClasses.txt
index d3c59b5ca..954124b6b 100644
--- a/gxawsserverless/GXApplicationClasses.txt
+++ b/gxawsserverless/GXApplicationClasses.txt
@@ -1,3 +1,4 @@
com.gx.serverless.test.test_services_rest
com.gx.serverless.test.receivenumber_services_rest
+com.gx.serverless.test.sessionset_services_rest
com.genexus.serverless.proxy.test.jersey.EchoJerseyResource
\ No newline at end of file
diff --git a/gxawsserverless/pom.xml b/gxawsserverless/pom.xml
index 454db26b4..975ae5a7d 100644
--- a/gxawsserverless/pom.xml
+++ b/gxawsserverless/pom.xml
@@ -46,7 +46,7 @@
com.amazonaws.serverless
aws-serverless-java-container-jersey
- 1.6
+ 1.8.2
diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java
index 16a53717f..59ebf3cf7 100644
--- a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java
+++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/LambdaHandler.java
@@ -1,51 +1,45 @@
package com.genexus.cloud.serverless.aws;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.ws.rs.core.Application;
-
import com.amazonaws.serverless.proxy.RequestReader;
import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpServletResponse;
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
+import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext;
-import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap;
-import com.genexus.cloud.serverless.aws.handler.AwsGxServletResponse;
-import com.genexus.specific.java.Connect;
-import com.genexus.specific.java.LogManager;
-import com.genexus.webpanels.GXWebObjectStub;
-import org.glassfish.jersey.server.ResourceConfig;
-
import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
-import com.genexus.ApplicationContext;
+import com.genexus.cloud.serverless.aws.handler.AwsGxServletResponse;
+import com.genexus.cloud.serverless.aws.handler.LambdaApplicationHelper;
import com.genexus.diagnostics.core.ILogger;
-import com.genexus.util.IniFile;
-import com.genexus.webpanels.*;
+import com.genexus.specific.java.LogManager;
+import com.genexus.webpanels.GXOAuthAccessToken;
+import com.genexus.webpanels.GXOAuthLogout;
+import com.genexus.webpanels.GXOAuthUserInfo;
+import com.genexus.webpanels.GXWebObjectStub;
+import org.glassfish.jersey.server.ResourceConfig;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
-
public class LambdaHandler implements RequestHandler {
private static ILogger logger = null;
public static JerseyLambdaContainerHandler handler = null;
private static ResourceConfig jerseyApplication = null;
private static final String BASE_REST_PATH = "/rest/";
- private static final String GX_APPLICATION_CLASS = "GXApplication";
public LambdaHandler() throws Exception {
if (LambdaHandler.jerseyApplication == null) {
JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8");
- LambdaHandler.jerseyApplication = ResourceConfig.forApplication(initialize());
+ logger = LogManager.initialize(".", LambdaHandler.class);
+ LambdaHandler.jerseyApplication = ResourceConfig.forApplication(LambdaApplicationHelper.initialize());
if (jerseyApplication.getClasses().size() == 0) {
- String errMsg = "No endpoints found for this application";
- logger.error(errMsg);
- throw new Exception(errMsg);
+ logger.error("No HTTP endpoints found for this application");
}
LambdaHandler.handler = JerseyLambdaContainerHandler.getAwsProxyHandler(LambdaHandler.jerseyApplication);
}
@@ -61,7 +55,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c
dumpRequest(awsProxyRequest);
logger.debug("Before handle Request");
-
+
awsProxyRequest.setPath(path.replace(BASE_REST_PATH, "/"));
AwsProxyResponse response = this.handler.proxy(awsProxyRequest, context);
@@ -70,7 +64,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest awsProxyRequest, Context c
awsProxyRequest.setPath(path);
logger.debug("Trying servlet request: " + path);
AwsGxServletResponse servletResponse = handleServletRequest(awsProxyRequest, context);
- if (servletResponse.wasHandled()){
+ if (servletResponse.wasHandled()) {
response = servletResponse.getAwsProxyResponse();
}
}
@@ -166,27 +160,8 @@ private GXWebObjectStub resolveServlet(AwsProxyRequest awsProxyRequest) {
return handler;
}
- private static Application initialize() throws Exception {
- logger = LogManager.initialize(".", LambdaHandler.class);
- Connect.init();
- IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, "client.cfg", null);
- String className = config.getProperty("Client", "PACKAGE", null);
- Class> cls;
- try {
- cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS: String.format("%s.%s", className, GX_APPLICATION_CLASS));
- Application app = (Application) cls.getDeclaredConstructor().newInstance();
- ApplicationContext appContext = ApplicationContext.getInstance();
- appContext.setServletEngine(true);
- appContext.setServletEngineDefaultPath("");
- com.genexus.Application.init(cls);
- return app;
- } catch (Exception e) {
- logger.error("Failed to initialize App", e);
- throw e;
- }
- }
- private void dumpRequest(AwsProxyRequest awsProxyRequest){
+ private void dumpRequest(AwsProxyRequest awsProxyRequest) {
String lineSeparator = System.lineSeparator();
String reqData = String.format("Path: %s", awsProxyRequest.getPath()) + lineSeparator;
reqData += String.format("Method: %s", awsProxyRequest.getHttpMethod()) + lineSeparator;
diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java
new file mode 100644
index 000000000..0a77e67ab
--- /dev/null
+++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaApplicationHelper.java
@@ -0,0 +1,25 @@
+package com.genexus.cloud.serverless.aws.handler;
+
+import com.genexus.ApplicationContext;
+import com.genexus.specific.java.Connect;
+import com.genexus.util.IniFile;
+
+import javax.ws.rs.core.Application;
+
+public class LambdaApplicationHelper {
+ private static final String GX_APPLICATION_CLASS = "GXApplication";
+ private static final String GX_APPLICATION_CONFIG = "client.cfg";
+
+ public static Application initialize() throws Exception {
+ Connect.init();
+ IniFile config = com.genexus.ConfigFileFinder.getConfigFile(null, GX_APPLICATION_CONFIG, null);
+ String className = config.getProperty("Client", "PACKAGE", null);
+ Class> cls = Class.forName(className.isEmpty() ? GX_APPLICATION_CLASS : String.format("%s.%s", className, GX_APPLICATION_CLASS));
+ Application app = (Application) cls.getDeclaredConstructor().newInstance();
+ ApplicationContext appContext = ApplicationContext.getInstance();
+ appContext.setServletEngine(true);
+ appContext.setServletEngineDefaultPath("");
+ com.genexus.Application.init(cls);
+ return app;
+ }
+}
diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java
new file mode 100644
index 000000000..77b7e7693
--- /dev/null
+++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/LambdaHttpApiHandler.java
@@ -0,0 +1,82 @@
+package com.genexus.cloud.serverless.aws.handler;
+
+import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import com.genexus.cloud.serverless.aws.LambdaHandler;
+import com.genexus.cloud.serverless.aws.handler.internal.GxJerseyLambdaContainerHandlerFactory;
+import com.genexus.diagnostics.core.ILogger;
+import com.genexus.specific.java.LogManager;
+import org.glassfish.jersey.server.ResourceConfig;
+
+import java.util.Map;
+
+public class LambdaHttpApiHandler implements RequestHandler {
+ private static final String BASE_REST_PATH = "/rest/";
+ public static JerseyLambdaContainerHandler handler = null;
+ private static ILogger logger = null;
+ private static ResourceConfig jerseyApplication = null;
+
+ public LambdaHttpApiHandler() throws Exception {
+ if (LambdaHttpApiHandler.jerseyApplication == null) {
+ JerseyLambdaContainerHandler.getContainerConfig().setDefaultContentCharset("UTF-8");
+ logger = LogManager.initialize(".", LambdaHandler.class);
+ LambdaHttpApiHandler.jerseyApplication = ResourceConfig.forApplication(LambdaApplicationHelper.initialize());
+
+ if (jerseyApplication.getClasses().size() == 0) {
+ logger.error("No HTTP endpoints found for this application");
+ }
+
+ handler = GxJerseyLambdaContainerHandlerFactory.getHttpApiV2ProxyHandler(LambdaHttpApiHandler.jerseyApplication);
+ }
+ }
+
+ @Override
+ public AwsProxyResponse handleRequest(HttpApiV2ProxyRequest awsProxyRequest, Context context) {
+ if (logger.isDebugEnabled()) {
+ dumpRequest(awsProxyRequest);
+ }
+
+ String path = awsProxyRequest.getRawPath();
+ prepareRequest(awsProxyRequest);
+
+ logger.debug("Before handle Request");
+
+ awsProxyRequest.setRawPath(path.replace(BASE_REST_PATH, "/"));
+ AwsProxyResponse response = handler.proxy(awsProxyRequest, context);
+
+ int statusCode = response.getStatusCode();
+ logger.debug("After handle Request - Status Code: " + statusCode);
+
+ if (statusCode >= 404 && statusCode <= 599) {
+ logger.warn(String.format("Request could not be handled (%d): %s", response.getStatusCode(), path));
+ }
+ return response;
+ }
+
+ private void prepareRequest(HttpApiV2ProxyRequest awsProxyRequest) {
+ Map headers = awsProxyRequest.getHeaders();
+
+ if (headers == null) {
+ return;
+ }
+
+ // In Jersey lambda context, the Referer Header has a special meaning. So we copy it to another Header.
+ String referer = headers.get("Referer");
+ if (referer != null && !referer.isEmpty()) {
+ headers.put("GX-Referer", referer);
+ }
+ }
+
+ private void dumpRequest(HttpApiV2ProxyRequest awsProxyRequest) {
+ String lineSeparator = System.lineSeparator();
+ String reqData = String.format("Path: %s", awsProxyRequest.getRawPath()) + lineSeparator;
+ reqData += String.format("Method: %s", awsProxyRequest.getRequestContext().getHttp().getMethod()) + lineSeparator;
+ reqData += String.format("QueryString: %s", awsProxyRequest.getRawQueryString()) + lineSeparator;
+ reqData += String.format("Body: %sn", awsProxyRequest.getBody()) + lineSeparator;
+ logger.debug(reqData);
+ }
+
+}
\ No newline at end of file
diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java
new file mode 100644
index 000000000..38154a38c
--- /dev/null
+++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxAwsHttpApiV2HttpServletRequestReader.java
@@ -0,0 +1,46 @@
+package com.genexus.cloud.serverless.aws.handler.internal;
+
+import com.amazonaws.serverless.exceptions.InvalidRequestEventException;
+import com.amazonaws.serverless.proxy.RequestReader;
+import com.amazonaws.serverless.proxy.internal.servlet.AwsHttpApiV2ProxyHttpServletRequest;
+import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
+import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
+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 GxAwsHttpApiV2HttpServletRequestReader 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);
+
+ AwsProxyRequestContext rContext = new AwsProxyRequestContext();
+ rContext.setRequestId(request.getRequestContext().getRequestId());
+ servletRequest.setAttribute(API_GATEWAY_CONTEXT_PROPERTY, rContext);
+ 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 extends HttpApiV2ProxyRequest> getRequestClass() {
+ return HttpApiV2ProxyRequest.class;
+ }
+}
diff --git a/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java
new file mode 100644
index 000000000..9ace4d926
--- /dev/null
+++ b/gxawsserverless/src/main/java/com/genexus/cloud/serverless/aws/handler/internal/GxJerseyLambdaContainerHandlerFactory.java
@@ -0,0 +1,24 @@
+package com.genexus.cloud.serverless.aws.handler.internal;
+
+import com.amazonaws.serverless.proxy.*;
+import com.amazonaws.serverless.proxy.internal.servlet.*;
+import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
+import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
+import com.amazonaws.serverless.proxy.model.HttpApiV2ProxyRequest;
+
+import javax.ws.rs.core.Application;
+
+public class GxJerseyLambdaContainerHandlerFactory {
+ public static JerseyLambdaContainerHandler getHttpApiV2ProxyHandler(Application jaxRsApplication) {
+ JerseyLambdaContainerHandler newHandler = new JerseyLambdaContainerHandler<>(
+ HttpApiV2ProxyRequest.class,
+ AwsProxyResponse.class,
+ new GxAwsHttpApiV2HttpServletRequestReader(),
+ new AwsProxyHttpServletResponseWriter(true),
+ new AwsHttpApiV2SecurityContextWriter(),
+ new AwsProxyExceptionHandler(),
+ jaxRsApplication);
+ newHandler.initialize();
+ return newHandler;
+ }
+}
diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java
new file mode 100644
index 000000000..25702a008
--- /dev/null
+++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsHttpApiProxyTest.java
@@ -0,0 +1,107 @@
+package com.genexus.serverless.proxy.test.jersey;
+
+import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
+import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
+import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
+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 com.genexus.cloud.serverless.aws.handler.LambdaHttpApiHandler;
+import com.genexus.specific.java.Connect;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class GeneXusAppAwsHttpApiProxyTest {
+ private static final String CUSTOM_HEADER_KEY = "x-custom-header";
+ private static final String CUSTOM_HEADER_VALUE = "my-custom-value";
+
+ private JerseyLambdaContainerHandler handler = null;
+ private static ObjectMapper objectMapper = new ObjectMapper();
+ private static Context lambdaContext = new MockLambdaContext();
+
+ private LambdaHttpApiHandler l;
+
+ @Before
+ public void setUpStreams() {
+ Connect.init();
+
+ try {
+ System.setProperty("LAMBDA_TASK_ROOT", ".");
+ l = new LambdaHttpApiHandler();
+ handler = LambdaHttpApiHandler.handler;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public GeneXusAppAwsHttpApiProxyTest() {
+
+ }
+
+ @Test
+ public void testGXDataProvider() {
+ HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test", "GET")
+ .queryString("Itemnumber", "9")
+ .json()
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .toHttpApiV2Request();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(200, output.getStatusCode());
+ assertEquals("{\"ItemId\":9,\"ItemName\":\"9 Item\"}", output.getBody());
+ }
+
+ @Test
+ public void testSessionSet() {
+ HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/SessionSet", "POST")
+ .body("{\"SessionName\":\"Name\",\"SessionValue\":\"SetValueSession\"}")
+ .json()
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .toHttpApiV2Request();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(200, output.getStatusCode());
+
+ }
+
+ @Test
+ public void testGXDataProviderWithParams() {
+ HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test/12", "GET")
+ .queryString("Itemnumber", "9")
+ .json()
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .toHttpApiV2Request();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(200, output.getStatusCode());
+ assertEquals("{\"ItemId\":12,\"ItemName\":\"12 Item\"}", output.getBody());
+ }
+
+ @Test
+ public void testGxMultiCall() {
+ HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/gxmulticall", "POST")
+ .queryString("", "receivenumber")
+ .body("[[\"5\"],[\"6\"]]")
+ .json()
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .toHttpApiV2Request();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(200, output.getStatusCode());
+ }
+
+ @Test
+ public void testUpload() {
+ HttpApiV2ProxyRequest request = new AwsProxyRequestBuilder("/Test/gxobject", "POST")
+ .body("iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAkFBMVEVHcEzxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzTxYzX////94Nf/+PX5vKj3oITybEH0flf708f6ybn96uP2lnbzdUz1iWb4qpH83NH+8ez4sZnxYzScvitNAAAAHXRSTlMAR/DQIvbKjAjcVQS2/Oet1kyRG0IphxbBoT9taYkD32YAAAQCSURBVHhevNKLlYQgEETRVuQrKOCwzpwJovLPbhNYXcHGm0HVedRkSl+9vuMyyhDkuMT3qr9pokdsLiuJP40qu416MkO2ABBwzObBUBdz+oy4ZPykmbhNekGF5Ye3iJdHNf8iLk6giUjEIQk0UwPdVTxu8YXuMDrgpqANNRssGNjWGk0Gk9x0QolgIxpKcBKMpKM6cwYzTTWMB7u1IoRdoAO100WbRRdxo0smi07sVLefn73wwW7RUfy3AyPQlTJ0avbobKVTGd1pOuHwAEeHisQDZKEDJuIRwlQF8Eus3egmDsMAADalP+L6B1zFlW2YtrCNsQ2//9uddDfJ0hqxJE7rPMFHQ5z45xBw0f+1BeNakAWgHwIAqDFuwMoG0GEfALAybUJGNoAj4vEsBtDOcAJKWwB272JAOT4JBVkDEJ/PQgAVo/yHXADYDUIAfc+Zlm4AxJc3GSAdxWBHAHYXEYA2ow/gCEDsfQDmT9CQDwCPVwGAHoBX4QdA7AUAPggQky8AP87eAIo5CPoDEN99ARwO80oCwOc3T0CVcxCSAPBz8AJwMNoLAByVPAD7r3s4EgPw8+IDiHJ+iAgBiP3JEcB7sA0CwNerG4Cf6CsZgNfNGbD+l4xSKAB+XB0B9IcvQgHAPioZk5StAOAalYx5WhoUgN3gAmgBIAkLQHw52QMigJhCA/D1Yg2gGDYhARyVbAELeAwK4KhkCXiCbBIA4s0OkEEdGsBvJQvAoYZ2GoA5gyPDOVxPA+AM7j5gCZUE4BKVzIAKIgnAJSqZAREkEwE4Kp3uARIoJwYgDvcAJZS6X6CERPc/kECkewoiqHTjQAXrKSMh0c+BqFW9C6iFWvc2rCHTfQ9k8Kj7InqCje6bcAExab6K6TdApJkXRACQamZGLadmOrlhxsmpTnb8K2h6fjuQT3oOK70KyZpLNDo1ooyLVPIqGXkAGi7TqdQJo5wLlSqV0j2XalVqxbSQFas59kiL1bDT6RfsZA0L7pjIGxZQaPSMCmnTin++vGkFy/n7humocyvonMobl5DO3TtOR+MT83bPqfFt33/lXFJALRhgCDFBUcamEY75Zkho5z3E0g+HqYZYoKG55ojoQXmQKXOaJQwPWOaWw2zhAX+Lt6MUhkEgiqJjIo44gIZYlZA9uP/dFSjFr6bFaN/ZgPgjAu++PmIP+JzvAtfpEl0RD550kjWYUWuTA2bWix8246fdzR4w4/YmG8y8v7EeGziQjH+REjZyWVxH5rOOzHywoRML9YljUq+Dutl0P3ZLFpr7eU13KVO7mUgjbKbz+A0bvR40kk6g7LcR9Xv4rISmEMWhfhE4Cs2UHZflw80Lu0x/odXJvqzv/H8tnk+1U48n5FeadykPy1kAAAAASUVORK5CYII=")
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .toHttpApiV2Request();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(201, output.getStatusCode());
+ }
+
+}
diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java
index 797992e31..02776cad3 100644
--- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java
+++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/GeneXusAppAwsProxyTest.java
@@ -18,10 +18,8 @@
import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
-import com.amazonaws.serverless.proxy.test.jersey.model.MapResponseModel;
-import com.amazonaws.serverless.proxy.test.jersey.model.SingleValueModel;
+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 com.genexus.cloud.serverless.aws.LambdaHandler;
import com.genexus.specific.java.Connect;
@@ -30,8 +28,6 @@
import org.junit.Ignore;
import org.junit.Test;
-import java.io.IOException;
-
import static org.junit.Assert.*;
/**
@@ -82,6 +78,19 @@ public void testGXDataProvider() {
assertEquals("{\"ItemId\":9,\"ItemName\":\"9 Item\"}", output.getBody());
}
+ @Test
+ public void testSessionSet() {
+ AwsProxyRequest request = new AwsProxyRequestBuilder("/SessionSet", "POST")
+ .body("{\"SessionName\":\"Name\",\"SessionValue\":\"SetValueSession\"}")
+ .json()
+ .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
+ .build();
+
+ AwsProxyResponse output = handler.proxy(request, lambdaContext);
+ assertEquals(200, output.getStatusCode());
+
+ }
+
@Test
public void testGXDataProviderWithParams() {
AwsProxyRequest request = new AwsProxyRequestBuilder("/Test/12", "GET")
diff --git a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java
index ce572407f..4f4164441 100644
--- a/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java
+++ b/gxawsserverless/src/test/java/com/genexus/serverless/proxy/test/jersey/JerseyAwsProxyTest.java
@@ -17,18 +17,14 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
-import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import com.genexus.specific.java.Connect;
-import com.genexus.webpanels.GXObjectUploadServices;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Test;
import com.amazonaws.serverless.proxy.internal.testutils.AwsProxyRequestBuilder;
import com.amazonaws.serverless.proxy.internal.testutils.MockLambdaContext;
-import com.amazonaws.serverless.proxy.internal.servlet.*;
import com.amazonaws.serverless.proxy.jersey.JerseyLambdaContainerHandler;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
@@ -40,13 +36,6 @@
import com.genexus.cloud.serverless.aws.LambdaHandler;
import org.junit.*;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Enumeration;
-import java.util.concurrent.CountDownLatch;
-import javax.servlet.*;
-
/**
* Unit test class for the Jersey AWS_PROXY default implementation
*/
diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java b/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java
index 854fa68d9..1239caa71 100644
--- a/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java
+++ b/gxawsserverless/src/test/java/com/gx/serverless/test/GXApplication.java
@@ -1,11 +1,3 @@
-/*
- File: GXApplication
- Description: No description for object
- Author: GeneXus Java Generator version 15_0_11-123400
- Generated on: July 19, 2018 16:10:34.62
- Program type: Callable routine
- Main DBMS: SQL Server
-*/
package com.gx.serverless.test;
import java.util.*;
diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java b/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java
index 07c1321fb..2e686dc3a 100644
--- a/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java
+++ b/gxawsserverless/src/test/java/com/gx/serverless/test/GXcfg.java
@@ -1,19 +1,6 @@
-/*
- File: GXcfg
- Description: No description for object
- Author: GeneXus Java Generator version 15_0_11-123400
- Generated on: July 19, 2018 16:10:34.58
- Program type: Callable routine
- Main DBMS: SQL Server
-*/
package com.gx.serverless.test;
-import com.gx.serverless.*;
import com.genexus.*;
-import com.genexus.db.*;
-import com.genexus.search.*;
-
-import java.sql.*;
public final class GXcfg {
public static int strcmp(String Left,
diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java
new file mode 100644
index 000000000..a0ae31a01
--- /dev/null
+++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset.java
@@ -0,0 +1,64 @@
+package com.gx.serverless.test;
+
+import com.genexus.*;
+
+public final class sessionset extends GXProcedure
+{
+ public sessionset( int remoteHandle )
+ {
+ super( remoteHandle , new ModelContext( sessionset.class ), "" );
+ }
+
+ public sessionset( int remoteHandle ,
+ ModelContext context )
+ {
+ super( remoteHandle , context, "" );
+ }
+
+ public void execute( String aP0 ,
+ String aP1 )
+ {
+ execute_int(aP0, aP1);
+ }
+
+ private void execute_int( String aP0 ,
+ String aP1 )
+ {
+ sessionset.this.AV8SessionName = aP0;
+ sessionset.this.AV9SessionValue = aP1;
+ initialize();
+ /* GeneXus formulas */
+ /* Output device settings */
+ privateExecute();
+ }
+
+ private void privateExecute( )
+ {
+ AV10WebSession.setValue(AV8SessionName, AV9SessionValue);
+ cleanup();
+ }
+
+ protected void cleanup( )
+ {
+ CloseOpenCursors();
+ exitApp();
+ }
+
+ protected void CloseOpenCursors( )
+ {
+ }
+
+ /* Aggregate/select formulas */
+ public void initialize( )
+ {
+ AV10WebSession = httpContext.getWebSession();
+ /* GeneXus formulas. */
+ Gx_err = (short)(0) ;
+ }
+
+ private short Gx_err ;
+ private String AV8SessionName ;
+ private String AV9SessionValue ;
+ private com.genexus.webpanels.WebSession AV10WebSession ;
+}
+
diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java
new file mode 100644
index 000000000..dd72eb9ee
--- /dev/null
+++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_RESTInterfaceIN.java
@@ -0,0 +1,68 @@
+package com.gx.serverless.test;
+import com.genexus.*;
+import com.fasterxml.jackson.annotation.*;
+
+@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.NONE)
+@javax.xml.bind.annotation.XmlType(name = "sessionset_RESTInterfaceIN", namespace ="http://tempuri.org/")
+@JsonPropertyOrder(alphabetic=true)
+@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE, getterVisibility=JsonAutoDetect.Visibility.NONE, isGetterVisibility=JsonAutoDetect.Visibility.NONE)
+public final class sessionset_RESTInterfaceIN
+{
+ String AV8SessionName;
+ @JsonProperty("SessionName")
+ public String getSessionName( )
+ {
+ if ( GXutil.strcmp(AV8SessionName, null) == 0 )
+ {
+ return "" ;
+ }
+ else
+ {
+ return AV8SessionName ;
+ }
+ }
+
+ @JsonProperty("SessionName")
+ public void setSessionName( String Value )
+ {
+ if ( Value == null )
+ {
+ AV8SessionName = "" ;
+ }
+ else
+ {
+ AV8SessionName= Value;
+ }
+ }
+
+
+ String AV9SessionValue;
+ @JsonProperty("SessionValue")
+ public String getSessionValue( )
+ {
+ if ( GXutil.strcmp(AV9SessionValue, null) == 0 )
+ {
+ return "" ;
+ }
+ else
+ {
+ return AV9SessionValue ;
+ }
+ }
+
+ @JsonProperty("SessionValue")
+ public void setSessionValue( String Value )
+ {
+ if ( Value == null )
+ {
+ AV9SessionValue = "" ;
+ }
+ else
+ {
+ AV9SessionValue= Value;
+ }
+ }
+
+
+}
+
diff --git a/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java
new file mode 100644
index 000000000..4e4323fe4
--- /dev/null
+++ b/gxawsserverless/src/test/java/com/gx/serverless/test/sessionset_services_rest.java
@@ -0,0 +1,51 @@
+package com.gx.serverless.test;
+
+import com.genexus.*;
+import com.genexus.ws.rs.core.*;
+
+@javax.ws.rs.Path("/SessionSet")
+public final class sessionset_services_rest extends GxRestService
+{
+ @javax.ws.rs.POST
+ @javax.ws.rs.Consumes({javax.ws.rs.core.MediaType.APPLICATION_JSON})
+ @javax.ws.rs.Produces({javax.ws.rs.core.MediaType.APPLICATION_JSON + ";charset=UTF-8"})
+ public javax.ws.rs.core.Response execute( com.gx.serverless.test.sessionset_RESTInterfaceIN entity ) throws Exception
+ {
+ super.init( "POST" );
+ String AV8SessionName;
+ AV8SessionName = entity.getSessionName() ;
+ String AV9SessionValue;
+ AV9SessionValue = entity.getSessionValue() ;
+ if ( ! processHeaders("sessionset",myServletRequestWrapper,myServletResponseWrapper) )
+ {
+ builder = Response.notModifiedWrapped();
+ cleanup();
+ return (javax.ws.rs.core.Response) builder.build() ;
+ }
+ try
+ {
+ com.gx.serverless.test.sessionset worker = new com.gx.serverless.test.sessionset(remoteHandle, context);
+ worker.execute(AV8SessionName,AV9SessionValue );
+ builder = Response.okWrapped();
+ cleanup();
+ return (javax.ws.rs.core.Response) builder.build() ;
+ }
+ catch ( Exception e )
+ {
+ cleanup();
+ throw e;
+ }
+ }
+
+ protected boolean IntegratedSecurityEnabled( )
+ {
+ return false;
+ }
+
+ protected int IntegratedSecurityLevel( )
+ {
+ return 0;
+ }
+
+}
+