diff --git a/lambda-http/src/request.rs b/lambda-http/src/request.rs index d4770dd6..d6b0678d 100644 --- a/lambda-http/src/request.rs +++ b/lambda-http/src/request.rs @@ -76,21 +76,24 @@ fn into_api_gateway_v2_request(ag: ApiGatewayV2httpRequest) -> http::Request path, + Some(host) => { + let scheme = ag + .headers + .get(x_forwarded_proto()) + .and_then(|s| s.to_str().ok()) + .unwrap_or("https"); + format!("{}://{}{}", scheme, host, path) + } + }; if let Some(query) = ag.raw_query_string { url.push('?'); url.push_str(&query); @@ -199,18 +202,20 @@ fn into_alb_request(alb: AlbTargetGroupRequest) -> http::Request { let builder = http::Request::builder() .uri({ - let scheme = alb - .headers - .get(x_forwarded_proto()) - .and_then(|s| s.to_str().ok()) - .unwrap_or("https"); - let host = alb - .headers - .get(http::header::HOST) - .and_then(|s| s.to_str().ok()) - .unwrap_or_default(); + let host = alb.headers.get(http::header::HOST).and_then(|s| s.to_str().ok()); + + let mut url = match host { + None => raw_path.clone(), + Some(host) => { + let scheme = alb + .headers + .get(x_forwarded_proto()) + .and_then(|s| s.to_str().ok()) + .unwrap_or("https"); + format!("{}://{}{}", scheme, host, &raw_path) + } + }; - let mut url = format!("{}://{}{}", scheme, host, &raw_path); if !alb.multi_value_query_string_parameters.is_empty() { url.push('?'); url.push_str(&alb.multi_value_query_string_parameters.to_query_string()); @@ -625,4 +630,20 @@ mod tests { assert_eq!(req.method(), "GET"); assert_eq!(req.uri(), "/test/test/hello?name=me"); } + + #[test] + fn deserialize_alb_no_host() { + // generated from ALB health checks + let input = include_str!("../tests/data/alb_no_host.json"); + let result = from_str(input); + assert!( + result.is_ok(), + "event was not parsed as expected {:?} given {}", + result, + input + ); + let req = result.expect("failed to parse request"); + assert_eq!(req.method(), "GET"); + assert_eq!(req.uri(), "/v1/health/"); + } } diff --git a/lambda-http/tests/data/alb_no_host.json b/lambda-http/tests/data/alb_no_host.json new file mode 100644 index 00000000..1e5ad01f --- /dev/null +++ b/lambda-http/tests/data/alb_no_host.json @@ -0,0 +1,17 @@ +{ + "body": "", + "headers": { + "user-agent": "ELB-HealthChecker/2.0" + }, + "httpMethod": "GET", + + "isBase64Encoded": false, + + "path": "/v1/health/", + "queryStringParameters": {}, + "requestContext": { + "elb": { + "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:111111111:targetgroup/cdn-ingestor-tg-usea1-dev/3fe2aca58c0da101" + } + } +} \ No newline at end of file