Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions java/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ repositories {

dependencies {
implementation (
'com.amazonaws.serverless:aws-serverless-java-container-core:1.8.2',
'javax.servlet.jsp:javax.servlet.jsp-api:2.3.1',
'javax.el:javax.el-api:3.0.0',
'com.amazonaws.serverless:aws-serverless-java-container-core:2.1.5',
'jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.1',
'jakarta.el:jakarta.el-api:5.0.1',
'com.amazonaws:aws-xray-recorder-sdk-core:2.15.3',
'com.amazonaws:aws-lambda-java-log4j2:1.6.0'
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@

import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
import com.amazonaws.serverless.proxy.model.RequestSource;

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.LocalDateTime;
import java.time.ZoneId;
Expand Down Expand Up @@ -78,7 +79,7 @@ public String format(ContainerRequestType servletRequest, ContainerResponseType
logLineBuilder.append(" ");

// %l
if (gatewayContext != null && req.getRequestSource() == AwsProxyRequest.RequestSource.API_GATEWAY) {
if (gatewayContext != null && req.getRequestSource() == RequestSource.API_GATEWAY) {
if (gatewayContext.getIdentity().getUserArn() != null) {
logLineBuilder.append(gatewayContext.getIdentity().getUserArn());
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import com.amazonaws.xray.entities.Subsegment;


import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
Expand All @@ -39,7 +39,7 @@ public static CFMLLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> getA
new AwsProxyHttpServletRequestReader(),
new AwsProxyHttpServletResponseWriter(),
new AwsProxySecurityContextWriter(),
new AwsProxyExceptionHandler()
new FuseLessExceptionHandler()
);
newHandler.setLogFormatter(new ApacheCombinedServletLogFormatter<>());

Expand Down Expand Up @@ -71,7 +71,7 @@ protected AwsHttpServletResponse getContainerResponse(HttpServletRequest request
protected void handleRequest(HttpServletRequest httpServletRequest, AwsHttpServletResponse httpServletResponse, Context lambdaContext)
throws Exception {

RequestWrapper req = new RequestWrapper((javax.servlet.http.HttpServletRequest)httpServletRequest);
RequestWrapper req = new RequestWrapper((jakarta.servlet.http.HttpServletRequest)httpServletRequest);
req.setAttribute("lambdaContext", lambdaContext);
Object seg = null;
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.foundeo.fuseless;

import javax.servlet.*;
import jakarta.servlet.*;
import java.util.Enumeration;

public class CFMLServletConfig implements javax.servlet.ServletConfig {
public class CFMLServletConfig implements jakarta.servlet.ServletConfig {
private ServletContext sc;

public CFMLServletConfig(ServletContext servletContext) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.foundeo.fuseless;

import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.model.Headers;

import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;

/**
* The Lambda runtime interrupts the request-handling thread's CountDownLatch.await() as a
* transient signal (not a container shutdown - the next request on the same container succeeds
* normally). AwsProxyExceptionHandler's default handling of this returns a 502 with
* Content-Type: application/json, which browsers render as a raw JSON blob and which HTML-expecting
* clients (e.g. Cypress cy.visit()) reject outright. Override just this case to return HTML instead.
*/
public class FuseLessExceptionHandler extends AwsProxyExceptionHandler {

private static final Headers HTML_HEADERS = new Headers();

static {
HTML_HEADERS.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML);
}

@Override
public AwsProxyResponse handle(Throwable ex) {
if (ex instanceof InterruptedException) {
Thread.currentThread().interrupt(); // restore interrupt status
StreamLambdaHandler.log("Request interrupted by Lambda runtime", ex);
return new AwsProxyResponse(503, HTML_HEADERS,
"<html><body><p>Service temporarily unavailable. Please refresh the page.</p></body></html>");
}
return super.handle(ex);
}
}
4 changes: 2 additions & 2 deletions java/src/main/java/com/foundeo/fuseless/RequestWrapper.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.foundeo.fuseless;

import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import jakarta.servlet.http.HttpServletRequest;

public class RequestWrapper extends HttpServletRequestWrapper {

Expand Down
70 changes: 44 additions & 26 deletions java/src/main/java/com/foundeo/fuseless/ServletContextWrapper.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.foundeo.fuseless;

import javax.servlet.*;
import javax.servlet.descriptor.JspConfigDescriptor;
import jakarta.servlet.*;
import jakarta.servlet.descriptor.JspConfigDescriptor;

import java.io.InputStream;
import java.net.MalformedURLException;
Expand Down Expand Up @@ -85,35 +85,11 @@ public RequestDispatcher getNamedDispatcher(String name) {
return this.servletContext.getNamedDispatcher(name);
}

@Override
@Deprecated
public Servlet getServlet(String name) throws ServletException {
return this.servletContext.getServlet(name);
}

@Override
@Deprecated
public Enumeration getServlets() {
return this.servletContext.getServlets();
}

@Override
@Deprecated
public Enumeration getServletNames() {
return this.servletContext.getServletNames();
}

@Override
public void log(String msg) {
this.servletContext.log(msg);
}

@Override
@Deprecated
public void log(Exception exception, String msg) {
this.servletContext.log(exception, msg);
}

@Override
public void log(String msg, Throwable throwable) {
this.servletContext.log(msg, throwable);
Expand Down Expand Up @@ -193,6 +169,12 @@ public ServletRegistration.Dynamic addServlet(String s, Class<? extends Servlet>
}


@Override
public ServletRegistration.Dynamic addJspFile(String s, String s1) {
return this.servletContext.addJspFile(s, s1);
}


@Override
public <T extends Servlet> T createServlet(Class<T> aClass) throws ServletException {
return this.servletContext.createServlet(aClass);
Expand Down Expand Up @@ -320,4 +302,40 @@ public String getVirtualServerName() {
}


@Override
public int getSessionTimeout() {
return this.servletContext.getSessionTimeout();
}


@Override
public void setSessionTimeout(int sessionTimeout) {
this.servletContext.setSessionTimeout(sessionTimeout);
}


@Override
public String getRequestCharacterEncoding() {
return this.servletContext.getRequestCharacterEncoding();
}


@Override
public void setRequestCharacterEncoding(String encoding) {
this.servletContext.setRequestCharacterEncoding(encoding);
}


@Override
public String getResponseCharacterEncoding() {
return this.servletContext.getResponseCharacterEncoding();
}


@Override
public void setResponseCharacterEncoding(String encoding) {
this.servletContext.setResponseCharacterEncoding(encoding);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import lucee.loader.servlet.CFMLServlet;
import lucee.loader.servlet.jakarta.CFMLServlet;

import com.amazonaws.services.lambda.runtime.LambdaRuntime;
import com.amazonaws.services.lambda.runtime.LambdaLogger;

import java.lang.StringBuilder;


import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.http.HttpServlet;
import java.io.*;

public class StreamLambdaHandler implements RequestStreamHandler {
Expand Down
20 changes: 15 additions & 5 deletions test.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash

if [[ !$LUCEE_VERSION ]]; then
LUCEE_VERSION=5.4.5.23
if [[ -z "$LUCEE_VERSION" ]]; then
LUCEE_VERSION=7.0.4.34
fi

if [ -f "java/jars/lucee-light-$LUCEE_VERSION.jar" ]; then
Expand Down Expand Up @@ -33,9 +33,19 @@ sam local start-api --port 3003 --debug &
SAM_PID=$!


#give it a chance to startup
echo -e "Sleeping for 5...\n"
sleep 5
echo "Waiting for SAM local to be ready..."
max_wait=60
elapsed=0
until curl -s -o /dev/null http://127.0.0.1:3003/ || [ $elapsed -ge $max_wait ]; do
sleep 2
elapsed=$((elapsed + 2))
done

if [ $elapsed -ge $max_wait ]; then
echo "SAM local did not start within ${max_wait}s"
kill $SAM_PID
exit 1
fi


echo "Running: http://127.0.0.1:3003/assert.cfm"
Expand Down
6 changes: 3 additions & 3 deletions test/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ repositories {

dependencies {
implementation (
'com.amazonaws.serverless:aws-serverless-java-container-core:1.8.2',
'javax.servlet.jsp:javax.servlet.jsp-api:2.3.1',
'javax.el:javax.el-api:3.0.0',
'com.amazonaws.serverless:aws-serverless-java-container-core:2.1.5',
'jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.1',
'jakarta.el:jakarta.el-api:5.0.1',
'com.amazonaws:aws-lambda-java-core:1.2.3',
'com.amazonaws:aws-lambda-java-log4j2:1.6.0'
)
Expand Down