diff --git a/lambda-http/src/response.rs b/lambda-http/src/response.rs index c1b48ef2..6a31cb79 100644 --- a/lambda-http/src/response.rs +++ b/lambda-http/src/response.rs @@ -69,8 +69,8 @@ impl LambdaResponse { body, is_base64_encoded, status_code: status_code as i64, - // explicitly empty, as API gateway does not properly merge headers and - // multi-value-headers, resulting in duplicate headers + // Explicitly empty, as API gateway v1 will merge "headers" and + // "multi_value_headers" fields together resulting in duplicate response headers. headers: HeaderMap::new(), multi_value_headers: headers, }), @@ -93,10 +93,10 @@ impl LambdaResponse { is_base64_encoded, status_code: status_code as i64, cookies, - // explicitly empty, as API gateway does not properly merge headers and - // multi-value-headers, resulting in duplicate headers - headers: HeaderMap::new(), - multi_value_headers: headers, + // API gateway v2 doesn't have "multi_value_headers" field. Duplicate headers + // are combined with commas and included in the headers field. + headers, + multi_value_headers: HeaderMap::new(), }) } #[cfg(feature = "alb")] @@ -104,10 +104,9 @@ impl LambdaResponse { body, status_code: status_code as i64, is_base64_encoded, - // ALB responses are used for ALB integrations as well as - // Lambda Function URLs. The former uses the `multi_value_headers` field, - // while the later uses the `headers` field. We need to return - // both fields to ensure both integrations work correctly. + // ALB responses are used for ALB integration, which can be configured to use + // either "headers" or "multi_value_headers" field. We need to return both fields + // to ensure both configuration work correctly. headers: headers.clone(), multi_value_headers: headers, status_description: Some(format!( @@ -121,8 +120,8 @@ impl LambdaResponse { body, is_base64_encoded, status_code: status_code as i64, - // explicitly empty, as API gateway does not properly merge headers and - // multi-value-headers, resulting in duplicate headers + // Explicitly empty, as API gateway v1 will merge "headers" and + // "multi_value_headers" fields together resulting in duplicate response headers. headers: HeaderMap::new(), multi_value_headers: headers, }), @@ -475,7 +474,7 @@ mod tests { let json = serde_json::to_string(&response).expect("failed to serialize to json"); assert_eq!( json, - r#"{"statusCode":200,"headers":{},"multiValueHeaders":{"content-encoding":["gzip"]},"body":"MDAwMDAw","isBase64Encoded":true,"cookies":[]}"# + r#"{"statusCode":200,"headers":{"content-encoding":"gzip"},"multiValueHeaders":{},"body":"MDAwMDAw","isBase64Encoded":true,"cookies":[]}"# ) } @@ -493,7 +492,7 @@ mod tests { let json = serde_json::to_string(&response).expect("failed to serialize to json"); assert_eq!( json, - r#"{"statusCode":200,"headers":{},"multiValueHeaders":{"content-type":["application/json"]},"body":"000000","isBase64Encoded":false,"cookies":[]}"# + r#"{"statusCode":200,"headers":{"content-type":"application/json"},"multiValueHeaders":{},"body":"000000","isBase64Encoded":false,"cookies":[]}"# ) } @@ -511,7 +510,7 @@ mod tests { let json = serde_json::to_string(&response).expect("failed to serialize to json"); assert_eq!( json, - r#"{"statusCode":200,"headers":{},"multiValueHeaders":{"content-type":["application/json; charset=utf-16"]},"body":"〰〰〰","isBase64Encoded":false,"cookies":[]}"# + r#"{"statusCode":200,"headers":{"content-type":"application/json; charset=utf-16"},"multiValueHeaders":{},"body":"〰〰〰","isBase64Encoded":false,"cookies":[]}"# ) } @@ -529,7 +528,7 @@ mod tests { let json = serde_json::to_string(&response).expect("failed to serialize to json"); assert_eq!( json, - r#"{"statusCode":200,"headers":{},"multiValueHeaders":{"content-type":["application/graphql-response+json; charset=utf-16"]},"body":"〰〰〰","isBase64Encoded":false,"cookies":[]}"# + r#"{"statusCode":200,"headers":{"content-type":"application/graphql-response+json; charset=utf-16"},"multiValueHeaders":{},"body":"〰〰〰","isBase64Encoded":false,"cookies":[]}"# ) }