Skip to content

Headers not picked up for v1 payload format. #1229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
erikpragt-connectid opened this issue Jan 8, 2025 · 4 comments
Closed

Headers not picked up for v1 payload format. #1229

erikpragt-connectid opened this issue Jan 8, 2025 · 4 comments

Comments

@erikpragt-connectid
Copy link

erikpragt-connectid commented Jan 8, 2025

To help us debug your issue fill in the basic information below using the options provided

Serverless Java Container version: 2.1.0

Implementations: Spring Boot 3

Framework version: SpringBoot 3.3.3

Frontend service: ALB / Function URL

Deployment method: CDK

Scenario

We have a Spring Boot application deployed as an AWS Function. It uses Spring Security, and users Authorization headers to give access to the endpoints. We access this application through an ALB for production use, but for development we use a Function URL.

Expected behavior

We would expect that when we send HTTP Headers, these headers are picked up by the Spring application

Actual behavior

What we see instead, is that when using the Function URL, all works well, the header values are received by the application. However, when using the ALB route, it seems the headers are lost.

It seems the ALB is using v1 for the payload version, and the Function URL is using v2 for the payload version, causing a different execution path to be taken in the AwsSpringHttpProcessingUtils. It seems generateRequest2 is working well, but generateRequest1 seems to only set the headers when getMultiValueHeaders() are enabled? I haven't been able to find a reference where setHeaders() is used for the v1 payload version.

We've tried enabling MultiValueHeaders in the AWS target group, but when we did that, I think we ran into this issue: #1193, which hasn't been released yet, so we're a little bit stuck here.

Steps to reproduce

  1. Create a Java Spring application which prints headers
  2. Deploy it
  3. Access it through Function URL -> headers are printed
  4. Access it through ALB -> headers aren't printed (the headers seem to be empty)

This is what the payload looks like:

{
    "requestContext": {
        "elb": {
            "targetGroupArn": "arn:aws:elasticloadbalancing:ap-southeast-2:650349367615:targetgroup/eks-internal-audit-tg/66915fabe583273f"
        }
    },
    "httpMethod": "GET",
    "path": "/audit/v1/event-registrations/headers",
    "queryStringParameters": {},
    "headers": {
        "accept": "*/*",
        "custom-header": "TestHeader",
        "host": "api.internal.dev.connectid.com.au",
        "user-agent": "curl/8.7.1",
        "x-amzn-trace-id": "Root=1-677e191b-732189535eb8827449a7fda4",
        "x-forwarded-for": "10.10.1.49",
        "x-forwarded-port": "443",
        "x-forwarded-proto": "https"
    },
    "body": "",
    "isBase64Encoded": false
}

Full log output

I don't get a stacktrace when multivalue headers are disabled, but when I enable it, this is the output:

	
2025-01-08T17:02:38.299+11:00
{
    "timestamp": "2025-01-08T06:02:38.298Z",
    "message": "java.lang.NullPointerException: Cannot invoke \"com.amazonaws.serverless.proxy.model.SingleValueHeaders.get(Object)\" because the return value of \"com.amazonaws.serverless.proxy.model.AwsProxyRequest.getHeaders()\" is null: java.lang.IllegalStateException\njava.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke \"com.amazonaws.serverless.proxy.model.SingleValueHeaders.get(Object)\" because the return value of \"com.amazonaws.serverless.proxy.model.AwsProxyRequest.getHeaders()\" is null\n\tat com.amazonaws.serverless.proxy.spring.AwsSpringHttpProcessingUtils.generateHttpServletRequest(AwsSpringHttpProcessingUtils.java:97)\n\tat com.amazonaws.serverless.proxy.spring.SpringDelegatingLambdaContainerHandler.handleRequest(SpringDelegatingLambdaContainerHandler.java:68)\n\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)\n\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\nCaused by: java.lang.NullPointerException: Cannot invoke \"com.amazonaws.serverless.proxy.model.SingleValueHeaders.get(Object)\" because the return value of \"com.amazonaws.serverless.proxy.model.AwsProxyRequest.getHeaders()\" is null\n\tat com.amazonaws.serverless.proxy.spring.AwsSpringHttpProcessingUtils.generateRequest1(AwsSpringHttpProcessingUtils.java:129)\n\tat com.amazonaws.serverless.proxy.spring.AwsSpringHttpProcessingUtils.generateHttpServletRequest(AwsSpringHttpProcessingUtils.java:110)\n\tat com.amazonaws.serverless.proxy.spring.AwsSpringHttpProcessingUtils.generateHttpServletRequest(AwsSpringHttpProcessingUtils.java:95)\n\t... 3 more\n\n",
    "level": "ERROR",
    "AWSRequestId": "71321a47-f4ad-40f7-bf63-2e94c42f82d7"
}

I think that's caused by #1193, so if the fixed version could be released, it might solve our problems.

@erikpragt-connectid
Copy link
Author

PS: I checked out the source, made a testcase without multivalueheaders, and no headers are set, which is exactly what we're seeing in our setup.

@deki
Copy link
Collaborator

deki commented Jan 8, 2025

Hi Erik,
multivalueheaders are the way to go. I'll release a 2.1.1 version shortly.

@deki
Copy link
Collaborator

deki commented Jan 8, 2025

2.1.1 is now available on Maven Central.

@deki deki closed this as completed Jan 8, 2025
@erikpragt-connectid
Copy link
Author

@deki Awesome, that is great, thank your for the quick action!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants