From e0276457e25617e9d348576ebe5c027d49303abd Mon Sep 17 00:00:00 2001 From: ahmedomosanya Date: Thu, 6 Aug 2026 15:19:25 +0100 Subject: [PATCH] fix: forward single-value query params in awslambda MultiValueQueryStringParameters valuesToMultiMap only populated MultiValueQueryStringParameters with query keys that had more than one value; it skipped any key with a single value (len(value) == 1). The receiver (aws-lambda-go-api-proxy core/request.go) reads MultiValueQueryStringParameters exclusively once it is non-empty, so any request that carried at least one multi-value query parameter silently dropped every single-value parameter before it reached the Lambda. Include single-value params as 1-element slices (drop the len(value) == 1 condition) so every query key is forwarded, matching real AWS API Gateway semantics. Update Test_AWSLambdaMiddleware_InvokeBasic so the fixture expects the single-value keys alongside the multi-value ones, and add an assertion that no input query key is missing from the forwarded output. Signed-off-by: ahmedomosanya --- pkg/middlewares/awslambda/aws_lambda.go | 2 +- pkg/middlewares/awslambda/aws_lambda_test.go | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/middlewares/awslambda/aws_lambda.go b/pkg/middlewares/awslambda/aws_lambda.go index bff7c333551..c4af4b685ed 100644 --- a/pkg/middlewares/awslambda/aws_lambda.go +++ b/pkg/middlewares/awslambda/aws_lambda.go @@ -436,7 +436,7 @@ func valuesToMultiMap(i url.Values) map[string][]string { values := map[string][]string{} for name, val := range i { value, valid := valuesToStrings(val) - if !valid || len(value) == 1 { + if !valid { continue } diff --git a/pkg/middlewares/awslambda/aws_lambda_test.go b/pkg/middlewares/awslambda/aws_lambda_test.go index 64680efc391..32395d16482 100644 --- a/pkg/middlewares/awslambda/aws_lambda_test.go +++ b/pkg/middlewares/awslambda/aws_lambda_test.go @@ -107,7 +107,14 @@ func Test_AWSLambdaMiddleware_InvokeBasic(t *testing.T) { assert.Equal(t, http.MethodGet, lReq.HTTPMethod) assert.Equal(t, "/test/example/path", lReq.Path) assert.Equal(t, map[string]string{"a": "1", "b": "2"}, lReq.QueryStringParameters) - assert.Equal(t, map[string][]string{"c": {"3", "4"}, "d[]": {"5", "6"}}, lReq.MultiValueQueryStringParameters) + assert.Equal(t, map[string][]string{"a": {"1"}, "b": {"2"}, "c": {"3", "4"}, "d[]": {"5", "6"}}, lReq.MultiValueQueryStringParameters) + // Every inbound query key must reach the Lambda via one of the two forwarded maps; + // none may be silently dropped (regression guard for the single-value strip). + for _, key := range []string{"a", "b", "c", "d[]"} { + _, inSingle := lReq.QueryStringParameters[key] + _, inMulti := lReq.MultiValueQueryStringParameters[key] + assert.Truef(t, inSingle || inMulti, "query key %q missing from forwarded params", key) + } assert.Equal(t, map[string]string{"Content-Type": "application/json"}, lReq.Headers) assert.Equal(t, "This is the body", lReq.Body)